
交流讨论联系方式:微信: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 update
void 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 update
public Transform cb1;
void Start()
{
camera = GetComponent();
//定义大小为32的一维数组,用来存储所有层的剔除距离
float[] distances = new float[32];
//设置第8层的剔除距离
distances[8] = 20.0f;
//将数据赋给摄像机的layerculldistance
camera.layerCullDistances = distances;
}
// Update is called once per frame
void 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:摄像机视图的位置和大小
使用单位化坐标系的方式来设置当前摄像机的视图位置和大小