C# 从二维移动到三维

C# 从二维移动到三维,c#,3d,xna,2d,C#,3d,Xna,2d,有人能给我一些建议吗 我需要找出照片中的物体从一个位置移动到另一个位置的量(实际上我需要计算相机在两幅图像之间移动的量,但由于物体将保持静止,只是在其Y轴上旋转,我认为移动图像会更容易)。与本例基本相同,但不太复杂。 因此,我拍摄了rubiks立方体的第一张照片,并根据这里的示例在立方体上选择了4个点 图像为纹理2D,蓝色圆圈表示用户选择的立方体正面的4个点。这4个点存储在列表中,并加载下一个图像,如下所示 同样,用户必须选择与前面相同的4个点(白色面)。然后将这4个点存储到新列表中 现在我有

有人能给我一些建议吗

我需要找出照片中的物体从一个位置移动到另一个位置的量(实际上我需要计算相机在两幅图像之间移动的量,但由于物体将保持静止,只是在其Y轴上旋转,我认为移动图像会更容易)。与本例基本相同,但不太复杂。

因此,我拍摄了rubiks立方体的第一张照片,并根据这里的示例在立方体上选择了4个点 图像为纹理2D,蓝色圆圈表示用户选择的立方体正面的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, ?)); 
//前面的图像1坐标
//假设z=0
cube1=新列表();
添加(新向量3(10,10,0));
添加(新向量3(20,10,0));
添加(新向量3(10,20,0));
添加(新向量3(20,20,0));
//获取图像2坐标
cube2=新列表();
cube.Add(新向量3(newX,newY,?);//保持Z=0?
添加(新向量3(newX,newY,?);
添加(新向量3(newX,newY,?);
添加(新向量3(newX,newY,?);
对于向左或向右移动,只需计算每个点移动了多少

//Translation 
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY,   0)); 
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating); 
//翻译
矩阵转换=矩阵.CreateTranslation(新向量3(amountMovedX,amountMovedY,0));
List imageAfterTranslating=TransformListofVertexts(imageAfterScaling,translating);
对于歪斜(我有点卡住了)

//旋转
矩阵旋转=矩阵。CreateFromAxisAngle(
Vector3.规格化(新Vector3(?,?)),MathHelper.ToRadians(?);//这里不太清楚
List imageAfterRotation=TransformListofVertex(立方体,旋转);

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

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

如果我理解你的意思是正确的: 您的输入仅允许用户更改相机矩阵(视图),
(和摄影机=视图*投影) 你想知道摄像机更新后立方体的新变换

因此,您需要执行反转操作:

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

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

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


我希望这会有所帮助。

积分是否必须遵循任何规则?好像它们都必须是共面的?是的,为了应用的目的,所有的点都将被认为是共面的。因此,用户只能选择立方体的一个面,所有这些点都将被视为在一个平面上
// Rotation 
Matrix rotation = Matrix.CreateFromAxisAngle( 
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?));   // Not sure here 
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation);