一, Unity中的常用座标系
1⃣️,世界座标系 (左手定则)
this.transform.Position
2⃣️,本地座标系(左手定则)
this.transform.LocalPosition
3⃣️,屏幕座标系
1,左下角为原点(0,0)
2,右上角为 (Screen.Width,Screen.Hight)
3,Z的位置是以相机的世界单位来衡量//及物体离相机远近
4,和屏幕分辨率有关
5,鼠标位置座标属于屏幕座标,Input.mousePosition可以获得鼠标座标,当用Input.MousePosition获取鼠标位置的时候,他的Z轴值一直为0
public Vector3 MyScreenToWorld( Vector3 mousePos, Transform targetTransform ){
Vector3 dir = targetTransform.position - Camera.main.transform.position;
//计算投影
Vector3 normalDir = Vector3.Project( dir, Camera.main.transform.forward );
//物体离相机远近 (normalDir.magnitude)
Vector3 worldPos = Camera.main.ScreenToWorldPoint( new Vector3( mousePos.x , mousePos.y, normalDir.magnitude) );
return worldPos;
}
6,手指触摸屏也为屏幕座标,Input.GetTouch(0).position可以获得单个手指的手机屏幕座标
4⃣️,视口座标系
1,左下角为原点(0,0)
2,右上角为(1,1)
二,座标系转换
1⃣️,世界座标和本地座标转换
1,本地转世界 : this.transform.TransformPoint(0,0,0);
2,世界转本地: this.transform.InverseTransformPoint(0,0,0);
2⃣️,世界座标和屏幕座标转换
1, 世界转屏幕:Camera.main.WorldToScreenPoint( vector3 );
2, 屏幕转世界:Camera.main.ScreenToWorldPoint(vector3);
3⃣️,世界座标和视口座标转换
1,世界转视口:Camera.main.WorldToViewportPoint(0,0,0);
2, 视口转世界:Camera.main.ViewportToWorldPoint(0,0,0);
4⃣️,屏幕座标和视口座标转换
1,屏幕转视口:Camera.main.ScreenToViewportPoint(0,0,0);
2, 视口转屏幕:Camera.main.ViewportToScreenPoint(0,0,0);
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 从鼠标位置发送射线
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100, 1 << LayerMask.NameToLayer("Plane")))
{
Debug.Log(hit.collider.name);
}
}
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); // 从屏幕中央发送射线
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100, 1 << LayerMask.NameToLayer("Plane")))
{
Debug.Log(hit.collider.name);
}
}