unity, 相机空间 与 相机gameObject的局部空间

本文通过实验对比了Unity中相机空间与相机gameObject局部空间的区别。详细介绍了如何使用Camera.worldToCameraMatrix和Camera.transform.worldToLocalMatrix来转换坐标,并得出两者不重合的结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/wantnon/p/4570188.html

在unity里 相机空间 与 相机gameObject的局部空间 不重合。

Camera.worldToCameraMatrix的文档中有这样一句话:

Note that camera space matches OpenGL convention: camera's forward is the negative Z axis. This is different from Unity's convention, where forward is the positive Z axis.

 

意思是说unity中相机gameObject的蓝轴是相机空间的-Z。

为了确认,做了如下实验:

如图,立方体的坐标是(0,0,0),相机的坐标是(0,0,-3),我们要计算并输出立方体在相机空间的坐标。

做法是为立方体添加如下脚本:

using UnityEngine;
using System.Collections;
public class printPosInCameraSpace : MonoBehaviour {
    public GameObject m_cameraRef;
    // Use this for initialization
    void Start () {
        Matrix4x4 worldToCameraMat = m_cameraRef.GetComponent<Camera>().worldToCameraMatrix;
        Vector3 thisPosInWorld = transform.position;
        Vector3 thisPosInCamera = worldToCameraMat.MultiplyPoint (thisPosInWorld);
        Debug.Log (thisPosInCamera);
    }
}

并在编辑器中将camera赋给m_cameraRef.

然后运行脚本,得到输出结果为:(0,0,-3)。

这说明相机gameObject的蓝轴确实是相机空间-Z轴。

进一步实验:

将脚本改为:

using UnityEngine;
using System.Collections;
public class printPosInCameraGameObjectLocalSpace : MonoBehaviour {
    public GameObject m_cameraRef;
    // Use this for initialization
    void Start () {
        Matrix4x4 worldToCameraMat = m_cameraRef.transform.worldToLocalMatrix;
        Vector3 thisPosInWorld = transform.position;
        Vector3 thisPosInCamera = worldToCameraMat.MultiplyPoint (thisPosInWorld);
        Debug.Log (thisPosInCamera);
    }
}

输出结果为:(0,0,3)。

 

--结论:

相机空间 和 相机gameObject的局部空间 是不重合的。图中这三个坐标轴表示的是 相机gameObject的局部空间。 而 相机空间 则Z轴方向与之相反。

Camera.worldToCameraMatrix是 世界空间to相机空间 矩阵。Camera.transform.worldToLocalMatrix是 世界空间to相机gameObject的局部空间 矩阵,两个矩阵是不一样的。

### Unity相机配置教程 在 Unity 中,相机的配置可以通过多种方式完成。以下是关于如何通过特定方法来设置和优化相机的具体说明。 #### 创建并初始化 GameRig 对象 为了更好地控制摄像机的角度以及它场景之间的关系,可以创建一个空的游戏对象 `GameRig` 并对其进行旋转调整。将其 Rotation 设置为 `(40, 60, 0)` 后,将摄像机设为其子对象[^1]。这样做的好处在于能够利用父子级坐标系的关系简化后续操作。 ```csharp // 初始化 GameRig 和 Camera 的代码示例 GameObject gameRig = new GameObject("GameRig"); gameRig.transform.rotation = Quaternion.Euler(40f, 60f, 0f); Camera mainCamera = Camera.main; mainCamera.transform.parent = gameRig.transform; mainCamera.transform.localPosition = new Vector3(0f, 0f, -65f); ``` 上述代码片段展示了如何动态地构建这种结构,并确保摄像机始终处于适当的位置和方向。 #### 调整摄像机位置 为了让摄像机能提供最佳视角,在设定好父对象之后还需要进一步微调其局部位置至 `(0, 0, -65)` 处。这一步骤保证了玩家能够在游戏过程中获得清晰而舒适的视觉体验。 如果项目需求发生变化或者希望支持不同的设备分辨率,则可能需要引入额外逻辑来自适应这些变化情况下的显示效果。 #### 更新 CameraRig 组件 当涉及到更复杂的交互行为时(比如实时更新视图),则需修改默认存在的某些预置组件或添加新的自定义功能模块。例如删除原有的 `CameraControl` 组件并将之替换为我们自己开发出来的基于固定时间步长运行机制的新类——即 `HotUpdateBehaviourFixedUpdate` [^2] 。此过程允许开发者更加灵活精确地管理每一帧内的渲染流程及相关事件处理程序。 #### 武器系统的辅助瞄准设计 对于包含射击玩法的作品来说,除了基本的画面呈现外还经常需要用到一些特殊工具帮助用户精准定位目标点位。在此案例里提到过一种带有滑动条形式表现手法的设计方案 —— 黄色箭头 Slider ,尽管对其锚定参数尚未完全理解清楚但仍可探讨其实现原理的一部分内容 [^3]: - **Slider 功能概述**: 它主要用来指示当前准星所指向区域的大致范围及其强度等级; - **技术难点分析**: 如何正确绑定 UI 元素到三维空间中的实体部件之间存在一定的挑战性; 综上所述,以上便是有关于 unity camera setup 方面的知识要点介绍啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值