16

谁能给我一些意见或建议

我需要找出照片中的物体从一个位置移动到另一个位置的程度(实际上,我需要计算相机在两张图像之间移动了多少,但是因为该物体将保持静止并且仅在其 Y 轴上旋转我认为移动图像会更容易)。与此示例几乎相同,但没有那么复杂。 在此处输入图像描述

因此,我拍摄了魔方的第一张照片,并按照此处的示例在立方体上选择 4 个点。 在此处输入图像描述 图像是 Texture2D,蓝色圆圈代表用户选择的立方体正面的 4 个点。这 4 个点存储在列表中,并加载下一个看起来像这样 在此处输入图像描述 的图像 用户必须再次选择与前一个相同的人脸(白脸)的 4 个点。然后将这 4 个点存储到一个新列表中。

所以现在我有两个列表,我需要计算“整个正面”从图像 1 移动(旋转/缩放/平移)到图像 2 的程度,如下所示 在此处输入图像描述

但更重要的是,我需要在 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);
4

1 回答 1

2

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

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

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

所以你需要做反转操作:

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

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

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

我希望这有帮助。

于 2012-04-04T15:55:32.587 回答