Unity常用类camera类-控制游戏中虚拟场景的展示(附带练习代码)(未更新完)

交流讨论联系方式:微信:okokokokok112233

camera以左下角为屏幕的(0,0)点坐标,以右上角为屏幕的(camer.pixelWidth,camera.pixelHeight)点坐标,如果用单位化方式显示,则左下角为(0,0)点,右上角为(1,1)点

实例属性

aspect设置摄像机视口比例
cameratoworldmatrix变换矩阵
cullingMask摄像机按层渲染
eventMask按层响应事件
layerCullDistances层消隐距离
layerCullSpherical圆形的啊
orthographic正交投影
pixelRect摄像机渲染区间
projectionMatrix自定义投影矩阵
rect
renderingPath
targetTexture
worldTocameraMatrix

涉及到的api

Matrix4x4

标准 4x4 变换矩阵。
MultiplyPoint按此矩阵变换位置(普通)。
Transform.RotateAround将变换围绕穿过世界坐标中的 point 的 axis 旋转 angle 度。

aspect设置摄像机视口比例

 当硬件显示屏的宽高比例与aspect的比例值不同时,视图将发生变形

public class Aspect_ts : MonoBehaviour
{Camera camera;private void Start(){   //camera,aspect的默认值即为当前硬件的aspect值camera=GetComponent();Debug.Log("camera.aspect的默认值:  "+camera.aspect);}private void OnGUI(){if (GUI.Button(new Rect(5.0f, 50.0f, 200.0f, 45.0f), "aspect=1.0f")){//重置当前摄像机的aspect值camera.ResetAspect();camera.aspect = 1.0f;}if (GUI.Button(new Rect(7.0f, 70.0f, 200.0f, 45.0f), "aspect=2.0f")){//重置当前摄像机的aspect值camera.ResetAspect();camera.aspect = 2.0f;}if (GUI.Button(new Rect(10.0f, 10.0f, 200.0f, 45.0f), "aspect还原默认值")){//重置当前摄像机的aspect值camera.ResetAspect();}}
}

cameratoworldmatrix变换矩阵

返回从摄像机的局部坐标系到世界坐标系的变换矩阵(只读)

forward方向是自身坐标系的-z轴方向,其他GameObject对象的forwa方向为自身坐标系z轴方向

public class CameraToWorkdMatrix_ts : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){ Camera camera = GetComponent();print("camera was rotated position:" + transform.position);Matrix4x4 m= camera.cameraToWorldMatrix;Vector3 v3 = m.MultiplyPoint(Vector3.forward * 5.0f);//为沿着camera局部坐标系的-z轴方向前移5个单位的位置在世界坐标系的中的位置Vector3 v4 = m.MultiplyPoint(transform.forward * 5.0f);//为沿着camera世界坐标系的-z轴方向前移5个单位的位置在世界坐标系的中的位置print("旋转前v3 " + v3);print("旋转前v4 " + v4);transform.Rotate(Vector3.up * 90.0f);Debug.Log("Camera旋转后的位置" + transform.position);m = camera.cameraToWorldMatrix;v3 = m.MultiplyPoint(Vector3.forward * 5.0f);//为沿着camera局部坐标系的-z轴方向前移5个单位的位置在世界坐标系的中的位置v4 = m.MultiplyPoint(transform.forward * 5.0f);//为沿着camera世界坐标系的-z轴方向前移5个单位的位置在世界坐标系的中的位置print("旋转后v3 " + v3);print("旋转后v4 " + v4);}

结果如下:

