opengl实现bezier、b曲线和曲面,16个控制点的4*4bezier块;最后可以看到茶壶teapot的实现

1、你的工程可能还不能跑起来,一般的错误按照网页修改就可以了

可是还是会有个bug  。Error6error C2039: 'exit' : is not a member of '`global namespace,

解决方法,a这是编译器的问题,有时候看人品,所以可以换一个低版本的编译器  b直接把sstdlib中的using ::exit;直接隐掉;

                c添加#include“windows.h”中,放在这个cpp的第一行,

接着调试过去之后,就可以按照bug提示添加.h和.cpp。

教你在vc中命令行调试;打开vc,project->propreties之后;


 

在command Arguments 输入命令行即可;

2,添加完之后,现在可以画线了实现paint函数;

画线的步骤,我是这样做的,在spline里实现画点,在curve中实现画直线,在对应的bspline或bezierspline中实现画曲线;这是一个继承关系,C++的多态性质,你知道的;当然你还可以直接在bspline或bezierspline中直接实现paint();这个过程你还要考虑在那保存点和点的数量最好在spline类里面实现;

画线还是比较简单的,就是实现一个paint函数,可能你已经做出来四个控制点的曲线,那么多个控制点的,也就简单了

3实现Bezier曲线和BSplines曲线之间的转换

 Q(t) = Gbezier  Bbezier   T = Gbspline  Bbspline   T

例如;bezier 转b

这主要根据同样的曲线,去求另外同样曲线的控制点,这就要矩阵的运算了(T可以约去了,你知道吧,不知道看看线代)

Gbezier  bezier控制点矩阵 ;

而 Bbezier 、 Bbspline  是已经知道的;

那么你就可以求Gbspline ( b控制点矩阵了吧)

这简单的矩阵运算你会的

求的了控制点,画线你会吧,1中做过了。至于>4个控制点的,自己弄去吧

3,为了添加删除点,接着实现moveControlPoint(...), addControlPoint(...) 和 deleteControlPoint(...)函数来完成曲线编辑器

这比较简单,不说了

4旋转曲面实现,这时你需要实现OutputTriangles(...),在哪里实现,在对应的曲线,这里你会使用到TriangleNet类

里面的参数什么意思呢?这个是个问题,我也纠结了,不过我纠结了,你就不用纠结了;呵呵

 _u_tess代表了旋转的次数( -revolution_tessellation) ; _v_tess,旋转面的分割的个数(-curve_tessellation <n>,这里-curve_tessellation <n>的值可以直接使用吗?当然是不可以的,你要思考,算了我告诉你吧;比如是bezier,7个点控制的,那样就可以画2条bezier曲线,如果-curve_tessellation <n>=4,那样 _v_tess= ((7/4)+1)*4;你懂了吧)

5实现4*4的Bezier块,这个有了第四步的经验你就很好做了,先给你个公式;

  

 

公式都给了,会求点了吧

P代表了控制点,有了这个公式u、v都是从0到1变化的,怎么变和-patch_tessellation <n>有关的,假如-patch_tessellation <n>=4,那就是bezier分为4段,就是要5个点,这样就会计算出25个点了。

这些工作都做完了,好了你就可以看到teapot了,这是mit,图形学作业8。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章