将广告牌放置在给定的距离,使其在屏幕上占据一定的尺寸

问题描述

我有一个使用简单比例矩阵(S)放置在屏幕上的矩形。现在,我想将此矩形放置到“ 3D空间”中,但使其像以前一样出现在屏幕上。我发现可以通过反向应用视图矩阵和投影矩阵来做到这一点。像这样:

S' = (V⁻¹ P⁻¹ S)
Matrix = P V (V⁻¹ P⁻¹ S)

到目前为止,这个方法工作正常。我的矩形现在就像一个广告牌,我可以像对待其他任何对象一样对待它,分别应用PV,它会正确显示。但是,这里存在一个退化:我没有指定对象放置的深度。它可能是两倍远,但 x 大一倍!

这一点很重要的原因是我想为矩形设置动画,例如绕Z轴旋转或在3D空间中移动。然后,我希望它停下来并在屏幕上定位为像素完美。

如何在给定的z距离上放置平面对象 ,使其以某种方式出现在屏幕上?我已经有了缩放矩阵,无需任何3D转换就可以在OpenGL中显示它,这是用于以NDC或屏幕坐标显示它的矩阵。我也有要使用的投影和视图矩阵。如何将其转换为所需的模型矩阵?

解决方法

如何将平面对象放置在给定的z距离处,使其以某种方式出现在屏幕上[...]

实际上,您想在视图空间中绘制对象。为仅包含一个翻译成分(0,0,-z)的对象定义一个模型矩阵,并在绘制该对象时跳过视图矩阵。

,

通常,将3D顶点v转换为2D点p的顺序写为矩阵乘法。 [根据您使用的API,顺序可能相反。我在这里使用的表示法是glsl-友好]

post_worker_init
可以将模型矩阵M分解为许多子组件,例如T平移,S标度和R旋转。当然,这里的顺序很重要。

要围绕其自身旋转对象或顶点,请首先旋转它(就像它已经在原点一样),然后将其平移到所需的位置,例如,使用具有坐标(x,y,z的向量v) )。

p = P * V * M * S * v

v = vertex (usually 3D of the form x,y,z,1)
P = projection matrix 
V = view (camera) matrix
M = model matrix (or world transformation)
S is a 4x4 object-scaling matrix 

matrices are usually 4x4 with the last line/column 0,1

要围绕任意点q旋转对象,请先对其进行平移,使其相对于该点(即q在原点,因此从v中减去q)。然后通过应用R绕q(在原点)旋转。最后将对象放回原处(因此再次添加q)。

R is a typical 3x3 rotation matrix embedded in a 4x4 with 0,1 on the last line

v is a 3D vector with coordinates (x,z)
T is a 4x4 translation matrix,all zeroes except the last column where it has x,1 

M = T * R (first R,then T)

此外,在翻译之前,请先缩放对象(即S在乘法运算的末尾),以将翻译保持为世界单位。在完成所有转换后进行缩放,实际上也对所有平移进行缩放,并且对象将在缩放的距离上移动。