gpt4 book ai didi

c# - 在 XNA、C# 中使用矩阵时对操作顺序感到困惑

转载 作者:太空狗 更新时间:2023-10-29 23:33:39 28 4
gpt4 key购买 nike

这是两段不同的代码

这就是我的出发点

Vector2 hold = Vector2.Transform(pos1, mat1);
Matrix inv = Matrix.Invert(mat2);
Vector2 pos2 = Vector2.Transform(hold, inv);

这是我听说的简化版

Matrix matrix1to2 = mat1 * Matrix.Invert(mat2);
Vector2 pos2 = Vector2.Transform(pos1, matrix1to2);

我不明白的是,为什么简化版的第一行不是

Matrix matrix1to2 = Matrix.Invert(mat2)*mat1;

因为按矩阵顺序,右边的东西会先生效,而在原来的情况下,我们先乘以 mat1

编辑:下图显示了所需的操作顺序

http://www.riemers.net/images/Tutorials/XNA/Csharp/Series2D/mat1.png

教程说要创建您使用的转换;

Matrix carriageMat = Matrix.CreateTranslation(0, -carriage.Height, 0) * Matrix.CreateScale(playerScaling) 
* Matrix.CreateTranslation(xPos, yPos, 0) * Matrix.Identity;

如果顺序是从左到右,为什么这行得通?

最佳答案

Since in matrix order the thing on the right would take effect first and in the original we have mat1 being multiplied in first

实际上,“左边”先生效。矩阵以您阅读它们的相同顺序应用于顶点(假设您习惯使用拉丁语)。

在 XNA 中,您通常按 SRT(缩放、旋转、平移)顺序执行转换。这样,对象将在移动到世界空间之前围绕其自身原点缩放和旋转(在自己的轴上旋转)。

例如:如果我想将一个对象旋转 Pi/2,即沿 X 轴移动它 100 个单位,我可能会使用:

var rotate = Matrix.CreateRotationY(MathHelper.PiOver2);
var translate = Matrix.CreateTranslation(new Vector3(100,0,0));

var worldMatrix = rotate * translate;

相反,如果我想将对象向右移动 100 个单位,然后围绕世界原点 (0,0,0) 旋转它以获得某种环绕效果(而不是像第一个那样旋转例如),我会使用

var worldMatrix = translate * rotate;

您还可以在其轴上旋转对象,将其沿世界 X 轴移动 100 个单位,通过以下方式绕世界原点运行:

var worldMatrix = rotateSpin * translate * rotateOrbit;

rotateSpinrotateOrbit 是旋转矩阵,分别定义自旋(围绕物体原点的旋转)和轨道(平移后围绕世界原点的旋转)。请注意,操作影响服务顶点的顺序是从左到右。

关于c# - 在 XNA、C# 中使用矩阵时对操作顺序感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9055842/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com