现在的位置: 首页 > 综合 > 正文

Windows Presentation Foundation (WPF) 3D 教程(二)—-3D模型基本知识

2018年05月05日 ⁄ 综合 ⁄ 共 1892字 ⁄ 字号 评论关闭

当我开始WPF的3D图形时,我不知道我在干什么。关于网格(Mesh),三角顶点(triangle index),向量等的意义,我没有任何提示。这是学习3D模型最痛苦的部分,因为只要有一点点的错误理解,WPF就不会显示正确结果(或者你会比较幸运)。总之,你需要真正弄明白什么是网格(mesh),并且它是由什么组成的。


什么是网格(Mesh)?

网格是表面(surface)的基本表征。网格通过点线系统来表征一个表面(surface),点用来描述表面区域的高和低,线连接点确保你从一个点到另外一个点。

一个完整的mesh由以下内容组成:
    网格坐标
    三角索引
    三角向量
 

Mesh坐标

Mesh的坐标就是surface上一个单一的点,点越密集,surface中的Mesh描述的就越精确。

 

Triangle Indeces
三角索引

三角索引就是一个网格坐标,它是网格中一个三角形中三个顶点中的一个。仅仅单单一些网格坐标不能描述网格三角。在坐标添加之后,你需要定义那些坐标定义那些三角形。


在WPF中,加入网格坐标的顺序非常重要。当添加坐标的时候,坐标集合中一个坐标的索引值会被用到。举个例子,假设说你有一个surface由5个坐标组成(p0,p1,p2,p3,p4),如果你想通过p1,p3,p4来定义一个三角形,你需要添加三角索引(triangle indeces)1,3,4(与p1,p3,p4点的索引相同)。如果坐标点的添加顺序是{ p3, p4, p0, p2, p1},并且你想定义一个相同的三角形,你需要加入的三角索引(triangle indeces)就是4,0,1。


添加三角索引的顺序也十分重要,当你定义了一个三角形,你基本上确定了顺时针或者逆时针的点(当然了这取决于你在三角形的那一侧)。它重要的原因是因为它影响三角形的哪一面是可见的。这里所说的“侧”,指的不是三角形三个边的侧面,而是平面的两侧。


假设说你从前面直视一个三角形的表面,如果你按顺时针方向定义它的索引,那么你所看的那一面是不可见的,而相反的一面是可以看到的。如果你按逆时针方向定义三角形索引,你所看的那一面是可见的,相反的一侧不可见。你可以使用“右手定则”去记住它。伸出你的右手,做“牛B”状。手肢卷曲的方向是逆时针,大拇指所指的方向是可见的。
 
我无法精确理解右手法则为什么应用于索引序列。我猜是因为wpf不认为渲染三角形的两个面是必须而且高效的,所以需要选择其中一面。

三角法线


在定义坐标和三角索引之后,你需要对每一个坐标添加一个三角法线。正如你添加到三角索引中的方向决定了三角形的那一面是可见的,wpf中的法线决定光源如何照射表面。


法线是一个垂直于三角形表面的向量。法线用“叉积”计算,两个向量分别是三角形的两个边。如果你通过A, B, 和 C三个点定义了三角形,你可以用AB x AC, BC x BA, 或CB x CA来计算这个法线。这三种方法的结果是一样的。当然了,在这里右手法则同样有效,AB x AC 和AC x AB所得的法线方向刚好相反。
 
通常,你希望你的法线方向和可见方向是相同的。当然,如果法线角度远离垂线方向,表面的三角形会有一个更有趣的光照效果。


网格中的每个坐标应该赋一个法线量,而且每个坐标有且只有一个法向量。你添加坐标的顺序应该和添加法向量的顺序保持一致。换句话说,发向量集中的索引值对应于坐标集中的索引值。


坐标越多,法向量就越多。法向量越多,光线和阴影就越逼真。在网格中,一个单一的点可能是多个三角形的索引。在这种情况下,你可能要使用相同多的多个点坐标,从而实现在该点有多个法向量。拿一个立方体的角来说,它是立方体中三个不同三角形(面)的交点。如果在该点你只用立方体其中的一个坐标来定义由三个面交叉形成的点,那么你只能在此坐标上使用一个法向量,结果,在该位置的另外两个面就不会以应有的方式遮盖。每个三角形应使用它们唯一的电,只有这样你才能在这个交点上使用三个向量,而不是一个。

至少,一个surface是一个平面。一个平面需要三个点去定义。因此, mesh中最简单的surface可以通过一个三角形(triangles)来描述。原来,Mesh也只能通过三角形来描述,那是因为三角形是最简单,最细化的定义网(Mesh)的方法。很明显,一个大而且复杂的表面(surface)不能用一个三角形来描述。相反,它可以近似的看做由许多小的三角形构成。你可以说你用矩形来定义平面,但是它没有三角形定义详细。你想,一个矩形可以分成两个三角形。两个三角形可以比一个矩形更加精确的描述一个表面。好,已经够了,这点你要清楚:网格通过许多的三角形来表征平面。

抱歉!评论已关闭.