2012-04-04 76 views
16

谁能给我一些意见或建议运动从2D到3D

我需要找到多少在一个拍摄对象从一个位置移动到另一个(以及实际上我需要计算相机拥有多少在2张图像之间移动,但由于对象将保持静止并且仅在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); 

而歪斜(IM有点自命不凡)....

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

点是否必须遵循任何规则?像他们必须都是coplaner? – MerickOWA 2012-04-04 17:40:28

+0

对于应用程序的目的,所有点都将被认为是共面的。因此,用户只能选择立方体的一个面,并且所有这些点将被视为在一个平面上 – heyred 2012-04-12 10:47:54

回答

2

世界矩阵*查看矩阵(相机)*投影(相机)=变换矩阵

假设立方体1 =初始位置。
会发生什么事时呈现为:cube1 * transformMatrix =输出矩阵

如果我理解你正确: 您输入允许用户改变相机矩阵(视图)只,
(和摄像头=视图*投影) 并且您想在更新相机后找出立方体的新变形。

所以,你需要做的反转操作:

outputmatrix/transformMatrix = cube1矩阵(新的一个,你需要)

从新cube1结果矩阵可以提取角度,运动和

因此,您的问题更多地与“实施什么”相关 - 而不是如何实施。
(正如我看到你的家庭与你需要的命令和代码)

我希望这可以帮助。