Skip to content

三角面

图片示例

所有的3D图形对象,即使是球体,也是由三角形构成的。设计自己的对象的一种方法是将其构建成三角形。一个三角形需要三个 vertex 对象。根据三角形的顶点颜色和提供的光源,计算三角形的外观使用了法线:指向三角形表面外部的向量。在最简单的情况下,每个顶点处的法线垂直于三角形的表面,如下图所示。

一个三角形,显示三个顶点和每个顶点的法线。

如上图所示,如果相邻顶点的颜色不同,则颜色在两个顶点之间会平滑混合。

任何表面都可以用三角形网格来近似,而且表面的形状可以动态地改变。参见示例程序 Plot3DRug

顶点

python
myvertex = vertex( pos=vec(1,0,0), normal=vec(0,0,1), color=color.green )

参数

参数名类型说明
pos向量顶点的3D位置。
normal向量在最简单的情况下,是三角形平面的垂直向量。默认值为 <0,0,1>。对于在位置 p0、p1 和 p2 处的顶点,三角形的法线是 norm( cross( (p1-p0), (p2-p1) ) )
color向量此顶点的颜色。如果相邻顶点的颜色不同,则颜色将在顶点之间平滑混合。
opacity标量顶点的不透明度。
texpos向量一个3D向量,其 xy 组件给出纹理坐标。当前 z 必须为0。参见 纹理坐标
bumpaxis向量在该位置的凹凸贴图的x轴方向。默认 <1,0,0>。参见 纹理坐标
shininess标量默认为0.6;范围0-1。
emissive布尔值默认为False。如果为True,则对象发光,且失去所有阴影。

三角形

三角形中顶点的顺序

三角形的顶点必须按正确的顺序指定。右手法则是有用的:用右手的拇指指向法线的方向,手指从 v0 到 v1 到 v2 弯曲。换句话说,从上方向下看,从 v0 到 v1 到 v2 应该是逆时针的。

python
T = triangle( v0=myvertex0, v1=myvertex1, v2=myvertex2 )

或者

python
T = triangle( vs=[myvertexlist] )

参数:

参数名类型说明
v0顶点三角形的一个顶点。
v1顶点一个相邻的顶点,使用右手法则。
v2顶点一个相邻的顶点,使用右手法则。
vs列表包含三个顶点对象的列表,按顺序排列,使用右手法则。是指定每个顶点的另一种方法。
texture类.属性要应用于三角形的纹理。对齐使用了顶点的 texpos
visible布尔值如果为 False,三角形将不可见。
bumpmap类.属性与纹理相关联的凹凸贴图。
                                          |
python
a = vertex(pos=vec(-1,-1,0), color=color.red)
b = vertex(pos=vec(1,-1,0), color=color.green)
c = vertex(pos=vec(0,1,0), color=color.blue)
t = triangle(v0=a, v1=b, v2=c)

上述代码产生了下图:

_images/triangle1.png

旋转三角形的唯一方法是旋转每个顶点。

_images/tetrahedron.png

由四个三角形组成的四面体。三角形不共享顶点;每个三角形都需要三个相同颜色的顶点,法线垂直于表面。

平滑连接

一个对象可以由许多三角形组成。两个相邻的三角形可以共享顶点。然而,如果三角形不在同一平面上,连接处将是可见的,除非它被平滑。为了平滑连接,两个表面的法线必须平均化 (n1+n2)/2,并应用于所有共享的顶点。如果表面之间的角度很小,这样做效果最好。

例如,一个球体由许多三角形组成,每个顶点都与其邻居共享顶点;每个顶点的法线是共享该顶点的所有三角形的法线的平均值。

四边形

一个四边形是由四个 vertex 对象组成的四边形;有时指定四边形比指定三角形更方便,但在渲染之前,四边形实际上被分成了三角形。

四边形中顶点的顺序

四边形的顶点必须按正确的顺序指定。描述三角形的右手规则也适用于四边形:用右手的拇指指向法线的方向,手指从 v0 到 v1 到 v2 到 v3 弯曲。换句话说,从上方向下看,从 v0 到 v1 到 v2 到 v3 应该是逆时针的。

python
Q = quad( vs=[a, b, c, d] )

或者

python
Q = quad( v0=a, v1=b, v2=c, v3=d )

参数

参数名类型说明
v0顶点四边形的一个顶点。
v1顶点一个相邻的顶点,使用右手法则。
v2顶点一个相邻的顶点,使用右手法则。
v3顶点一个相邻的顶点,使用右手法则。
vs列表包含所有四个顶点按顺序排列的列表。是指定所有四个顶点的另一种方法。

旋转四边形的唯一方法是旋转每个顶点。

纹理坐标

为了将纹理或凹凸贴图应用到网格上,有必要指定纹理或凹凸贴图在网格上的位置。每个顶点都有 texposbumpaxis 属性来传达这些信息。您可能希望纹理仅占据对象的一部分,或者被拉伸或扭曲。这可以通过指定“纹素”坐标来完成,纹素坐标在顶点对象中以 texpos 向量给出。

表面纹理的纹素坐标由“x”和“y”指定,都在0到1之间,如果要显示整个纹理,从左到右,从底部到顶部。 (在许多讨论中,纹素坐标被称为“u”和“v”,或者称为“s”和“t”。)预期 WebGL 最终将使 3D 纹理成为可能,允许填充纹理体积,VPython 使用向量,但要求 texpos 向量的第三个分量为零。

例如,要用纹理填充一个四边形,顶点对象 v0、v1、v2 和 v3 中的 texpos 向量将是 vec(0,0,0),vec(1,0,0),vec(1,1,0),vec(0,1,0),无论 3D pos 属性是什么。如果您只希望纹理填充四边形的下四分之一,texpos 向量将是 vec(0,0,0),vec(0.5,0,0),vec(0.5,0.5,0),vec(0,0.5,0)。注意,<0,0,0> 在左下角,<1,1,0> 在右上角。