屏幕坐标系和视口坐标系

一.屏幕坐标系
1.屏幕坐标系: 手机屏幕或者电脑屏幕的一个坐标系。
2.屏幕坐标是以像素来定义的, 屏幕左下角为原点(0,0), 右上角为(Screen.width,Screen.height), width是屏幕的宽度, height是屏幕的高度, Z值是摄像机世界坐标取反,并且以相机的世界单位来衡量的。
3.屏幕坐标和相机之间满足: Screen.width = Camera.main.pixelWidth和Screen.height = Camera.main.pixelHeight这两个条件。
4.鼠标的位置坐标属于屏幕坐标。通过Input.mousePosition获取鼠标的屏幕坐标。
二.创建工程
1.创建一个游戏工程, 命名为ScreenViewPort

2.在Project视图中创建3个文件夹, Scene文件夹、Resources文件夹和Script文件夹

3.将当前场景保存为GameScene

4.创建ScreenPosition游戏脚本


5.在Hierarchy视图中创建一个空的GameObject, 命名为GameManager,并把ScreenPosition绑定在该对象上

6.更改屏幕分辨率为480 * 800

7.编写代码

using UnityEngine;

public class ScreenPosition : MonoBehaviour
{
	void Update () 
	{
		if(Input.GetMouseButtonDown(0))
		{
			Debug.Log ("屏幕坐标:" + Input.mousePosition);
		}
	}
}

8.运行点击屏幕打印

屏幕坐标:(9.0, 33.0, 0.0)

屏幕坐标:(458.0, 22.0, 0.0)

屏幕坐标:(228.0, 410.0, 0.0)

屏幕坐标:(458.0, 795.0, 0.0)

三.视口坐标系

1.摄像机的前面有一个长方形的小框子, 那个即为视口。


2.视口坐标是标准化后的屏幕坐标。视口坐标是以0到1间的数字来表示的, 它的范围是以左下角为(0,0), 右上角为(1,1)定义的这样一个矩形。视口坐标是一个3D坐标, Z轴是以相机的世界单位来衡量的。通过对比可以发现视口坐标和屏幕坐标特别的相似。

3.摄像机视口比例:public float aspect{get;set;},此属性用于获取或设置Camera视口的宽高比例值。

4.void ResetAspect();恢复长宽比为屏幕的长宽比。

5.代码

using UnityEngine;

public class CameraAspect : MonoBehaviour
{
	void Start () 
	{
		Debug.Log ("默认宽高比例:" + Camera.main.aspect);
	}

	void OnGUI () 
	{
		if(GUILayout.Button("摄像机宽高比例为1"))
		{
			Camera.main.ResetAspect ();
			Camera.main.aspect = 1;
		}

		if(GUILayout.Button("摄像机宽高比例为2"))
		{
			Camera.main.ResetAspect ();
			Camera.main.aspect = 2;
		}
	}
}

四.屏幕坐标和视口坐标的转换

1.从视口空间到屏幕空间的变换位置: Vector3 ViewportToScreenPoint(Vector3 position);

2.从屏幕空间到视窗空间的变换位置: Vector3 ScreenToViewportPoint(Vector3 position);

3.代码

using UnityEngine;

public class ScreenViewPortPosition : MonoBehaviour 
{
	void Start()
	{
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,0,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0.5,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0.5f,0,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,0.5,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,0.5f,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0.5,0.5,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0.5f,0.5f,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(1,0,0),"+Camera.main.ViewportToScreenPoint(new Vector3(1,0,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(0,1,0),"+Camera.main.ViewportToScreenPoint(new Vector3(0,1,0))+"]");
		Debug.Log ("摄像机视口坐标转换成屏幕坐标[(1,1,0),"+Camera.main.ViewportToScreenPoint(new Vector3(1,1,0))+"]");
	}

	void Update () 
	{
		if(Input.GetMouseButtonDown(0))
		{
			Debug.Log ("摄像机屏幕坐标转换成视口坐标:["+Input.mousePosition+","+Camera.main.ScreenToViewportPoint(Input.mousePosition)+"]");
		}
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值