在Unity3D中将一个点从世界转换到相机空间
本文关键字:世界 转换 空间 相机 一个 Unity3D | 更新日期: 2023-09-27 18:05:14
我想将世界坐标(P_w
)中的一个点转换为相机坐标(P_c
)
要做到这一点,我首先必须通过负相机位置(在世界坐标C_pos
中)平移P_w
,然后围绕x轴旋转P_w - C_pos
x度,围绕y轴旋转y度,围绕z轴旋转z度。
我在Unity中编写了这个函数:
static public Vector4 convertWorldToCameraCoordinatesByDegrees (Vector3 point, PhotoData photoData)
{
// translate the point by the negative camera-offset
//and convert to Vector4
Vector4 translatedPoint = point - photoData.cameraPosition;
// by default translatedPoint.w is 0
translatedPoint.w = 1.0f;
// create rotation matrices
Matrix4x4 rotationMatrixX = Matrix4x4.identity;
Matrix4x4 rotationMatrixY = Matrix4x4.identity;
Matrix4x4 rotationMatrixZ = Matrix4x4.identity;
// setup rotationMatrixX
rotationMatrixX.SetRow (1,
new Vector4 (0,
Mathf.Cos (photoData.rotation.x),
- Mathf.Sin (photoData.rotation.x),
0));
rotationMatrixX.SetRow (2,
new Vector4 (0,
Mathf.Sin (photoData.rotation.x),
Mathf.Cos (photoData.rotation.x),
0));
// setup rotationMatrixY
rotationMatrixY.SetRow (0,
new Vector4 (Mathf.Cos (photoData.rotation.y),
0,
Mathf.Sin (photoData.rotation.y),
0));
rotationMatrixY.SetRow (2,
new Vector4 (- Mathf.Sin (photoData.rotation.y),
0,
Mathf.Cos (photoData.rotation.y),
0));
// setup rotationMatrixZ
rotationMatrixZ.SetRow (0,
new Vector4 (Mathf.Cos (photoData.rotation.z),
- Mathf.Sin (photoData.rotation.z),
0,
0));
rotationMatrixZ.SetRow (1,
new Vector4 (Mathf.Sin (photoData.rotation.z),
Mathf.Cos (photoData.rotation.z),
0,
0));
// unity doc says z-x-y in this order
Matrix4x4 rotationMatrix = rotationMatrixY * rotationMatrixX * rotationMatrixZ;
Vector4 transformedPoint = rotationMatrix * translatedPoint;
return transformedPoint;
}
但结果与另一个函数不同,该函数使用相机的向上,向前和右矢量构建旋转矩阵。
PhotoData
是一个类,它有一些关于相机的信息,包括位置和旋转。PhotoData.rotation
是一个Vector3
,它使相机围绕x, y和z轴旋转为x-, y-, z值。
谁能告诉我为什么这不起作用?
//编辑:有些人提到了内置函数,但我必须在没有它们的情况下计算。我忘了在原来的帖子里写了。我首先在c++中编写了这个算法,并想在Unity中测试它,因为它更容易验证。
看着你的代码,认为你是大规模过度复杂的简单任务,或者我不明白这个问题。你当然可以用相机。WorldToScreenPoint
http://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html