原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html

原文链接2:https://www.cnblogs.com/hefee/p/3820610.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的局部空间 矩阵,两个矩阵是不一样的。

————————————————————————————————————————————————————————————

透视投影

 
OpenGL透视视锥体与NDC

在透视投影中,截棱锥体(观察坐标)中的3D点会被映射到立方体(NDC)中。x坐标的范围从[l,f]到[-1,1],y坐标的范围从[b,t]到[-1,1],z坐标的范围从[n,f]到[-1,1]。

注意,观察坐标为右手坐标系,NDC使用左右坐标系。也就是说,位于原点的照相机在观察坐标中看向-Z轴,而在NDC中看向+Z轴。因为glFrustum()只接收正的近平面与远平面距离值,我们需要在构建GL_PROJECTION矩阵时对他们取反。

【转】UNITY中相机空间,投影空间的正向问题的更多相关文章

  1. 介绍Unity中相机的投影矩阵与剪切图像、投影概念

    这篇作为上一篇的补充介绍,主要讲Unity里面的投影矩阵的问题: 上篇的链接写给VR手游开发小白的教程:(三)UnityVR插件CardboardSDKForUnity解析(二) 关于Unity中的C ...

  2. Unity中几种简单的相机跟随

    #unity中相机追随 固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.Collectio ...

  3. 浅谈unity中gamma空间和线性空间

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 很久没有写文章了,今天写一篇对gamma空间和线性空间的个人理解总结,在查阅和学习了各个资料后,算是一个个人笔记 ...

  4. [SQL_Server_Question]Msg 1105无法为数据库 'tempdb' 中的对象分配空间,因为 'PRIMARY' 文件组已满

    错误消息: Msg 1105, Level 17, State 2, Line 266Could not allocate space for object 'dbo.Large Object Sto ...

  5. Unity中Oculus分屏相机和普通相机一键切换

    Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...

  6. Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令

    Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令 ------------------------------------------------------------------ ...

  7. 无法为数据库中的对象分配空间,因为'PRIMARY'文件组已满

    用SQL Server2012,做数据保存时出错,错误信息:无法为数据库'***'中的对象'***'分配空间,因为'PRIMARY'文件组已满.请删除不需要的文件.删除文件组中的对象.将其他文件添加到 ...

  8. error C1002: 在第 2 遍中编译器的堆空间不足

    error C1002: 在第 2 遍中编译器的堆空间不足 fatal error C1083: Not enough space 打开VS2015 x64 x86 兼容工具命令提示符,在此命令行中再 ...

  9. c语言中堆栈和静态空间

    什么是堆空间.栈空间与静态空间 堆空间:由程序员自己分配空间,如malloc需要指定分配多少个多大的字节空间,不用的时候需要自己释放 栈空间:栈空间是由系统自动分配与释放,如int,char等大小都已 ...

随机推荐

  1. filebeat收集日志传输到Redis集群,logstash从Redis集群中拉取数据

    前提:已配置好Redis集群,并设置的有统一的访问密码 架构是filebeat-->redis集群-->logstash->elasticsearch,需要修改filebeat的输出 ...

  2. C#下载图片,用户选择保存路径

    Html代码 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></ti ...

  3. 【网络安全】telnet 登陆远程服务器

    • 实验环境:        a. Vmware 14 PRO        b. windows 7 x64 客户机        c. windows server 2008 R2 x64 服务器 ...

  4. 如何使用前端分页框架bootstrap paginator

    前端分页框架bootstrap paginator用于web前端页面快速实现美观大方的翻页功能.在实现交互良好的页面翻页功能时,往往还需要配合使用后端分页框架pagehelper.pagehelper ...

  5. json字符串和json对象

    在对接口的时候,需要对某些地方进行字符串拼接的操作 现在我需要的是让图表中只默认显示前三条数据, 我的思路是先循环取出来三条外的公司名字 //声明前三个公司之外的公司数组 var selectcomp ...

  6. 关于android studio从2.3升级到3.0以上可能会遇到的问题

    请参考链接: http://blog.csdn.net/hylczp/article/details/60137958 gradle-3.3-all网盘下载地址: 链接:http://pan.baid ...

  7. 关于ARM PC值

    PC值(Program Counter). ARM采用流水线来提高CPU的利用效率, 对于三级流水线, 一条汇编指令的执行包括 取值,  译码, 执行三个阶段. 当MOV指令的取指动作完毕后, 进入M ...

  8. Linux系统Tomcat进程使用shutdown无法关闭进程

    问题场景: 若在应用中启动了用户线程,在Linux系统Tomcat进程使用shutdown无法关闭进程. 解决方案: #1.在catalina.sh文件中添加CATALINA_PID [root@lo ...

  9. string::front

    char& front(); const char& front() const;功能:返回string对象的首个字符,可以改变它的值 #include <string># ...

  10. springboot-不同名称项目的 redis session共享

    引入JAR <dependency> <groupId>org.springframework.session</groupId> <artifactId&g ...