Unity3D的四种坐标系
在Unity3D开发中,坐标系是非常重要的概念,它用于确定物体在场景中的位置和方向。本文将详细介绍Unity3D中的四种坐标系,包括世界坐标、屏幕坐标、视口坐标和绘制GUI界面的坐标系,并给出坐标转换的示例代码。
四种坐标系介绍
1. World Space(世界坐标)
在Unity3D场景中添加的物体(如Cube),都是以世界坐标显示在场景中的。可以使用transform.position
来获取物体的世界坐标位置。例如,一个Cube在场景中的世界坐标可以通过以下代码获取:
Vector3 worldPosition = transform.position;
2. Screen Space(屏幕坐标)
屏幕坐标以像素为单位进行定义,屏幕的左下角为坐标原点(0, 0)
,右上角的坐标为(Screen.width, Screen.height)
。其中,Z轴的位置是以相机的世界单位来衡量的。鼠标位置坐标和手指触摸屏幕的坐标都属于屏幕坐标。可以使用Input.mousePosition
获取鼠标的屏幕坐标,使用Input.GetTouch(0).position
获取单个手指触摸屏幕的坐标。示例代码如下:
Vector3 mousePosition = Input.mousePosition;
Vector3 touchPosition = Input.GetTouch(0).position;
3. ViewPort Space(视口坐标)
视口坐标是标准的且相对于相机的。相机的左下角为(0, 0)
点,右上角为(1, 1)
点,Z轴的位置同样以相机的世界单位来衡量。在实际开发中,视口坐标的使用频率相对较低。
4. 绘制GUI界面的坐标系
该坐标系与屏幕坐标系相似,但坐标原点不同。绘制GUI界面的坐标系以屏幕的左上角为(0, 0)
点,右下角为(Screen.width, Screen.height)
。
坐标转换
世界坐标→屏幕坐标
可以使用camera.WorldToScreenPoint(transform.position)
将世界坐标转换为屏幕坐标,其中camera
为场景中的相机对象。示例代码如下:
Camera camera = Camera.main;
Vector3 screenPosition = camera.WorldToScreenPoint(transform.position);
屏幕坐标→视口坐标
使用camera.ScreenToViewportPoint(Input.GetTouch(0).position)
可以将屏幕坐标转换为视口坐标。示例代码如下:
Camera camera = Camera.main;
Vector3 viewportPosition = camera.ScreenToViewportPoint(Input.GetTouch(0).position);
视口坐标→屏幕坐标
使用camera.ViewportToScreenPoint()
可以将视口坐标转换为屏幕坐标。
视口坐标→世界坐标
使用camera.ViewportToWorldPoint()
可以将视口坐标转换为世界坐标。
示例代码
案例1:在鼠标点击的位置上绘制一张图片
该示例展示了绘制GUI界面坐标系与屏幕坐标系之间的关系。代码如下:
using UnityEngine;
using System.Collections;
public class test : MonoBehaviour
{
// 图片
public Texture img;
// 储存鼠标的位置坐标
private Vector2 pos;
void OnGUI()
{
// 鼠标左击,获取当前鼠标的位置
if (Input.GetMouseButton(0))
{
pos = Input.mousePosition;
}
// 绘制图片
GUI.DrawTexture(new Rect(pos.x, Screen.height - pos.y, 100, 100), img);
}
}
案例2:坐标显示和坐标转换
该示例展示了触摸方面的坐标显示和转换。如果没有触摸屏,可以去掉if (Input.touchCount > 0)
条件判断。代码如下:
using UnityEngine;
using System.Collections;
public class test : MonoBehaviour
{
// 场景的相机,拖放进来
public Camera camera;
// 场景的物体
private GameObject obj;
void Start()
{
// 初始化
obj = GameObject.Find("Plane");
}
void Update()
{
// 有触摸
if (Input.touchCount > 0)
{
print("世界坐标" + obj.transform.position);
print("屏幕坐标" + Input.GetTouch(0).position);
print("世界坐标→屏幕坐标" + camera.WorldToScreenPoint(obj.transform.position));
print("屏幕坐标→视口坐标" + camera.ScreenToViewportPoint(Input.GetTouch(0).position));
print("世界坐标→视口坐标" + camera.WorldToViewportPoint(obj.transform.position));
}
}
}
通过以上介绍和示例代码,你可以更好地理解Unity3D中的四种坐标系及其坐标转换,从而在开发中更灵活地处理物体的位置和显示。