PA2 REPORT

图形学PA2 REPORT

郭高旭 ggx21@mails.tsinghua.edu.cn 2021010803

曲线性质

两种曲线的异同

相同点:

  1. 都是基于控制点构造出的曲线;

  2. 都是多项式参数曲线,不能表示圆等曲线

  3. 都可以表示一条平滑的曲线。

不同点:

  1. 局部修改:

    • B 样条是局部的,容易对曲线进行修改、扩展和截断,而这些修改对曲线的其他部分几乎没有影响。
    • Bezier曲线/曲面不支持局部的修改和编辑。
  2. 拼接:B样条曲线可以拼接,Bezier曲线/曲面拼接时,满足几何连续性条件是十分困难的。

  3. B样条曲线具有下面一系列好的性质

    • 仿射不变性
    • 直线保持性
    • 凸包性
    • 变差缩减性
    • 几何不变性
    • etc.

怎样绘制一个首尾相接且接点处也有连续性质的 B 样条

  • 首尾相接:

    将控制点复制一遍,在第一组控制点前面加入最后一组控制点,最后一组控制点后面加入第一组控制点。

  • 保持连续性质

    通过设置相邻控制顶点的位置和导数值相等来保证一阶连续性

代码逻辑

  1. 首先通过discretize获取我刚刚实现的curve(一系列点的三维坐标V以及曲线在这一点的切向量T)

  2. 指定旋转步数step,进而获得每次旋转的角度θ

  3. 旋转:

    1. 构造一个绕y轴(Vector3f::UP)旋转、$\theta$的rot
    2. 获得曲线在该点的法向
    3. 点的位置向量和法向量同rot进行乘法运算,得到新的点的位置向量和法向量
    4. 循环上述过程一周
  4. 将修改后控制点坐标pnew和法向量nnew存入到新构造的曲面数组(surface.VV和surface.VN)中,用于面片的绘制

  5. 生成的顶点和法向量,通过三角化将曲面中的所有三角面片存入一个面片数组(surface.VF)中

  6. 将面片数组输入opengl,就可以画出整个曲面

代码参考

本次实验代码几乎完全仿照了提供的python代码实现。

具体来说,两种曲线类has a Bernstein B;通过构造一个Bernstein类实例来进行计算。

除此之外没有和其他同学进行讨论/参考其他代码。




本文总阅读量