unity的几种坐标系及他们之间的转换
来源:互联网 发布:新网互联域名转移 编辑:程序博客网 时间:2024/06/13 13:53
在谈unity各种坐标系之前,我一直很好奇unity为什么要有这么多坐标系搞的很麻烦,其实unity这么坐标系是为了解决麻烦,试想计算你和你同桌的位置,要先得到你们各自在世界中的位置,然后在计算相对位置,其实完全没有这个必要,这也是unity为什么会有这么多坐标系的原因
1.word space (世界坐标系)
当我们向场景中添加物体时,他们都是以世界坐标系的方式的方式显示在场景中的,通过transform.position可以得到它在世界中的坐标位置,transform.position(Vector3)可以设置它在世界中的位置(c#不支持单独设置x y z);
2.Screen Space(屏幕坐标系)
以像素为单位,左下角是(0,0),右上角为(screen.width, screen.height),Z的位置是以相机的世界单位来衡量//及物体离相机远近
注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得鼠标坐标,手指触摸屏也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指的手机屏幕坐标
说点题外话
unity中Input.GetMouseButtonDown(0)代表按下鼠标左键,Input.GetMouseButtonDown(1)代表鼠标右键Input.GetMouseButtonDown(2)代表滚轮中间。
3.viewport (视口坐标)
左下角为(0, 0),右上角为(1, 1)在一些画中画效果中长用到,比如主视口为FPS,然后右下角有一个小窗口为第三人称视图。
4.绘制GUI界面的坐标系(自从有了新版UI之后这个也很少用到)
这个坐标系与屏幕坐标系类似,不同的是左上角为(0,0),右下角为(screen.width, screen.height)这样绘制起来更方便。
5.桌面坐标系(系统坐标系)
这个坐标系与屏幕坐标系类似,不同的是该坐标系以桌面的左上角为(0,0),桌面右下角为桌面分辨率的宽和桌面分辨率的高
用SetCursorPos设置鼠标坐标,用GetCursorPos得到鼠标坐标。
C#中:
命名空间 using System.Runtime.InteropServices;
导入库 [DllImport("user32.dll")]
函数原型 public static extern int SetCursorPos(int x, int y);
public static extern bool GetCursorPos(ref int x, ref int y);
******************************************************
叮叮叮,开始下一个话题,unity中各种坐标系间的转换
1.物体的世界坐标到屏幕坐标的转换
camer.WorldToScreenPoint(cb.transform.position);//这里camer与一个相机相关联,cb代表场景中的一个方块物体,得到的vector3中的z为相机离cube物体的远近
2.屏幕坐标转世界坐标
Vector3 world = camer.ScreenToWorldPoint(Input.mousePosition);//及鼠标单击位置距世界中心(0,0,0)点的距离
3.屏幕坐标转视口坐标
Vector3 viewCoor = camer.ScreenToViewportPoint(Input.mousePosition);//底层原理无非就是Input.mousePosition.x/Screen.width,Input.mousePosition.y/Screen.Height;
4.视口坐标转屏幕坐标
Vector3 screen = camer.ViewportToScreenPoint(new Vector3(0.2f, 0.3f, 0));//注意视口左下角为(0,0),右上角为(1,1);
5.视口坐标到世界坐标
Vector3 word = camer.ViewportToWorldPoint(new Vector3(0.2f, 0.3f, 0));//注意当只改变一个z值时转化出的世界坐标的x,y也会发生相应的变化
6.视口坐标转射线
Ray ray = camer.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));//这是转化源码,为了更方便理解顺便写了一个小Deom
RaycastHit hit;
if (Physics.Raycast(ray,out hit))
{
Debug.Log("Im look at " + hit.transform.name);
}
else
{
Debug.Log("Im look at nothing");
}
- unity的几种坐标系及他们之间的转换
- 坐标系之间的转换
- hibernate3 的生命周期,及他们之间的转换
- OpenGL坐标系之间的转换
- 不同坐标系之间的转换
- 几大坐标系的转换
- 常用坐标系及坐标系之间的变换
- 常用坐标系及坐标系之间的变换
- Unity四种坐标系及转换
- Unity中四种坐标系之间的关联
- 国内地图坐标系介绍及常见地图(百度、高德、凯立德)之间的坐标系转换
- 国内地图坐标系介绍及常见地图(百度、高德、凯立德)之间的坐标系转换
- 关于坐标系转换与点在坐标系之间的转换
- IOS地图坐标系之间转换的算法
- 摄像头与imu之间的坐标系转换
- Ogre坐标系,向量之间的转换
- 计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换
- 计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换
- 开发笔记1
- 网络诈骗的危害
- C++11 lambda表达式
- 理解zookeeper选举机制
- Git忽略规则.gitignore梳理
- unity的几种坐标系及他们之间的转换
- Windows下,如何为Python安装Opencv
- 关于Linux的几点认知
- svn导致桌面图标带蓝色问号,加号等svn标记问题解决
- gulp & webpack整合,鱼与熊掌我都要!
- 网页设计感悟
- 【入门】Java继承
- linux设备驱动中的阻塞与非阻塞IO
- C++命名规则 整型宽度 整型溢出