计算机图形学实验1.2卡通人物交互
OpenGL卡通人物交互
「实验题目」
实现基于鼠标交互的卡通人物设计与绘制,使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓对交互控制,点击鼠标左键可以对人物五官位置进行拖拽移动调整。并能对卡通人物进行放缩等操作。
「题目分析」
可以将这个题目分割看看。
1. 卡通人物的绘制怎么实现?
- 通过各种图元组合。你需要,线?多边形?圆形(或椭圆)?曲线(贝塞尔曲线)?
2. 怎么实现对卡通人物部位的交互?怎么知道选中的是哪个部件?
- 了解一下OpenGL拾取怎么实现
3. 剩下一些细碎的东西
- OpenGL的反走样怎么开启?图像放缩怎么实现?拖动的地方有什么要注意的?
基础"图元"绘制
圆形绘制
基于极坐标实现,通过单位圆在X、Y轴上投影的缩放得到圆形(或者椭圆)上位置的坐标。
可以选择绘制模式,是得到一个面还是一段圆弧。
void drawCircle(GLenum Mode,int N, double radius, int angleStart = 0, int angleEnd = 360, double x = 0, double y = 0, double a = 1, double b = 1) {
glBegin(Mode);
double start = (double)angleStart / 360.0*N;
double end = (double)angleEnd / 360 * N;
for (int i = start; i < end + 1; i++) {
glVertex2f(x + a * cos(i * 2 * PI / N)*radius, y + b * sin(i * 2 * PI / N) *radius);
}
glEnd();
}
三次贝塞尔曲线绘制
很简单的实现了四个控制点的三次贝塞尔曲线。
n次的贝塞尔曲线实现需要写个递归(De Casteljau算法),其实就是在控制点组成的线段上不断选取一个比例 t ∈ [ 0 , 1 ] t\in[0,1] t∈[0,1]进行插值,直到递归至只剩一个点(这个点就是我们需要绘制的贝塞尔曲线上的点)
贝塞尔曲线的最终坐标实际上是控制点坐标和伯恩斯坦多项式系数的组合(Bernstein polynomial)
P.S.想想二项式展开,其实很简单
Point setBezier(Point p1, Point p2, Point p3, Point p4,double t) {
Point p;
double a1 = pow((1 - t), 3);
double a2 = pow((1 - t), 2) * 3 * t;
double a3 =