图形卡将向量的第四个元素作为最终位置怎么办?


25

这个问题看来,您将需要一个四元素位置矢量,因为使用矩阵乘法修改其位置更简单。

就其本身而言,这意味着在将第四个元素视为3D点的表示时(假设不进行变换)应该简单地忽略它,但是我知道这是不正确的,因为当我将vector4提供给GPU时,如果第四个元素元素不是一个,它不会呈现-为什么?

栅格化器中的第四个元素有什么意义?

编辑:经审查,这个问题措辞不佳;第二段更准确地说:“如果第四个元素的值不在某个范围内,则不会'正确'/'按预期'呈现。”


坐标为(x,y,z,0.5)的vector4是否给出与坐标为(2x,2y,2z,1)的vector4相同的结果?
FxIII

@FxIII,我无法完全重现该内容,但您是对的,这是我在原始帖子中做出的不正确的一句话,经过更多实验后,我对其进行了更新。
sebf 2011年

Answers:


23

第四个部分是跟踪透视投影的技巧。进行透视投影时,您需要除以z:x'= x / z,y'= y / z,但这不​​是可以通过对x的矢量进行运算的3x3矩阵来实现的操作, y,z。达到此目的的标准技巧是附加第四个坐标w,并声明在应用了所有转换之后以及在栅格化之前,x,y,z将始终被w除。

然后,通过具有将z移至w的矩阵来完成透视投影,以便最终除以z。但是,如果您不想进行除法运算,也可以灵活地将w = 1.0。例如,如果您只想要平行投影,旋转或任何其他方式。

可以将位置编码为w = 1,方向编码为w = 0,并使用矩阵的第四行/列进行平移,这是一个不错的附带好处,但这不是附加w的主要原因。可以使用仿射变换(3x3矩阵加3分量翻译向量)来完成翻译,而看不到任何w。(必须跟踪一个位置和一个方向,并对每个位置应用不同的转换函数;这有点不方便,但实际上没什么大不了的。)

(顺便说一句,从数学上讲,用w增强的向量被称为齐次坐标,它们生活在一个称为投影空间的地方。但是,您不需要了解更高的数学即可制作3D图形。)


再者,用这些术语来谈论向量和点是有点不正确的,因为在点和向量之间存在同构(点和将原点移动到该点的向量是同一实体)。谈论点/向量(w!= 0)和(投影)方向(w = 0)会更正确。无论如何,滥用术语“向量”是3d库语言中一个非常统一的标准。
FxIII,2011年

@FxIII:已更正。在同一篇文章中,在标准数学意义上使用“向量”并作为“方向”的同义词令人困惑。
Nicol Bolas

@FxIII和Nicol Bolas:我不同意。您确实确实将向量编码为w = 0-包括仅代表方向的向量和长度很重要的实际向量。例如,您可以使用对象的矩阵在局部空间和世界空间之间变换对象的角速度矢量(方向=旋转轴,长度=速度)。您不希望角速度使对象的平移添加到其中;您只希望它旋转。因此,您将w设置为0。我看不到问题吗?
内森·里德

@NathanReed我希望我的帖子有助于阐明这一点,无论如何,我的大部分意思是关于定义以及术语向量的滥用以及线性代数相对于标准3D库术语的优越性。当然,两者都是有争议的,因为每个定义和优先权要求都为
FxIII '10

@Nathan,我现在可以清楚地看到第四个元素的用途,以及光栅化程序如何使用其中包含的信息。非常感谢!
sebf 2011年

10

为了回答Natan的适当评论,我做了一些考虑,这些理解对于理解当您在仿射空间中使用向量来表示标准欧几里得空间中的3D向量时会发生的情况很有用。

首先,我将称向量为具有坐标的任何东西,因此点和向量是同一实体;您可以看到一个向量为两点之差:V = B - A ; V移动 因为 + V = + - = 。设A = 0(原点),您将得到V = B - 0 = B:点B和移动0的向量B是同一回事。

当仿射空间的向量的w = 0时,我将在大多数3D库中使用的意义上称为“向量”

之所以使用矩阵,是因为它们使您能够以紧凑/优雅/高效的形式表示线性函数,但是线性函数的主要缺点是无法转换原点:如果F要线性,则F (0)= 0( AMOG其它事情,例如F(λ X)=λF(X)和F( + )= F()+ F())

