姓名:卜凡

学号:2020211066

指导老师:符强

日期:2022-05-17 ~ 23

[#] 作业内容

  1. 在第二次作业的基础上,将运动物体改为点光源,旋转中心的物体(可以是第二次作业中的细分对象)需要使用三角形或四边形网格绘制(不能用线框模型绘制),并设置其表面的材质参数。
  2. 程序运行时,可以看到点光源的运动,同时可以看到中心物体表面的明暗随着点光源的运动发生周期变化。
  3. 总结报告,需包含 PyOpenGL 中设置材质参数和光源的代码,以及点光源在不同位置下的绘制效果截图。

[1] 多边形面:求解法向量并绘制

1.1 坐标点类增加运算支持

为了求解多边形的法线,在坐标点类中增加以下运算支持:

# 表示三维坐标中的点。
class Point(object):

	# ... 见上次作业或 "附录 · 完整代码"

	# 定义 @ 运算符: Point 之间的向量积
	def __matmul__(self, other) -> object:
	    return Point(self.y * other.z - self.z * other.y, 
	                 self.z * other.x - self.x * other.z, 
	                 self.x * other.y - self.y * other.x)
	
	# 定义 ~ 运算符: Point 标准化(方向不变,模长归一)
  def __invert__(self) -> object:
	    length = self.dist(Point(0.0, 0.0, 0.0)) # dist 是求两点间长度的方法
	    return Point(self.x / length, self.y / length, self.z / length)

1.2 求解面的法向量

根据向量积的定义,可以求得三角形 $\triangle ABC$ 面(顶点逆时针排布为正面)的法向量(其中 ${\bold {norm}}$ 表示标准化函数),如下图:

$$ \boldsymbol n = {\bold {norm}} (\overrightarrow{\boldsymbol {BC}} \times \overrightarrow{\boldsymbol {BA}}) $$

Untitled

因而假设已经有坐标点对象 A, B, C ,法向量用代码表示便是 ~((B - C) @ (B - A)) (运算符在 1.1 节中定义)。

对于任意多边形面,选择其中任意三个按顺序排布的顶点即可通过上述方法求解法向量。

1.3 绘制多边形面

在多边形网格模型类中,定义绘制多边形面的方法。