通过VC++ OpenGL绘制三维花瓶轮廓。最好是由三次beizer曲线绕坐标轴旋转得到。
一个简单的OpenGL程序,用于绘制一个由三次Bezier曲线绕坐标轴旋转得到的花瓶轮廓。该程序使用了GLUT库,需要在VC++中添加GLUT库文件和头文件。
#include <GL/glut.h>
#include <cmath>
const int WIDTH = 800; // 窗口宽度
const int HEIGHT = 600; // 窗口高度
const int STEPS = 50; // 曲线分段数
// 控制点数组
GLfloat ctrlPoints[][3] = {
{ 0.0f, 0.0f, 0.0f},
{ 0.0f, 0.5f, 0.0f},
{ 0.5f, 1.0f, 0.0f},
{ 1.0f, 1.0f, 0.0f},
{ 1.5f, 1.0f, 0.0f},
{ 1.5f, 0.5f, 0.0f},
{ 1.5f, 0.0f, 0.0f},
{ 1.0f, -0.5f, 0.0f},
{ 0.5f, -1.0f, 0.0f},
{ 0.0f, -1.0f, 0.0f},
{-0.5f, -1.0f, 0.0f},
{-1.0f, -0.5f, 0.0f},
{-1.5f, 0.0f, 0.0f},
{-1.5f, 0.5f, 0.0f},
{-1.5f, 1.0f, 0.0f},
{-1.0f, 1.0f, 0.0f},
{-0.5f, 0.5f, 0.0f},
{ 0.0f, 0.0f, 0.0f}
};
// 绘制Bezier曲线
void drawBezier(GLfloat* p0, GLfloat* p1, GLfloat* p2, GLfloat* p3) {
glBegin(GL_LINE_STRIP);
for (int i = 0; i <= STEPS; i++) {
float t = i / (float)STEPS;
float x = pow(1 - t, 3) * p0[0] + 3 * pow(1 - t, 2) * t * p1[0] + 3 * (1 - t) * pow(t, 2) * p2[0] + pow(t, 3) * p3[0];
float y = pow(1 - t, 3) * p0[1] + 3 * pow(1 - t, 2) * t * p1[1] + 3 * (1 - t) * pow(t, 2) * p2[1] + pow(t, 3) * p3[1];
float z = pow(1 - t, 3) * p0[2] + 3 * pow(1 - t, 2) * t * p1[2] + 3 * (1 - t) * pow(t, 2) * p2[2] + pow(t, 3) * p3[2];
glVertex3f(x, y, z);
}
glEnd();
}
// 绘制花瓶
void drawVase() {
// 绕z轴旋转
for (int i = 0; i < 360; i += 10) {
glPushMatrix();
glRotatef(i, 0.0f, 0.0f, 1.0f);
// 绘制三次Bezier曲线
for (int j = 0; j < 16; j += 3) {
drawBezier(ctrlPoints[j], ctrlPoints[j + 1], ctrlPoints[j + 2], ctrlPoints[j + 3]);
}
glPopMatrix();
}
}
// 绘制场景
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
drawVase();
glutSwapBuffers();
}
// 窗口大小改变事件
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (float)w / h, 0.1f, 100.0f);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("Vase");
glEnable(GL_DEPTH_TEST);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
该程序使用了OpenGL的三次Bezier曲线来绘制花瓶轮廓,然后将其绕坐标轴旋转,最终得到一个三维花瓶。可以通过修改控制点数组来调整花瓶的形状。
看代码注释:
#include <gl/glut.h>
void init()
{
// 设置背景色为黑色
glClearColor(0.0, 0.0, 0.0, 0.0);
// 设置投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 1.0, 1.0, 100.0); // 透视投影设置
// 设置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 设置相机视角
}
void drawBezierCurve()
{
GLfloat ctrlPoints[4][3] = {
{-1.5, -1.5, 0.0}, // 控制点 1
{-0.5, 1.5, 0.0}, // 控制点 2
{0.5, -1.5, 0.0}, // 控制点 3
{1.5, 1.5, 0.0} // 控制点 4
};
GLint i;
// 创建三次bezier曲线
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlPoints[0][0]);
glEnable(GL_MAP1_VERTEX_3);
// 循环绘制曲线上的点
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord1f((GLfloat)i/30.0);
glEnd();
}
void display()
{
// 清空缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 设置颜色
glColor3f(1.0, 1.0, 1.0);
// 旋转后绘制曲线
glPushMatrix();
glRotatef(45.0, 0.0, 1.0, 0.0);
drawBezierCurve();
glPopMatrix();
// 切换缓冲区,显示绘制结果
glutSwapBuffers();
}
int main(int argc, char **argv)
{
// 初始化glut
glutInit(&argc, argv);
// 设置显示模式
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
// 设置窗口大小
glutInitWindowSize(500, 500);
// 创建窗口并设置标题
glutCreateWindow("3D Flower Vase");
// 初始化OpenGL环境
init();
// 注册回调函数
glutDisplayFunc(display);
// 进入事件循环
glutMainLoop();
return 0;
}
```