OpenGL中齐次坐标背后的真相和坐标的归一化

翻译原文:http://deltaorange.com/2012/03/08/the-truth-behind-homogenous-coordinates/

游戏程序员定期处理齐次坐标。它们是标准三维向量的整齐扩展,并允许我们简化各种变换。但你真的知道,他们的意思是什么?

通常,gamedevs描述了像这样的齐次坐标:“你添加第四个坐标到你的Vec3并调用它。哦,w通常设置为1.现在您可以使用单个矩阵*向量操作进行旋转和翻译。很酷,不是吗 8)当你做一个投影时,结果将会有w!= 1。要得到投影点,你必须除以w,以便在(x / w,y / w,z / w,1)w等于1再次。这被称为规范化!“有时候甚至可以添加:”如果w等于0,那么(x,y,z,0)被称为“向量”,如果w等于1,那么它被称为“点”。矢量是方向,不会受到翻译和点的影响。

由于我的背景是数学,而不是计算机科学,所以这些解释总是让我有点不舒服。因为他们是真实的,说实话,他们可能是你作为游戏程序员所需要的一切。如果没有,那么你现在可以停止阅读。但是如果你想要更多的背景信息,那么请继续。

你还在读书吗 好。引入线性代数中的齐次坐标来描述投影空间。这就是Mathworld对投影空间的看法。如果你现在在想“WTF?”,那么我同意。数学家倾向于以简单的方式来描述简单的事物,除了他们之外,除了律师和医生之外,没有人可以理解它。

让我把它翻译成英文。为了进一步简化,我将使用2D平面来解释这个概念。这允许我画一些图来说明投影机。齐次坐标添加另一个维度,即w坐标。由于我的4D绘图技巧不是很好,只需更容易查看2D平面的齐次坐标。

步骤1:  为什么发射投影几何?答案:数学家不喜欢规则的例外。他们真的鄙视他们。在一个平面上,以下陈述是真实的:“两条不同的线在恰好一点相交,除非它们是平行的。”你的平均数学家现在将轮到“哦,那些死的平行线。我希望他们不会存在!“

步骤2:但有一天,数学家有一个想法:“等一下,如果我们可以推广欧氏几何?让2D平面嵌入3D空间。我们将通过调用所有通过原点(0,0,0)“点”的线条来执行此操作,然后我们将调用所有通过原点“线”的平面线。“所以基本上他建议的是增加基元的维度一个维度。点 - >线,线 - >飞机。整个3D空间称为投影飞机。

步骤3:如果你认为:“你在说什么?”然后别担心。很快就会变得更加清晰。(哦,我指着z轴向下,这样以后的照片会更容易画出来。)

只要考虑一下:通过原点的每一行都可以写成k *(x,y,z),其中(x,y,z)!=(0,0,0)。这也意味着例如k *(1,2,3)代表与k *(5,10,15)相同的行,因为(1,2,3)和(5,10,15)是共线的(这是数学的演讲为同一行)

步骤4:现在让我们将平面z = 1的一些“点”(即绿线)和“线”(即红色平面)相交(在此图中为蓝色)

你可以看到,原点的绿线与点相交。红色平面与平面相交。平面z = 1称为投影平面的仿射视图

步骤5:  那么为什么我们这样做呢?看看我们谈到的“点”(即绿线)。所有的“点”,它的形式为K *(X,Y,Z),其中的线z是不为零相交我们的仿射认为,Z = 1平面。

k *(x,y,z)被称为投影“平面”(实际上是整个3D空间)上的“点” 的齐次坐标(aha!)。例如,如果k *(12,8,4)是一个“点”的坐标,则(12,8,4)是一个代表,(3,2,1)是其归一化形式。

现在我们从图中移除坐标轴。那么剩下的就是我们的仿射视图,看起来就像一个沼泽标准的2D平面,绿色点(这是实际的点)和红线(这是一条真正的线)。

步骤6:那么z = 0的点呢?具有坐标k *(x,y,0)的点称为“消失点”  (或无限远点),并且它们不与平面z = 1相交。

对他们有什么好感?让我们回顾一下线条和恐慌数学家的交集。如果你采取两个投影“线”(它们是通过原点的平面),那么它们将始终(!)通过原点相交,因为我们现在知道的是一个“点”。如果“线”不平行(即,它们的平面与z = 1的交点不平行),则所得到的“点”也将与平面z = 1相交。如果这听起来令人困惑,那么我希望这张照片能够清除。

