为了执行代码旋转,我们需要能够以编程方式计算值。此图显示了从旋转角度计算变换矩阵所需的公式。如果这部分看起来很复杂,请不要担心,我保证这是您需要了解的最难的事情。
注意
Godot用弧度而不是度表示所有旋转。一整圈是TAU或PI * 2弧度,四分之一圈是TAU / 4或PI /
2弧度。使用TAU通常会使代码更具可读性。
注意
有趣的事实:除了Y在Godot中下降外,旋转还顺时针表示。这意味着所有数学和触发函数的行为都与Y-is-up
CCW系统相同,因为这些差异会“抵消”。您可以认为两个系统中的旋转都是“从X到Y”。
为了执行0.5弧度(约28.65度)的旋转,我们只需将0.5的值插入上面的公式并进行评估,以找出实际值应为:
这是在代码中完成的方法(将脚本放置在Node2D上):
float rot = 0.5f; // The rotation to apply.
Transform2D t = Transform2D.Identity;
t.x.x = t.y.y = Mathf.Cos(rot);
t.x.y = t.y.x = Mathf.Sin(rot);
t.y.x *= -1;
Transform = t; // Change the node's transform to what we just calculated.
要从现有的变换矩阵计算对象的旋转,可以使用atan2(txy,txx),其中t是Transform2D。
注意
在实际项目中,可以使用 rotation ()方法执行旋转。
变换矩阵的基础
到目前为止,我们只使用了x和y向量,它们负责表示旋转,缩放和/或剪切(高级,最后进行了介绍)。X和Y向量一起称为变换矩阵的基础。术语“基础”和“基础向量”很重要。
您可能已经注意到,Transform2D实际上具有三个Vector2值:x,y和origin。该原点值不是基础的一部分,但它的变换一部分,我们需要它来表示位置。从现在开始,我们将在所有示例中跟踪原始向量。您可以将起源视为另一列,但通常最好将其完全分开。
请注意,在3D,陀有一个单独的基础保持三个结构的Vector3的基础值,因为代码可能会很复杂,它是有道理的把它从分离变换(这是由一个 基础和一个额外的Vector3的由来)。
翻译转换矩阵
更改原点向量称为转换变换矩阵。平移基本上是“移动”对象的技术术语,但是它显然不涉及任何旋转。
让我们通过一个示例来帮助理解这一点。我们将像上次一样从身份变换开始,不同的是这次我们将跟踪原始向量。
如果我们希望对象移动到(1,2)的位置,我们只需要将其原点矢量设置为(1,2):
还有一个translation()方法,该方法执行与直接添加或更改原点不同的操作。该translation()方法将对象转换相对于其自身的旋转。例如,当使用Vector2.UP translation()时,顺时针旋转90度的对象将向右移动。
注意
Godot的2D使用基于像素的坐标,因此在实际项目中,您将需要以数百个单位进行平移。
全部放在一起
我们将把到目前为止提到的所有内容应用于一个转换。接下来,创建一个带有Sprite节点的简单项目,并使用Godot徽标作为纹理资源。
让我们将翻译设置为(350,150),旋转-0.5 rad,缩放3。我已经发布了屏幕截图,并提供了复制代码,但是我建议您尝试复制屏幕截图,而不用看码!
Transform2D t = Transform2D.Identity; // Translation t.origin = new Vector2(350, 150); // Rotation float rot = -0.5f; // The rotation to apply. t.x.x = t.y.y = Mathf.Cos(rot); t.x.y = t.y.x = Mathf.Sin(rot); t.y.x *= -1; // Scale t.x *= 3; t.y *= 3; Transform = t; // Change the node's transform to what we just calculated.