我正在使用XNA,但这个例子并不重要。所以,假设我有一个精灵。然后我在任何事情之前应用缩放矩阵。是否应用缩放矩阵缩放精灵的局部轴或仅将点移动?换句话说,将世界空间中0.5f的缩放矩阵应用于世界原点的精灵,缩小精灵的局部轴或者将构成精灵的所有点减半;
同样适用于翻译然后缩放。在我的脑海中,我想象一个30,30的平移矩阵,将精灵的局部原点移动到30,30,结果,精灵的局部轴到30,30。然后,缩放0.5f会缩减本地轴,但我不明白为什么精灵的原点现在是15,15。
这种混乱加剧了这样一个事实:你在世界的x轴上执行1的右翻译,你现在正在根据你应用的比例移动(所以你只能在世界上移动.5 )。这使我相信比例应用于对象自己的轴。
顺便说一句,如果你们谈到你的后续内容的起源,你能说出你所指的是哪个起源吗?由于
答案 0 :(得分:1)
通常,精灵是由它的顶点(点)定义的。将缩放矩阵应用于精灵将转换精灵的顶点(点)。
比例矩阵始终假定(0,0)是比例变换的原点。因此,如果缩放以(30,30)为中心的精灵,则所有点都将从(0,0)点延伸。如果它有所帮助,可以将精灵想象为围绕(0,0)点的圆上的一个小点,整个圆圈将被缩放。
如果你想要从精灵中心(30,30)缩放精灵,你必须先将精灵的中心转换为(0,0),然后将精灵转换回(30, 30)在完成量表之后。
那就是:
Translate(-30, -30)
Scale(0.5)
Translate(30, 30)
答案 1 :(得分:0)
为了扩展Empyrean的答案,3D世界通常至少有四个坐标系,每个坐标系都有自己的本地原点:
有三个转换:
您可以使用“模型到对象”转换创建新的坐标系,例如“模型空间”。使用此功能,您将获得一系列步骤:
模型 - >规模 - >宾语 对象 - >旋转 - >翻译 - >世界 世界 - >旋转 - >翻译 - >相机 相机 - >观点 - >图
在OpenGL中,您可以按照上面列出的相反顺序推送矩阵,因此Model-> Object转换是最后推送的,OpenGL应该正确渲染对象。我认为XNA / DirectX有一个类似的系统。
变得更复杂,模型空间可以在树中具有翻译,缩放和旋转的层次结构,以生成骨架系统,然后可以使用该骨架系统来变形模型网格。这通常称为蒙皮。
因此,要回答这个问题,例如,根据您应用旋转变换的变换,您将获得不同的结果。在Model-> Object转换中,模型将围绕对象的原点旋转。在Object-> World转换中,对象将围绕世界的原点旋转。