U3D屏幕空间到世界空间变换
using UnityEngine;
using System.Collections; public class FPSCam : MonoBehaviour { Vector3 lastPos;
Vector3 newPos;
Camera thisCamera;
void Start () {
thisCamera = GetComponent<Camera> ();
} void OnGUI(){
string strInfo = string.Format ("{0}, {1}, {2}", newPos.x, newPos.y, newPos.z);
GUI.Label (new Rect(, , , ), strInfo);
}
// Update is called once per frame
void Update () {
newPos = (Input.mousePosition);
newPos.z = 0.00001f; //thisCamera.nearClipPlane; //屏幕空间到世界空间的转换。应深刻理解三维变换过程:世界空间->相机空间->投影空间->屏幕空间。
//世界空间到相机空间通过viewMatrix来实现。vm可以直接通过相机的三个向量来组成,这三个向量是look, up, right。
//相机空间里以相机位置为原点,朝向Z轴正向,X向右,Y向上。
//相机空间到投影空间的变换是通过projectionMatrix实现,通过PM,将视锥压缩到一个边长为2的半立方体中,x(-1,1),y(-1,1),z(0,1)
//投影空间到屏幕空间的变换将投影半立方体的东西投影到二维平面上并作视口及屏幕坐标系变换。
//由此,屏幕空间到世界空间的转换是以上的逆过程。注意, 此变换需要传递一个相机空间的Z值,即相对于相机位置的Z。
//如:newPos =(x,y,0.1)表示将屏幕上点(x,y)转换到世界空间,深度为相机前方0.1
//注意:当newPos.z无限趋于0时,变换后的点在世界空间中就无限趋于相机位置。
newPos = thisCamera.ScreenToWorldPoint (newPos); lastPos = newPos;
} void FixedUpdate(){
//newPos = Input.mousePosition; }
}

相机的near, far都是相机空间的相对值,0表示相机位置处。
投影变换是将相机平截体压缩到一个边长为2的半立方体中,这个半立方体就是投影空间。
屏幕空间到世界空间转换时,首先要指定使用哪个相机,变换是绑定于相机的变换。
还需要指定一个Z值,因为一个屏幕点对应到世界空间是一条射线上的无数个点,
必须指定一个Z才能确定一个唯一点。这个Z值是相对相机位置的,
如果指定0,则屏幕上的任意点都会转换到同一点,即相机位置。
U3D屏幕空间到世界空间变换的更多相关文章
- 关于Unity3d的世界空间和本地空间的一点思考
最近才开始学Unity3d,被这个本地空间和世界空间搞得有点晕头转向的.于是花了一点时间随便写了一点代码加深理解.代码如下: public class MoveX : MonoBehaviour { ...
- 在Linux用户空间做内核空间做的事情
导读 我相信,Linux 最好也是最坏的事情,就是内核空间(kernel space)和用户空间(user space)之间的巨大差别.如果没有这个区别,Linux 可能也不会成为世界上影响力最大的操 ...
- 通过几个例子看sed的模式空间与保持空间
SED之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使 ...
- Talairach空间、MNI空间、Native空间、Stereotaxic空间
Talairach空间.MNI空间.Native空间.Stereotaxic空间 Native空间就是原始空间. 图像没有做任何变换时就是在原始空间.在这个空间中图像的维度.原点.voxel size ...
- Linux系统调用具体解释(怎样从用户空间进入内核空间)
系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同一时候执行的多个进程都须要訪问这些资源,为了更好的管理这些资源进程是不同意直接操作的,全部对这些资源的訪问都必须有操作系统控制. ...
- 《浏览器工作原理与实践》 <12>栈空间和堆空间:数据是如何存储的?
对于前端开发者来说,JavaScript 的内存机制是一个不被经常提及的概念 ,因此很容易被忽视.特别是一些非计算机专业的同学,对内存机制可能没有非常清晰的认识,甚至有些同学根本就不知道 JavaSc ...
- 【转】UNITY中相机空间,投影空间的正向问题
原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html 原文链接2:https://www.cnblogs.com/hefee/p/3820610.h ...
- android计算每个目录剩余空间丶总空间以及SD卡剩余空间
ublic class MemorySpaceCheck { /** * 计算剩余空间 * @param path * @return */ public static String getAvail ...
- Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理
摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■ 详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...
随机推荐
- JavaScript(四)——DOM操作——Window.document对象
一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docunment.getElementById(&qu ...
- 使用dig查询dns解析
原文地址:使用dig查询dns解析 作者:chenwenming 一般来说linux下查询域名解析有两种选择,nslookup或者dig,而在使用上我觉得dig更加方便顺手. 如果是在debian下的 ...
- 使用 xtrabackup 进行MySQL数据库物理备份
0. xtrabackup的功能 能实现的功能: 非阻塞备份innodb等事务引擎数据库. 备份myisam表会阻塞(需要锁). 支持全备.增量备份.压缩备份. 快速增量备份(xtradb,原理类似于 ...
- 深入理解Nginx之调试优化技巧
在开发过程中,我们经常会碰到段错误等异常,这时我们需要有相应的机制来进行调试,特别是服务提供在线上时,面对大量的日志信息,合理的调试处理机制对于开发来说是一件非常重要的事情,幸好Nginx本身提供了很 ...
- centos yum源配置
5步搞定yum源配置 作者小波/QQ463431476欢迎转载! 第一步: 卸载原来的yum [root@localhost home]#rpm -qa|grep yum|xargs rpm -e - ...
- 通过vmstat命令判断服务器瓶颈
linux命令vmstat介绍 vmstat介绍 通过STATSPACK收集服务器信息,主要通过收集VMSTAT的信息来展现服务器状况.VMSTAT工具是最常见的UNIX监控工具,可以展现给定时 间间 ...
- C# WebService动态调用
前言 站在开发者的角度,WebService 技术确实是不再“时髦”.甚至很多人会说,我们不再用它.当然,为了使软件可以更简洁,更有层次,更易于实现缓存等机制,我是非常建议将 SOAP 转为 REST ...
- .Net程序员之Python基础教程学习----判断条件与循环[Fourth Day]
今天学习Python的判断条件与循环操作. 一. 布尔变量: 在学习判断条件之前必须的了解bool变量,在Python中bool变量与C语言比较类似,与.net差别比较大,其中下面集中情况需要 ...
- 第18章 图元文件_18.2 增强型图元文件(emf)(1)
18.2 增强型图元文件(emf) 18.2.1 创建并显示增强型图元文件的步骤 (1)创建:hdcEMF = CreateEnhMetaFile(hdcRef,szFilename,lpRect,l ...
- ACCP7.0优化Myschool内侧题
1) 在SQL Server 中,为数据库表建立索引能够(C ). 索引:是SQL SERVER编排数据的内部方法,是检索表中数据的直接通道 建立索引的作用:大大提高了数据库的检索速度,改善数据库性能 ...