栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 游戏开发 > Unity3D

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

Unity3D 更新时间:发布时间: 百科书网 趣学号

交流讨论联系方式:微信: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:摄像机视图的位置和大小

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

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1070473.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号