查看: 1104|回复: 1
打印 上一主题 下一主题

制作一个永远对着像机的背景

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-3-10 11:21:43 |只看该作者 |倒序浏览
制作一个永远对着像机的背景,可控制距离,给像机

// Copyright (c) 2010 Bob Berkebile

// Please direct any bugs/comments/suggestions to http://www.pixelplacement.com

//

// Permission is hereby granted, free of charge, to any person obtaining a copy

// of this software and associated documentation files (the "Software"), to deal

// in the Software without restriction, including without limitation the rights

// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

// copies of the Software, and to permit persons to whom the Software is

// furnished to do so, subject to the following conditions:

//

// The above copyright notice and this permission notice shall be included in

// all copies or substantial portions of the Software.

//

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

// THE SOFTWARE.
using UnityEngine;

using System.Collections;
public class Backdrop : MonoBehaviour

{

const string SHADER_CODE =

"Shader "UnlitAlpha"{" +

"roperties {" +

"_Color ("Color Tint (A = Opacity)", Color) = (1,1,1,1) " +

"_MainTex ("Texture (A = Transparency)", 2D) = """ +

"} " +

"SubShader { " +

"Tags {" +

"Queue = Transparent" +

"}" +

"ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass {" +

"SetTexture[_MainTex] {" +

"Combine texture * constant ConstantColor[_Color]" +

"}" +

"}" +

"}" +

"}";
public Texture2D image;

public float distance = 500;
GameObject backdrop;

Mesh mesh;

float prevDistance;

Vector3 prevRotation, prevPosition;

Texture2D prevImage;
void Start ()

{

//check that we are on a camera!

if(camera == null){

Debug.LogError("Backdrop must be used on a camera!");

Destroy(this);

return;

}
//create backdrop GameObject and components:

backdrop = new GameObject("Backdrop");

backdrop.AddComponent<MeshFilter>();

backdrop.AddComponent<MeshRenderer>();

backdrop.transform.parent = transform;
backdrop.renderer.material = new Material(SHADER_CODE);
mesh = backdrop.GetComponent<MeshFilter>().mesh;

mesh.vertices = CalcVerts();

mesh.uv = new Vector2[] {new Vector2(0,0), new Vector2(1,0), new Vector2(0,1), new Vector2(1,1)};

mesh.triangles = new int[] {1,0,3,3,0,2};
}
void Update(){
//reset texture if it has changed:

if( backdrop.renderer.material.mainTexture != image ){

backdrop.renderer.material.mainTexture = image;

}
//nothing needs to be recalculated if distance hasn't changed or a move/rotate was attempted on billboard moved without our permission:

if(distance == prevDistance &&

backdrop.transform.position == prevPosition &&

backdrop.transform.localEulerAngles == prevRotation

) return;
//error for attempting a backdrop placement beyond camera's far clip plane:

if(distance > camera.farClipPlane){

Debug.LogError("Backdrop's distance is further than the camera's far clip plane. Extend the camera's far clip plane or reduce the billboard's distance.");

return;

}
//error for attempting a backdrop placement before camera's near clip plane:

if(distance < camera.nearClipPlane){

Debug.LogError("Backdrop's distance is closer than the camera's near clip plane. Extend the distance or reduce the camera's near clip plane.");

return;

}
//set backdrop's placement:

backdrop.transform.position = transform.forward * distance;
//calculate mesh:

mesh.vertices = CalcVerts();

mesh.RecalculateNormals();
//readjust comparison values:

prevDistance = distance;

prevPosition = backdrop.transform.position;

prevRotation = backdrop.transform.localEulerAngles;

}
Vector3[] CalcVerts()

{

return new Vector3[] {

backdrop.transform.InverseTransformPoint(camera.ScreenToWorldPoint(new Vector3(0,0,distance))),

backdrop.transform.InverseTransformPoint(camera.ScreenToWorldPoint(new Vector3(Screen.width,0,distance))),

backdrop.transform.InverseTransformPoint(camera.ScreenToWorldPoint(new Vector3(0,Screen.height,distance))),

backdrop.transform.InverseTransformPoint(camera.ScreenToWorldPoint(new Vector3(Screen.width,Screen.height,distance)))

};

}

}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52352
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

沙发
发表于 2013-4-28 20:16:06 |只看该作者
这个很实用的样子,顶一个先
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-2 19:57 , Processed in 0.065823 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部