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.表空间 ■ 详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...
随机推荐
- Linux 虚拟机网络适配器从E1000改为VMXNET3
我们知道VMware的网络适配器类型有多种,例如E1000.VMXNET.VMXNET 2 (Enhanced).VMXNET3等,就性能而言,一般VMXNET3要优于E1000,下面介绍如果将Lin ...
- pentaho cde 封装自定义图形控件,动态传参
在实际项目中经常会用到将经常用到的图形表格组成一个控件,其他地方直接调用,类似于服务器开发的接口,而现在就需要将一些常用的图形做封装,这样就不必重复多次创建相同的内容. 下面就简单的定义一个自定义柱形 ...
- SQL Server 2012实施与管理实战指南(笔记)——Ch3Alwayson可用组
3.AlwaysOn可用组 Alwayson支持的,是一个可用性组,每个可用性组是包含了多个用户数据库的容器,可用性组内的数据库可以作为一个整体进行故障转移. AlwaysOn关键特性: 一.类似集群 ...
- 从Prototype学习JavaScript面向对象编程
概述 JavaScript是一种基于对象的编程语言.它是灵活的,既有面向过程(也就是面向函数)的编程,也有面向对象的编程.因此我称它是基于对象的编程语言. 对于JavaScript的面向过程的编程特性 ...
- EF深入系列--细节
1.在调试的时候,查看EF生成的SQL语句 在Context类的构造函数中添加以下代码,就可以在调试的时候在[输出]窗口中看到SQL语句 this.Database.Log = s => Sys ...
- Runtime.exec() sucks!!!!
自己项目中使用到了 Runtime rt = Runtime.getRuntime(); Process p = rt.exec("query session");p.waitFo ...
- SSH框架配置释义
创建一个bean, 依赖注入支持的不同注入方式及具体配置方法 属性注入 通过setter()方法注入bean的属性或者依赖对象.属性注入要求bean需要提供一个默认构造函数和对应的setter方法 ...
- 【Unity】改变向量的方向而不改变其大小
最近在做一个打砖块游戏时遇到一个小问题,就是小球有可能会在左右两个边界之间做循环往返运动而导致游戏无法继续进行下去,于是我打算让小球在垂直撞向边界时改变一下方向,但是速度不变,尝试了一些方法但是没有达 ...
- linux centos6.5 ftp网页vsftpd配置
安装命令centos下 yum install vsftpd 出现“Complete!”时意味着安装完成.Linux中,系统对于大小写严格区分,比如abc和ABC是完全不相同的字符,要特别注意.配置V ...
- 解决Apache/PHP无法启动的问题
最近经常被问到Apache无法启动的情况,所以写一篇文章,总结一下Windows下经常遇到的 Apache/PHP 无法启动的情况的解决方法. Apache/PHP 无法启动分两种情况: 1..Apa ...