Exemplo n.º 1
0
    //获取LookAt矩阵
    //相机的位置 相机的看着那个位置(决定相机方向) 相机上方位置
    // see:https://zhuanlan.zhihu.com/p/66384929
    // Rx Ry Rz 0
    // Ux Uy Uz 0
    // Dx Dy Dz 0
    // 0  0  0  1 相机空间是左手系
    public static HMatrix GetLookAtMat(HVector camera, HVector at, HVector up)
    {
        HMatrix matRet = new HMatrix();
        HVector CameraXAxis, CameraYAxis, CameraZAxis;

        CameraZAxis = at.Sub(camera);
        CameraZAxis = CameraZAxis.Normalize();
        CameraYAxis = up.Normalize();
        CameraXAxis = CameraZAxis.CrossProduct(CameraYAxis);
        CameraXAxis = CameraXAxis.Normalize();

        matRet.m[0, 0] = CameraXAxis.x;
        matRet.m[1, 0] = CameraXAxis.y;
        matRet.m[2, 0] = CameraXAxis.z;
        matRet.m[3, 0] = -CameraXAxis.DotProduct(camera);

        matRet.m[0, 1] = CameraYAxis.x;
        matRet.m[1, 1] = CameraYAxis.y;
        matRet.m[2, 1] = CameraYAxis.z;
        matRet.m[3, 1] = -CameraYAxis.DotProduct(camera);

        matRet.m[0, 2] = CameraZAxis.x;
        matRet.m[1, 2] = CameraZAxis.y;
        matRet.m[2, 2] = CameraZAxis.z;
        matRet.m[3, 2] = -CameraZAxis.DotProduct(camera);

        matRet.m[0, 3] = matRet.m[1, 3] = matRet.m[2, 3] = 0.0f;
        matRet.m[3, 3] = 1.0f;
        return(matRet);
    }