从2D到3D的转变

16

有人可以给我一些建议或建议吗?

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

所以我首先拍摄魔方的第一张照片,并根据这里的示例选择魔方上的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
这些点是否必须遵循某些规则?例如,它们必须全部共面吗? - MerickOWA
是的,为了应用程序的目的,所有点都将被视为共面。因此,用户只能选择立方体的一个面,所有这些点都将被视为在同一平面上。 - heyred
1个回答

2

世界矩阵 * 相机视图矩阵 * 相机投影矩阵 = 变换矩阵

假设cube1是初始位置。
在渲染过程中发生的是:cube1 * 变换矩阵 = 输出矩阵

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

所以你需要进行反转操作:

输出矩阵 / 变换矩阵 = cube1矩阵(你将需要的新矩阵)

从新的cube1结果矩阵中,您可以提取角度、移动等信息。

因此,您的问题更多地与“实现什么”有关 - 而不是如何实现。
(因为我看到您熟悉所需的命令和代码)

希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接