原文链接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. node(koa2)跨域与获取cookie

    欲做一个node 的网关服务,通过 cookie 做信息传递,选择框架 koa2,这里简单记录跨域处理以及 cookie 获取. 首先:解决跨域问题,使用 koa2-cros 来处理,跨域问题后端处理 ...

  2. centos部署LVS负载均衡直接路由DR模式

    环境: 在vm里开三个虚拟机 负载调度器:10.0.3.102 真实服务器1:10.0.3.103 真实服务器2:10.0.3.104 虚拟ip: 10.0.3.99 (用来飘移) 负载调度器上 if ...

  3. 实现一个名为Person的类和它的子类Employee,Manager是Employee的子类,设计一个方法add用于涨工资,普通员工一次能涨10%,经理能涨20%。

    1.实现一个名为Person的类和它的子类Employee,Manager是Employee的子类,设计一个方法add用于涨工资,普通员工一次能涨10%,经理能涨20%.具体要求如下:(1)Perso ...

  4. 为什么现在UML很少用了

    新霸哥发现UML在面向对象的设计中的需求,相关行为.一些体系结构的实现提供了一套综合完整的表示法,但是由于使用的人比较少,初学者不容易快速入门,所以就导致了UML不是那么的受欢迎. UML在开发中有什 ...

  5. 安装与学习laravel

    安装 composer cd /var/www/html curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/ ...

  6. aria2的安装与配置

    aria2安装 安装 epel 源: yum install epel-release 然后直接安装: yum install aria2 -y 配置 Aria2 创建目录与配置文件 这一步需要切换到 ...

  7. [工具] BurpSuite--快速生成CSRF POC

    我们使用工具分析出存在csrf漏洞时,可以快速生成这个请求的poc,下面我们来看看怎么快速生成 0x00 上图是通过proxy,点击action,选择上图的选项即可生成这个请求的CSRF Poc了 当 ...

  8. 清北学堂清华大学钟皓曦神仙讲课day3摘要

    ---恢复内容开始--- 今天全是DP awsl,真的好难 先从斐波那契开始: dp:满足有一个状态边界条件(f[0]=0,f[1]=1) 边界条件:不需要计算其他状态的值而可以直接得出的状态或者最底 ...

  9. Jmeter启动jmeter-server.bat 报java.io.FileNotFoundException:rmi_keystore.jks 解决方法

    解决方法:1.找到apache-jmeter-5.0\bin\jmeter.properties 2.修改server.rmi.ssl.disable=true (记得去除server.rmi.ssl ...

  10. strtok的使用

    /* strtok函数的使用 */ #include <stdio.h> #include <stdlib.h> #include <string.h> // 函数 ...