屏幕坐标转换为世界坐标原理
原文: http://www.skcircle.com/?id=1359
下面代码是自己的修改
void Update()
{
//DrawViewport();
if (Input.GetMouseButtonDown(0))
{
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, depth);
Vector3 apiwpos = Camera.main.ScreenToWorldPoint(mousePos);
Vector3 wpos = StoWWorldPos(mousePos);
Debug.LogFormat("mousePos = {0} apiwpos = {1} wpos = {2}", mousePos, apiwpos, wpos);
}
}
//local到world的TRS变换
private Vector3 CameraLocalToWorldPos(Vector3 localpos)
{
return Camera.main.transform.TransformPoint(localpos);
}
//将视口空间相对坐标转到世界坐标
//处理TRS矩阵变换
private Vector3 StoWWorldPos(Vector3 mousePos)
{
return CameraLocalToWorldPos(StoWLocalPos(mousePos));
}
//计算转换完在摄像机空间的本地坐标
private Vector3 StoWLocalPos(Vector3 mousePos)
{
// 一半的角度
float halffov = Camera.main.fieldOfView / 2;
// 一半的宽高
float halfhei = Mathf.Tan(halffov * Mathf.Deg2Rad) * depth;
float halfwid = halfhei * Camera.main.aspect;
#region 以屏幕中心计算,也就以摄像机做原点。计算出来的直接就是本地坐标
//我的测试
//转换为以中心点为原点。这2个都是以屏幕左下角为原点
Vector2 v2MousePos = new Vector2(mousePos.x, mousePos.y); //鼠标
Vector2 originPos = new Vector2(Screen.width / 2, Screen.height / 2);
//以屏幕中心为原点 鼠标的坐标
Vector2 newMousePos = v2MousePos - originPos;
//算XY的比例 XY比例不一样
float ratioX = newMousePos.x / (Screen.width / 2);
float ratioY = newMousePos.y / (Screen.height / 2);
Vector3 localxyz = new Vector3(ratioX * halfwid, ratioY * halfhei, depth);
#endregion
return localxyz;
}