游戏开发中的矩阵与变换(2)

简介: 游戏开发中的矩阵与变换

为了执行代码旋转,我们需要能够以编程方式计算值。此图显示了从旋转角度计算变换矩阵所需的公式。如果这部分看起来很复杂,请不要担心,我保证这是您需要了解的最难的事情。


image.png


注意

Godot用弧度而不是度表示所有旋转。一整圈是TAU或PI * 2弧度,四分之一圈是TAU / 4或PI /

2弧度。使用TAU通常会使代码更具可读性。

注意

有趣的事实:除了Y在Godot中下降外,旋转还顺时针表示。这意味着所有数学和触发函数的行为都与Y-is-up

CCW系统相同,因为这些差异会“抵消”。您可以认为两个系统中的旋转都是“从X到Y”。

为了执行0.5弧度(约28.65度)的旋转,我们只需将0.5的值插入上面的公式并进行评估,以找出实际值应为:

image.png



这是在代码中完成的方法(将脚本放置在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的由来)。


翻译转换矩阵


更改原点向量称为转换变换矩阵。平移基本上是“移动”对象的技术术语,但是它显然不涉及任何旋转。


让我们通过一个示例来帮助理解这一点。我们将像上次一样从身份变换开始,不同的是这次我们将跟踪原始向量。


image.png


如果我们希望对象移动到(1,2)的位置,我们只需要将其原点矢量设置为(1,2):


image.png


还有一个translation()方法,该方法执行与直接添加或更改原点不同的操作。该translation()方法将对象转换相对于其自身的旋转。例如,当使用Vector2.UP translation()时,顺时针旋转90度的对象将向右移动。


注意

Godot的2D使用基于像素的坐标,因此在实际项目中,您将需要以数百个单位进行平移。



全部放在一起


我们将把到目前为止提到的所有内容应用于一个转换。接下来,创建一个带有Sprite节点的简单项目,并使用Godot徽标作为纹理资源。


让我们将翻译设置为(350,150),旋转-0.5 rad,缩放3。我已经发布了屏幕截图,并提供了复制代码,但是我建议您尝试复制屏幕截图,而不用看码!

image.png

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.


目录
相关文章
|
2月前
|
PHP 计算机视觉
罗德里格斯公式推导,以及如何使用cv2.Rodrigues进行旋转矩阵和旋转向量之间的相互转化
罗德里格斯公式推导,以及如何使用cv2.Rodrigues进行旋转矩阵和旋转向量之间的相互转化
83 0
|
2月前
|
Python
python实现:旋转矩阵转换为四元数
python实现:旋转矩阵转换为四元数
61 0
|
2月前
第4章-变换-4.1-基础变换
第4章-变换-4.1-基础变换
18 0
|
2月前
|
算法框架/工具
第4章-变换-4.2-特殊矩阵变换和运算
第4章-变换-4.2-特殊矩阵变换和运算
15 0
|
5月前
|
算法 图形学
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
144 2
|
前端开发 数据可视化 图形学
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
147 0
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
|
算法 图形学
【计算机图形学】实验三:二维图形变换
【计算机图形学】实验三:二维图形变换
227 0
【计算机图形学】实验三:二维图形变换
|
前端开发 数据可视化 API
【数学篇】05 # 如何用向量和坐标系描述点和线段?
【数学篇】05 # 如何用向量和坐标系描述点和线段?
186 0
【数学篇】05 # 如何用向量和坐标系描述点和线段?
|
机器学习/深度学习 算法 图形学
【计算机图形学】实验一:二维图形绘制
【计算机图形学】实验一:二维图形绘制
229 0
【计算机图形学】实验一:二维图形绘制
|
计算机视觉
数字图像处理实验(二)|图像变换{离散傅里叶变换fft2,离散余弦变换dct2、频谱平移fftshift}(附实验代码和截图)
数字图像处理实验(二)|图像变换{离散傅里叶变换fft2,离散余弦变换dct2、频谱平移fftshift}(附实验代码和截图)
401 0
数字图像处理实验(二)|图像变换{离散傅里叶变换fft2,离散余弦变换dct2、频谱平移fftshift}(附实验代码和截图)