广告牌精灵绘图背后的数学原理是什么? (逆矩阵)

What is the math behind billboard sprite drawing? (inverse matrix)

我在本网站 Rayacasting Tutorial, in order to create a 3D perspective in a 2D map similar to an old game known as Wolfenstein_3D 中关注 "Raycasting Tutorial"。

目前为止的结果如图所示:

我感到困惑的是渲染始终面向相机方向的广告牌 2d 精灵背后的数学。

这是广告牌 2d 精灵的样子:

我遵循了有关精灵渲染的教程,您可以在此处找到它 Draw_Sprite,并且我设法在我的场景中显示广告牌精灵,如您在第一张图片和教程中所见,他们使用了逆矩阵, 他们将精灵的相对位置乘以相机矩阵的逆矩阵。

精灵的相对位置与2个坐标相结合,因为我们正在处理2d地图,如下所示:

而相机矩阵如下:

在我之前提到的教程中,他们将精灵的相对位置乘以相机矩阵的逆矩阵,如下所示:

但我不明白它是如何工作的,为什么我们需要将相机矩阵的逆矩阵乘以我们精灵的矩阵,我想了解它背后的逻辑,这个公式如何使精灵旋转到一直对着镜头的方向?! 我还是游戏开发新手。

首先是一些数学背景:

2D 的 2x2 矩阵仅包含旋转矩阵。这意味着:

mat2 m;    // rotation matrix
vec2 a,b;  // 2D points

b = m*a;   // rotates a by m and stores into b

如果乘以倒数:

mat2 n;
n = inverse(m);
b = n*b;

你得到了原始position a因为逆矩阵和正矩阵相乘是单位矩阵:

           b =            m*a 
inverse(m)*b = inverse(m)*m*a 
inverse(m)*b =              a 

然而,使用矩阵进行 2D 射线投射是非常不寻常的,因为它会使事情复杂化。参见:

  • .

同样仅使用旋转矩阵意味着您必须在旋转之前或之后自行 offset/translate。所以我敢打赌你正在用这样的代码做:

a = rotation_matrix*a;
a += translation;
a = Inverse(rotation_matrix)*a;

正如我在纯旋转矩阵的评论中提到的,Transpose 函数与其逆函数相同,因此对于 2D:

m = a0 a1    inverse(m) = transpose(m) = a0 a2
    a2 a3                                a1 a3

有关矩阵的更多信息,请查看:

有更多 possible 符号来做这个数学(使用直接或逆矩阵,使用 row/column 主阶,乘阶等......这可能会稍微改变方程式)。

但是您的矩阵描述似乎不正确。应该是:

| camerax.x cameray.x |
| camerax.y cameray.y |

所以基本上世界坐标中的 2 个方向向量(一个用于 camera/player 的 x 轴,一个用于 y 轴)(但相机平面法线平行于另一个方向,所以它是相同的......只是混淆了很多)

现在我是这样看的:

玩家就是你的相机,所以你需要 os 将精灵世界 postion sw 转换为玩家坐标 sp。然后渲染精灵平行于玩家 xz 平面(或者任何其他如果你的轴配置不同)。

所以让 mp 成为玩家旋转矩阵和 pp 玩家世界 pos 则:

sp = mp*(sw-pp)

是精灵转换成玩家坐标。但是,根据您的引擎,您可能需要在世界坐标中平行于玩家 xz 的假墙。所以墙会在:

sprite_wall_vertexes = sw (+/-) (inverse(mp)*sprite_half_size)

感谢 @Spektre 我能够理解为什么我们将精灵的相对位置乘以相机矩阵的逆矩阵,我只是想添加更多信息和解释.

嗯,首先,让我们看看下图中我们的玩家位置:

我们可以看到PlayerPos是(2,1),SpritePos是(2,3),我们要做的第一件事就是根据Player Position知道精灵的位置,所以:

SpriteX = SpritePosX - PlayerPosX = 2 - 2 = 0
SpriteY = SpritePosY - PlayerPosY = 3 - 1 = 2

那么我们的精灵位置根据玩家的位置就是(0,2),也就是上图中的红色向量表示。

但是如果我们不将红色向量坐标与相机矩阵的逆矩阵相乘会发生什么?

然后我们将使用从玩家位置到 sprite 位置的真实距离,当相机视图旋转时,红色矢量将随之旋转,所以当你绘制你的 sprite 时它总是垂直的CameraPlane 我们不希望它发生。

这是图中的样子:

这是它在游戏中的样子:

现在,如果我们将精灵的相对位置 (红色向量) 与相机矩阵的逆相乘会发生什么?

如您所知,正如评论部分中提到的 @Spektre

"by multiplying inverse matrix you cancel previous rotation ... its 'unrotating' back"

,所以当我们将精灵的相对位置(红色向量)乘以相机矩阵的逆时,camera/player的旋转不会影响红色矢量,它将保持静止,我们将根据相机视图获得红色矢量的新坐标。

如果我们将红色向量与相机矩阵的逆相乘,图中会发生以下情况:

并且在游戏中: