图形学PA2 REPORT
郭高旭 ggx21@mails.tsinghua.edu.cn 2021010803
曲线性质
两种曲线的异同
相同点:
-
都是基于控制点构造出的曲线;
-
都是多项式参数曲线,不能表示圆等曲线
-
都可以表示一条平滑的曲线。
不同点:
-
局部修改:
- B 样条是局部的,容易对曲线进行修改、扩展和截断,而这些修改对曲线的其他部分几乎没有影响。
- Bezier曲线/曲面不支持局部的修改和编辑。
-
拼接:B样条曲线可以拼接,Bezier曲线/曲面拼接时,满足几何连续性条件是十分困难的。
-
B样条曲线具有下面一系列好的性质
- 仿射不变性
- 直线保持性
- 凸包性
- 变差缩减性
- 几何不变性
- etc.
怎样绘制一个首尾相接且接点处也有连续性质的 B 样条
-
首尾相接:
将控制点复制一遍,在第一组控制点前面加入最后一组控制点,最后一组控制点后面加入第一组控制点。
-
保持连续性质
通过设置相邻控制顶点的位置和导数值相等来保证一阶连续性
代码逻辑
-
首先通过discretize获取我刚刚实现的curve(一系列点的三维坐标V以及曲线在这一点的切向量T)
-
指定旋转步数step,进而获得每次旋转的角度θ
-
旋转:
- 构造一个绕y轴(Vector3f::UP)旋转、$\theta$的rot
- 获得曲线在该点的法向
- 点的位置向量和法向量同rot进行乘法运算,得到新的点的位置向量和法向量
- 循环上述过程一周
-
将修改后控制点坐标pnew和法向量nnew存入到新构造的曲面数组(surface.VV和surface.VN)中,用于面片的绘制
-
生成的顶点和法向量,通过三角化将曲面中的所有三角面片存入一个面片数组(surface.VF)中
-
将面片数组输入opengl,就可以画出整个曲面
代码参考
本次实验代码几乎完全仿照了提供的python代码实现。
具体来说,两种曲线类has a Bernstein B;通过构造一个Bernstein类实例来进行计算。
除此之外没有和其他同学进行讨论/参考其他代码。