这意味着您将无法构造进行转换的矩阵,因为您永远不会移动0向量。仿射空间在这里发挥作用。仿射空间为欧几里德空间增加了一个维度,因此可以通过缩放和旋转来进行平移。

从某种意义上说,仿射空间是一个射影空间,您可以在仿射向量和欧几里得向量之间构造等价关系,以便将它们混淆(就像我们对点和向量所做的那样)。所有以相同方向投射到原点的仿射向量都可以看作是相同的欧几里得向量。

这意味着所有在坐标中具有相同比例的矢量都可以视为等效的:

数学上:

等价

也就是说,每个仿射向量都可以简化为w = 1的佳能版本(我们在每个等效向量中选择最喜欢的一个)。

视觉上(2D欧式-3D仿射):

视觉对等

因此,“射影”空间的均值;您应该注意到,这里的欧几里德空间是2D(青色区域)

存在一组特殊的仿射向量,它们不能(轻松地)置于(超)平面w = 0上的经典形式。

我们可以直观地显示它:

在此处输入图片说明

您(应该)看到的是,当w-> 0时,投影到欧几里得空间中的向量将到达无限大,但在特定方向上会到达无限大。

现在很明显,当您将和向量视为欧几里得空间中的投影向量时,将投影向量中的两个向量相加会导致问题,这是附加的,因为您将对仿射空间中的W分量求和,然后将它们投影到欧氏(超)平面。

这就是为什么您只能将“点”与“向量”求和的原因,因为“向量”不会更改“点”的w坐标,这仅对于w = 1的“点”才成立:

在此处输入图片说明

如您所见,绿点是将代表青色“点”V“向量”的两个仿射向量相加而获得的,但是,如果将V应用于每个仿射向量,其典范与典范不同,则将获得错误的结果(红色的““ point”“)。

您将看到仿射空间不能透明地使用来形容欧氏空间操作和术语“载体”的滥用有计算和的(严格)约束下的意义佳能投影载体

也就是说,除非您真的知道自己在做什么,否则认为GPU假设Vector4必须具有w = 0 w = 1 是很合理的。


很难为这个问题选择一个答案,因为所有答案都有助于理解如何使用第四部分的关系以及为什么需要第四部分的关系。您对欧几里得空间和仿射空间的解释非常有帮助,如果没有那么详细的说明,我当然不会像现在那样理解它。非常感谢你!
sebf 2011年

+1为投影空间提供了一个很好的解释(和图表!)。但是,仿射空间和射影空间不是一回事(请参阅Wikipedia仿射空间的定义)。也许这样说是一个好方法:射影3空间和仿射3空间都可以嵌入到R ^ 4中,但是嵌入并不完全是辅音。从w到0的仿射空间对向量进行编码是可能且有用的,但从投影的角度来看是没有意义的。同样,从仿射的角度来看,投影方向(无穷远点)也没有意义。
内森·里德

1

假设一个向量如(x,y,z,w)。该向量具有4个分量x(空间中的x坐标),y(空间中的y坐标),z(空间中的z坐标)和有趣而神秘的w分量。实际上,大多数3d游戏都在4d空间中运行,也称为4d同质空间。它有一些明显的好处->

1>它可以帮助我们将平移和旋转矩阵合并为一个矩阵,但是您可能在想它的用途是什么,我们可以将平移和旋转矩阵相乘,仅此而已,但是如果没有我们所有向量中的w分量,然后以任何方式将3d向量(xyz)乘以平移和旋转的组合矩阵时,我们将不知不觉地用x,y或z缩放值(这就是矩阵乘法的工作方式),这将可能由于缩放而损坏了位置矩阵(组合矩阵的平移部分)。为解决此问题,引入了第4个分量向量,并且向量的w分量在99%的情况下将保持值为1.0。具有未缩放的位置值(平移)。矩阵表示为->

 [x y z w] [rx1 rx2 rx3 1]
           [ry1 ry2 ry3 1]
           [rz1 rz2 rz3 1]
           [px  py  pz  1]

然后我们有了简单而强大的矩阵。:)

2>我们在透视投影阶段将z值复制到w分量中,并用x,y进行除法。这样,对象从屏幕上移开时会变短。


谢谢!我越来越看到在3D空间中实体的任何真正有用的表示形式中都使用第四部分的必要性。
sebf 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.