【发布时间】:2025-12-26 19:55:06
【问题描述】:
谁能给我一些意见或建议
我需要找出照片中的物体从一个位置移动到另一个位置的距离(实际上我需要计算相机在 2 个图像之间移动了多少,但因为该物体将保持静止并仅在其上旋转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);
【问题讨论】:
-
积分有什么规则吗?好像它们都必须是共面的?
-
是的,就应用程序而言,所有点都将被视为共面。所以用户只能选择立方体的一个面,所有这些点都将被认为在一个平面上