如果“线”是平行的,这意味着它们将在平行于z = 1的“点”=线中相交,因此它将是“消失点”。例如这两个红色平面(=“线”)在x轴上的k *(1,0,0)相交。

所有“消失点”一起形成一条线:平面z = 0,称为“消失线”。

步骤7:  结论:在投影飞机中,我们终于可以说“所有的线都在一点相交”。对于超级好的数学家来说,这让他们睡得更好。

步骤8:  为什么平行于z = 1的线路称为“消失点”?记住,z = 1只是我们投影机的一个仿射视图。我们可以采取任何其他飞机(不通过原点),并与我们的“点”和“线”相交以获得另一个仿射视图。例如,如果您将平面z = 1倾斜一点,使其与x轴相交,那么您将能够“看到”消失点,这是上图中两条平行线的交点。

你可以每天看到这个效果。看火车轨道。它们是平行的,但是当你看着它们消失在远处,他们似乎在一个无限远的地方相交。因此,投影几何实际上是在投影时对欧几里德几何进行研究。

步骤9:另一种可视化投影飞机的方法将是想像一个以起源为中心的球体。那么所有的“行”将会在球体上的一对匹配点中产生圆和“点”。这种方法的优点是在正常和消失点之间不会有任何区别。但是这种模式比仿射视图更不直观。

步骤10: 总结:齐次的3D坐标(它们是4D)仅仅是我之前解释过的东西的概括。坐标用第四个坐标w扩展。如果一个是另一个的倍数,则两个向量(x,y,z,w)和(x',y',z',w')表示3D空间中的相同点。(x,y,z,1)称为归一化形式。形式(x,y,z,0)的点再次称为“消失点”。

区别点vs矢量是我只在计算机科学的背景下听到的。但是我承认说(x,y,z,0)是“方向”,(x,y,z,1)是“点”。当您在我们的投影平面上思考时,可以通过点p =(x,y,1)和点d =(dx,dy,0)来描述每个“线”(这是通过原点的平面)。这两个向量肯定不会共线,因此总是跨越一个“线”(=平面)。s * p将是与z = 1相交的“点”,t * d是可以解释为线的方向的消失点,这正是我们如何定义正规仿射线:p + k * d。

投影几何使您可以使用单个矩阵运算(但您已经知道)编写仿射变换。还可以使用矩阵运算来编写投影。最简单的是(x,y,z,1) - >(x,y,z,z)。重整化后,我们得到(x / z,y / z,1,1)。但请记住:投影空间(x / z,y / z,1,1)和(x,y,z,z)表示相同的点。

仿射视图的相似类比适用于3D空间。基本上,我们的世界只是一个3D投影空间的单3D 3D仿射视图嵌入在4D!下次尝试用CSI技术打动人心!

(感兴趣的是:数学家对投影飞机的喜欢还是符合双重性的  原则。简化这意味着关于点和线的任何定理可以通过交换单词行和点并将“相交”改变为“包含”来转换成“双重”定理。最简单的是“对于两个不同的点,总是包含它们的一行。”双重语句是“两个不同的线总是在一个点相交”。显然这对于​​仿射线是不正确的,因为平行线,但对于投影飞机,这个说法是真的。并且可以证明,对于投影机中真实的所有声明,双重声明也是如此。为什么这很重要?因为如果一个定理难以证明,那么也许它的双对应更容易证明哪一个会导致证明双重版本。)

好的,就是这样。我希望我能够对齐次的坐标进行神秘化,也不会混淆你。它不会改变您在3D引擎中使用它们的方式,但也许您现在将以不同的方式看待它们。在投影几何领域使用齐次的坐标,其概括了仿射几何。

顺便说一句:四元数也没有被发明,让游戏开发者做好旋转。但这是一个不同的故事...

更新(2013年1月28日):当涉及齐次坐标时,术语“归一化”可能会令人困惑。要清除它:当我们处理齐次坐标(x,y,z,w)时,归一化形式意味着w == 1。当谈到普通的三维坐标时,则归一化意味着长度为== 1。在上述文章中,只要我使用术语“归一化”,我的意思是在归一化的齐次坐标的意义上是非单位长度。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值