我想将世界坐标(P_w
)中的点转换为相机坐标(P_c
)。
为此,我首先要将P_w
翻译为负相机位置(在世界坐标C_pos
中),之后围绕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;
}
但是结果与使用我的相机的向上,向前和向右矢量构建我的roations矩阵的另一个函数不同。
PhotoData
是一个类,它包含有关摄像机的一些信息,包括位置和旋转。 PhotoData.rotation
是Vector3
,其相机围绕x,y和z轴旋转为x,y,z值。
有人可以告诉我为什么这不起作用吗?
//编辑: 有些人提到了内置函数,但我必须用它们来计算它。我忘了把它写在原帖中。 我首先在c ++中编写了这个算法,并希望在Unity中测试它,因为它更容易验证它。
答案 0 :(得分:1)
查看您的代码并认为您大量过于复杂的简单任务,或者我不理解这个问题。你绝对可以使用Camera.WorldToScreenPoint
http://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html