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.表空间 ■ 详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...
随机推荐
- Mac OS 文件、文件夹重命名的方法
在Mac OS中,文件和文件名重命名的方法非常简单 选中你想要命名的文件或者文件夹,按回车,可以直接重命名,输入你要修改的内容,确认后,再按回车就OK啦--- 希望能对你有所帮助^_^
- 【转】面向对象设计的SOLID原则
S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...
- 初识mvc分层思想
首先要清楚的是: mvc是一种设计模式,一种分层思想,没有具体的技术与之对应,无论是js还是java或者其他的技术都可以运用. 既然是分层那么这些层都有哪些职责呢? View层(界面层): 为用户展示 ...
- jstree静态生成树并为树添加触发事件
本章将介绍如何简单的使用jstree生成树(生成树的数据是静态的),并为树添加点击事件. 1. 建一个jsp页面,引入jquery.js(在其他js前引用),引入jstree所需的js,css文件(可 ...
- view组件的duplicateParentState属性
今天做页面的时候遇到一个小问题,在点击的时候改变组件的图片来源,这个很简单大家都知道,用selector可以很快实现.但是现状有点特殊,是 LinearLayout 中包裹着一个 ImageView ...
- PowerBI 引入时间智能
简介 Power BI Desktop -是一款由微软发布的自助式商业智能工具,功能强大.易于使用.其中还可以通过微软云连多个数据源并且使用数据源来创建可视化表盘. 但是几乎所有的BI都需要展示如何随 ...
- Nginx 切片模块、断点续传
熟悉 CDN 行业主流技术的朋友应该都比较清楚,虽然 Nginx 近几年发展的如日中天,但是基本上没有直接使用它自带的 proxy_cache 模块来做缓存的,原因有很多,例如下面几个: 不支持多盘 ...
- MySQL运行状态show status中文详解(转)
要查看MySQL运行状态,要优化MySQL运行效率都少不了要运行show status查看各种状态,下面是参考官方文档及网上资料整理出来的中文详细解释: 状态名 作用域 详细解释 Aborted_cl ...
- Boost配置
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- 初涉Linux ----------> Ubuntu15.04的安装与美化
“你玩 Linux 吗?” “什么 Linux ?” “你连 Linux 都不知道?还说是学计算机的呢...” “干嘛要用 Linux 啊?windows多好,Linux?没兴趣” 一. 前言 ...