 cullingmask:摄像机按层渲染

此属性有选择的渲染部分物体,=_1渲染场景中的任何层物体,cullingMask=0,不渲染任何层

<<二进制 左移运算符

>>二进制右移运算符

public class CullingMask : MonoBehaviour
{ Camera camera;private void Awake(){camera = GetComponent();   }private void OnGUI(){//默认除了cullingmask=-1,渲染任何层if (GUI.Button(new Rect(10.0f,10.0f,200.0f,45.0f),"CullingMask=-1")){camera.cullingMask = -1;}//不渲染任何层if (GUI.Button(new Rect(10.0f, 60.0f, 200.0f, 45.0f), "CullingMask=0")){camera.cullingMask = 0;}//仅渲染第零层if (GUI.Button(new Rect(10.0f, 120.0f, 200.0f, 45.0f), "仅渲染第零层")){camera.cullingMask = 1<<0;}//仅渲染第八层if (GUI.Button(new Rect(10.0f, 240.0f, 200.0f, 45.0f), "仅渲染第八层")){camera.cullingMask = 1 << 8;}//渲染第八层和第零层if (GUI.Button(new Rect(10.0f, 320.0f, 200.0f, 45.0f), "渲染第八层和第零层")){camera.cullingMask = (1<<8)+2;}}
}

eventmask属性:按层响应事件

public class EventMask : MonoBehaviour
{bool is_rotate = false;public Camera c;public int eventMask_now = -1;public int layer_now;public int tp;public int ad;public string str = null;private void Update(){//记录当前对象的层,可以再程序运行时选择不同的层layer_now = gameObject.layer;//求2的layer_now次方的值tp = (int)Mathf.Pow(2.0f, layer_now);ad = eventMask_now & tp;c.eventMask = eventMask_now;print(is_rotate);if(is_rotate){transform.Rotate(Vector3.up * 15.0f * Time.deltaTime);}}//当鼠标左键按下时,物体开始旋转private void OnMouseDown(){is_rotate = true;}private void OnMouseUp(){is_rotate = false;}private void OnGUI(){GUI.Label(new Rect(10.0f, 10.0f, 200.0f, 45.0f), "当前对象的layer值为" + layer_now + ",2的layer次方的值为" + tp);GUI.Label(new Rect(10.0f, 60.0f, 200.0f, 45.0f), "当前摄像机eventmask值为" + eventMask_now);if(ad==tp){str = ",所以物体会相应方法";}else{str = ",不响应方法";}GUI.Label(new Rect(10.0f, 120.0f, 200.0f, 45.0f), "而当前eventmask与" + tp + "进行与运算的结果为" + ad + str);}
}

书里罗里吧嗦的说了一堆,我也没看懂这个逻辑到底是啥意思,看其他的帖子好像用<<>>也可以

layerculldistances属性:层消隐的距离

用来设置摄像机给予层的消隐距离

public class layerculldistance : MonoBehaviour
{Camera camera;// Start is called before the first frame updatepublic Transform cb1;void Start(){camera = GetComponent();//定义大小为32的一维数组,用来存储所有层的剔除距离float[] distances = new float[32];//设置第8层的剔除距离distances[8] = 20.0f;//将数据赋给摄像机的layerculldistancecamera.layerCullDistances = distances;}// Update is called once per framevoid Update(){//摄像机远离物体transform.Translate(-transform.forward * Time.deltaTime);}
}

layercullspherical 基于球面距离剔除

只要物体表面上有一点没有超出物体所在层的远视口平面物体就是可见的

当layercullspherical为true时,只要物体的世界坐标点position与摄像机的距离大于所在层的剔除距离物体就是不可见的

prohtctionmatrix 自定义投影矩阵

需要先用resetprohectionmatrix重置矩阵

public class projectionmatrix : MonoBehaviour
{Camera camera;public Transform sp, cb;public Matrix4x4 originalProjection;float q = 1f;float p = 5.5f;public  int which_change = 0;private void Start(){ camera = GetComponent();originalProjection = camera.projectionMatrix;}private void Update(){sp.RotateAround(cb.position, cb.up, 45.0f * Time.deltaTime);Matrix4x4 pr = originalProjection;switch (which_change) {case 0:pr.m11+= Mathf.Sin(Time.time * p) * q;break;case 1:pr.m01 += Mathf.Sin(Time.time * p) * q;break;case 2:pr.m10 += Mathf.Sin(Time.time * p) * q;break;case 3:pr.m02+= Mathf.Sin(Time.time * p) * q;break;case 4:pr.m03 += Mathf.Sin(Time.time * p) * q;break;}camera.projectionMatrix = pr;}public void buttonchange(){if (which_change < 4){camera.ResetProjectionMatrix();which_change++;}else{camera.ResetProjectionMatrix();which_change = 0;}}
}

rect:摄像机视图的位置和大小

使用单位化坐标系的方式来设置当前摄像机的视图位置和大小


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部