从2D到3D的移动

时间:2012-04-04 12:39:36

标签: c# 3d xna 2d

任何人都可以给我一些建议或建议

我需要找到照片中的一个物体从一个位置移动到另一个位置的多少(实际上我需要计算相机在两个图像之间移动了多少但是因为物体将保持静止并且只是在其上旋转Y轴我认为移动图像会更容易。与此示例几乎相同,但并不那么复杂。 enter image description here

所以我拍摄了一张rubiks立方体的第一张照片,并根据此处的示例选择了立方体上的4个点 enter image description here 图像是Texture2D,蓝色圆圈表示用户选择的立方体正面的4个点。这4个点存储在列表中,下一个图像被加载,如下所示 enter image description here 用户再次必须选择与之前相同的面部的4个点(白色面部)。然后将这4个点存储到新列表中。

所以现在我有两个列表,我需要计算“整个前脸”从图像1到图像2移动(旋转/缩放/平移)的程度,如下所示 enter image description here

但更重要的是,我需要用3D计算这个动作!因此,对于第一个图像,我假设z分量= 0.例如,我假设图像1的左上角=例如(10,10,0)。

有没有办法可以“假设”如果图像2的面部以某种方式旋转/缩放/平移,可以在3D空间中移动?因此,如果图像2的左上角位于图像1(起始图像)左上角的右侧,则摄像机必须向右移动。同样会增加或减少积分?至于旋转,我可以计算出图像1点之间的角度和图像2点之间的角度,并以某种方式计算出相机旋转了多少?

对于我的代码,我在想这样的事情?

// Image 1 coordinates for the front face 
// Assume z = 0 
cube1 = new List<Vector3>(); 
cube.Add(new Vector3(10, 10, 0)); 
cube.Add(new Vector3(20, 10, 0)); 
cube.Add(new Vector3(10, 20, 0)); 
cube.Add(new Vector3(20, 20, 0)); 

// Get image 2 coordinates 
cube2 = new List<Vector3>(); 
cube.Add(new Vector3(newX, newY, ?)); // Keep Z = 0?
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 

向左或向右移动只计算每个点的移动量

//Translation 
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY,   0)); 
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating); 

歪曲(我有点卡住)......

// Rotation 
Matrix rotation = Matrix.CreateFromAxisAngle( 
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?));   // Not sure here 
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation);

1 个答案:

答案 0 :(得分:2)

世界矩阵*视图矩阵(摄像机)*投影(摄像机)=变换矩阵

假设cube1 =初始位置。
渲染期间发生的事情是:cube1 * transformMatrix =输出矩阵

如果我理解你是对的: 您的输入允许用户仅更改相机矩阵(视图),
(和相机=视图*投影) 并且您希望在相机更新后找到立方体的新变换。

所以你需要做反转操作:

outputmatrix / transformMatrix = cube1矩阵(您需要的新矩阵)

从新的cube1结果矩阵中你可以提取角度,运动等。

所以,你的问题与“实施”有关 - 而不是如何实施。
(因为我看到你熟悉你需要的命令和代码)

我希望这会有所帮助。