我刚开始为您从Kinect获取的深度数据构建物理相机类。我有一个{3}的Vector3数组,描述了我从kinect进入的LOCAL位置(一旦我将它们投射到相机镜头的FOV上等)。然后我在空间中翻译,缩放和旋转整个虚拟kinect相机。
我想要做的是再次提取kinect相机输入的位置,但是在WORLD空间,而不是LOCAL空间(即它经历了平移,缩放和旋转,并为每个值提供了一个Vector3世界空间中的kinect。)
有什么想法吗?
答案 0 :(得分:0)
如果我理解正确,您需要在相机空间中将3D点坐标转换为世界空间。
为此,您需要将这些坐标与相机变换矩阵相乘。该矩阵由单个变换(平移,旋转和缩放)组成。
请注意应用转换的顺序:translate * scale!= scale * translate。
您可以像这样设置矩阵:
Matrix cameraMatrix = Matrix.CreateScale(cam_sx, cam_sy, cam_sz);
cameraMatrix *= Matrix.CreateRotationX(MathHelper.ToRadians(cam_rx));
cameraMatrix *= Matrix.CreateRotationY(MathHelper.ToRadians(cam_ry));
cameraMatrix *= Matrix.CreateRotationZ(MathHelper.ToRadians(cam_rz));
cameraMatrix *= Matrix.CreateTranslation(cam_x, cam_y, cam_z);
// Now we create a point in the camera local space
Vector3 localPoint = new Vector3(0, 0, 0);
Vector3 worldPoint = Vector3.Transform(localPoint , cameraMatrix);
// Now world contains the coordinates in the world space
// For example, if your camera is located at position (5,5,5)
// and localPoint=(0,0,0) then worldPoint=(5,5,5) which seems correct.
答案 1 :(得分:0)
Vector3 pos = Vector3.Transform(Vector3.Zero, worldMatrix);