在Unity3D中将点从世界转换为相机空间

时间:2015-07-29 10:48:56

标签: c# math unity3d rotation

我想将世界坐标(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.rotationVector3,其相机围绕x,y和z轴旋转为x,y,z值。

有人可以告诉我为什么这不起作用吗?

//编辑: 有些人提到了内置函数,但我必须用它们来计算它。我忘了把它写在原帖中。 我首先在c ++中编写了这个算法,并希望在Unity中测试它,因为它更容易验证它。

1 个答案:

答案 0 :(得分:1)

查看您的代码并认为您大量过于复杂的简单任务,或者我不理解这个问题。你绝对可以使用Camera.WorldToScreenPoint

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