赞
踩
因为要做AR的标记功能,所以就要用到坐标的转换,就总结了一下屏幕坐标、世界坐标、相机坐标之间的转换。
首先说明的是Unity3D遵从Direct3D标准的左手笛卡尔坐标系变换规则。
也就是说:
世界坐标系就是左手笛卡尔坐标系(x,y,z),相机也是左手笛卡尔坐标系(u,v,w),且面向自身坐标系w坐标轴正上方,屏幕以中央为原点,右和上分别为x,y的正方向。
我将工具代码直接上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraTransformationUtilities : MonoBehaviour
{
public static CameraTransformationUtilities Instance { get; private set; }
protected CameraTransformationUtilities() { }
private void Start()
{
Instance = this;
}
/// 投影矩阵
/// 视点矩阵
/// 列表形式的投影矩阵
/// 列表形式的视点矩阵
/// 要投影的点的引用
/// 要投影的点引用列表
/// 屏幕宽
/// 屏幕高
/// 列表是否以行优先进行矩阵元素的存储
/// 水平翻转
/// 上下翻转
public void UnprojectScreenToWorld(
Matrix4x4 projectionMatrix,
Matrix4x4 viewMatrix,
ref Vector3 p)
{
// 世界坐标->相机坐标, 相机坐标->屏幕坐标 分别需要 viewMatrix和projectionMatrix
Matrix4x4 PV = projectionMatrix * viewMatrix;
// 逆矩阵即为从屏幕到世界的坐标变换,需指定像素深度
p = PV.inverse.MultiplyPoint(p);
}
public void UnprojectScreenToWorld(
IReadOnlyList projection,
IReadOnlyList view,
ref Vector3 p,
bool rowBase = true
)
{
<Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。