Unity3D的四种坐标系

2015年03月17日 11:42 0 点赞 0 评论 更新于 2017-05-01 05:58

在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中的四种坐标系及其坐标转换,从而在开发中更灵活地处理物体的位置和显示。

作者信息

menghao

menghao

共发布了 332 篇文章