zoukankan      html  css  js  c++  java
  • 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(10, 10, 200, 100), 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,则屏幕上的任意点都会转换到同一点,即相机位置。

  • 相关阅读:
    ES 遇到 unassigned shard如何处理?
    elasticsearch如何安全重启
    Agg学习笔记
    二进制文件中读写结构体
    C语言 结构体数组保存到二进制文件中
    Memcache 笔记
    memcached完全剖析–1. memcached的基础
    Redis和Memcache对比及选择
    Exploring the MapBox stack: MBTiles, TileJSON, UTFGrids and Wax
    Tilemill + tilestream + mapbox.js 自制地图
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/6077564.html
Copyright © 2011-2022 走看看