//获取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); }