Xna 如何从几何角度看缩放矩阵

Xna 如何从几何角度看缩放矩阵,xna,linear-algebra,Xna,Linear Algebra,我使用的是XNA,但对于本例来说,这并不重要。假设我有一个雪碧。然后我在任何事情之前应用一个缩放矩阵。缩放矩阵是应用于缩放精灵的局部轴还是仅向下移动点?换句话说,是将世界空间中0.5f的缩放矩阵应用于世界原点处的精灵,还是将精灵的局部轴向下缩放,还是仅将构成该精灵的所有点向下缩放一半 同样的方法也适用于平移和缩放。在我的脑海中,我描绘了一个30,30的平移矩阵,将精灵的局部原点移动到30,30,从而将精灵的局部轴移动到30,30。然后,缩放0.5f会缩小局部轴,但我不明白为什么精灵的原点现在会在

我使用的是XNA,但对于本例来说,这并不重要。假设我有一个雪碧。然后我在任何事情之前应用一个缩放矩阵。缩放矩阵是应用于缩放精灵的局部轴还是仅向下移动点?换句话说,是将世界空间中0.5f的缩放矩阵应用于世界原点处的精灵,还是将精灵的局部轴向下缩放,还是仅将构成该精灵的所有点向下缩放一半

同样的方法也适用于平移和缩放。在我的脑海中,我描绘了一个30,30的平移矩阵,将精灵的局部原点移动到30,30,从而将精灵的局部轴移动到30,30。然后,缩放0.5f会缩小局部轴,但我不明白为什么精灵的原点现在会在15,15

这种混淆使以下事实更加复杂:在世界范围内,你在x轴上向右平移1,你现在根据你应用的比例移动(因此你在世界范围内只移动0.5)。这使我相信比例是应用于对象自身的轴的

顺便说一句,如果你们在接下来的讨论中谈到起源,你能说明你指的是哪个起源吗


感谢

通常,精灵由其顶点(点)定义。将缩放矩阵应用于精灵将变换精灵的顶点(点)

比例矩阵始终假定(0,0)是比例变换的原点。因此,如果缩放以(30,30)为中心的精灵,所有点都将从(0,0)点延伸。如果有帮助,可以将精灵想象为(0,0)点周围圆圈上的一个小点,并缩放整个圆圈

如果要在离精灵中心(30,30)的位置缩放精灵,必须先将精灵中心平移到(0,0),然后在执行缩放后将精灵平移回(30,30)

这就是:

   Translate(-30, -30)
   Scale(0.5)
   Translate(30, 30)

为了扩展Empyrean的答案,3D世界通常至少有四个坐标系,每个坐标系都有自己的本地原点:

  • 对象空间
  • 世界空间
  • 摄像机空间
  • 视图空间(2D!)
有三个转变:

  • 反对世界
  • 世界对摄影机
  • 摄像机观看
通过“模型到对象”的转换,可以创建新的坐标系,例如“模型空间”。使用此功能,您可以获得一系列步骤:

模型->比例->对象 对象->旋转->平移->世界 世界->旋转->平移->摄影机 相机->透视->视图

在OpenGL中,您可以按上面列出的相反顺序推送矩阵,因此最后推送的是模型->对象变换,OpenGL应该正确地渲染对象。我假设XNA/DirectX有一个类似的系统

更复杂的是,模型空间可以在树中具有平移、缩放和旋转的层次结构,以生成骨骼系统,然后可以使用骨骼系统变形模型网格。这通常称为剥皮


因此,为了回答这个问题,例如,根据应用旋转变换的变换,您将得到不同的结果。在模型->对象变换中,模型将围绕对象的原点旋转。在“对象->世界变换”中,对象将围绕世界原点旋转。

如果以某种方式思考,我想我现在有点明白了。在开始时,我的局部轴和世界轴是相同的,因此x方向1的平移是1的平移,因为世界和局部空间的比例相同。应用0.5f的比例将基本上缩小局部空间的像素宽度,因此点会缩小,世界坐标结果是一个坐标,该坐标被切成两半。现在如果我要翻译这个精灵,会发生的是沿着局部空间的缩小轴进行的翻译,我们可以识别世界坐标。最后一句话听起来不对。在你的问题中,你谈到了转换然后缩放精灵。在这里,您讨论的是缩放,然后是转换。这是两种截然不同的行动。如果缩放(0.5),然后平移(30,30),最后在点(30,30)处得到一个大小为一半的精灵。如果平移(30,30),然后缩放(0.5),则最终在点(15,15)处得到一个大小为一半的精灵。该点是缩放始终从点(0,0)开始工作的点。如果进行缩放时精灵的中心不在(0,0),则它将是偏离中心的缩放。