马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册帐号
x
其实说到unity3d的坐标系,虽然是基础的知识,但是对于刚开始接触unity3d的小白来説,总会觉得有些混乱。所以今天小编和一起浅析其中的原理。
1.unity3d 常用四种坐标系的基本概念: 1.0 World Space(世界坐标) -文档:https://docs.unity3d.com/ScriptReference/Space.World.html 1.0.0 在我们场景有一个GameObject 对象,这个对象的世界坐标是针对整个场景来説的,获取对应的坐标:tranform.position tranform.position 从场景中心(0,0)的位置开始计算,单位长度也是一样的,相对于场景中心(0,0)的距离,也是获取世界坐标的方法。 1.0.1 轴向区分 X 轴:左负右正 Y 轴:上正下负 Z 轴:里正外负
1.0.2 局部坐标: tranform.localPosition,局部坐标都是相对于父容器坐标的。 1.1 Screen Space(屏幕坐标) 以像素来定义,以屏幕的左下角(0,0),右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。
1.2 绘制GUI 界面的坐标系 这个坐标系和屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)
1.3 ViewPort Space(视口坐标) 视口坐标是相对于相机的,相机的左下角(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。
2.坐标轴的转换,下面我们通过直接写代码来理解吧!
[C#] 纯文本查看 复制代码 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoordinateSystemTest : MonoBehaviour {
public Camera CurrentCamera;
void OnGUI()
{
if (CurrentCamera == null) {
Debug.Log ("相机为Null");
return;
}
GUI.Label (new Rect (300, 50, 100, 100), "坐标变换");
GUI.Label (new Rect (100, 100, 100, 100), "1.世界坐标:");
GUI.Label (new Rect (200, 100, 200, 100), transform.position.ToString ());
GUI.Label (new Rect (100, 150, 100, 100), "2.局部坐标:");
GUI.Label (new Rect (200, 150, 200, 100), transform.localPosition.ToString ());
GUI.Label (new Rect (100, 200, 100, 100), "3.世界坐标->屏幕坐标:");
GUI.Label (new Rect (200, 200, 200, 100), CurrentCamera.WorldToScreenPoint(transform.position).ToString());
GUI.Label (new Rect (100, 250, 100, 100), "4.世界坐标->视口坐标:");
GUI.Label (new Rect (200, 250, 200, 100), CurrentCamera.WorldToViewportPoint(transform.position).ToString());
GUI.Label (new Rect (100, 300, 100, 100), "5.屏幕坐标->视口坐标:");
GUI.Label (new Rect (200, 300, 200, 100), CurrentCamera.ScreenToViewportPoint(transform.position).ToString());
GUI.Label (new Rect (100, 350, 100, 100), "6.屏幕坐标->世界坐标:");
GUI.Label (new Rect (200, 350, 200, 100), CurrentCamera.ScreenToWorldPoint(transform.position).ToString());
GUI.Label (new Rect (100, 400, 100, 100), "7.视口坐标->屏幕坐标:");
GUI.Label (new Rect (200, 400, 200, 100), CurrentCamera.ViewportToScreenPoint(transform.position).ToString());
GUI.Label (new Rect (100, 450, 100, 100), "8.视口坐标->世界坐标:");
GUI.Label (new Rect (200, 450, 200, 100), CurrentCamera.ViewportToWorldPoint(transform.position).ToString());
}
}
|