在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中测试它,因为它更容易验证。

在Unity3D中将一个点从世界转换到相机空间

看着你的代码,认为你是大规模过度复杂的简单任务,或者我不明白这个问题。你当然可以用相机。WorldToScreenPoint

http://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html