glVertex3f - OpenGL

glVertex3f

函数功能

OpenGL 中用来指定 3D 坐标点的函数。它是 OpenGL 绘制图形时的一个基本函数,通常用来定义图形的顶点。具体来说,glVertex3f 定义了一个三维空间中的点,该点的坐标由三个浮动参数 (x, y, z) 给定。

语法

glVertex3f(GLfloat x, GLfloat y, GLfloat z);

参数:
x:顶点的 X 坐标,浮动类型 (GLfloat)。
y:顶点的 Y 坐标,浮动类型 (GLfloat)。
z:顶点的 Z 坐标,浮动类型 (GLfloat)。

用法

glVertex3f 通常是在 glBegin 和 glEnd 之间调用的,指定当前绘制的图形的一个顶点。OpenGL 使用这些顶点信息来构建图形(如三角形、线条或点等)

例子

// 绘制点
glBegin(GL_POINTS);
    glVertex3f(1.0f, 2.0f, 3.0f);  // 点的坐标
glEnd();

//绘制线段
glBegin(GL_LINES);
    glVertex3f(0.0f, 0.0f, 0.0f);  // 线段的起始点
    glVertex3f(1.0f, 1.0f, 1.0f);  // 线段的结束点
glEnd();

注意

  • glVertex3f 是指定顶点位置的函数,它并不会直接绘制图形。绘制图形是通过在 glBegin() 和 glEnd() 之间定义顶点的方式来完成的。具体绘制的形状取决于 glBegin() 中的参数(如 GL_POINTS、GL_LINES、GL_TRIANGLES 等)。
  • 如果要绘制多个顶点,必须使用多次 glVertex3f 调用,依赖于每次调用设置一个新的顶点。

绘制线条

glVertex3f 配合 glBegin(GL_LINES) 或 glBegin(GL_LINE_STRIP) 来实现。两者之间的区别是:

  • GL_LINES:每对顶点会被连接成一条独立的线段。
  • GL_LINE_STRIP:顶点将按顺序连接,形成一条连续的线

使用 GL_LINES 绘制点集中的线条

假设我们有一个点集points,每两个点之间都画一条线段

glBegin(GL_LINES); // 开始绘制线段
for (size_t i = 0; i < points.size(); i += 2) {
    // 每两个点形成一条线段
    glVertex3f(points[i].x, points[i].y, points[i].z);
    glVertex3f(points[i+1].x, points[i+1].y, points[i+1].z);
}
glEnd();

每次通过 glVertex3f 指定两个点,OpenGL 会将它们连接成一条线段

使用 GL_LINE_STRIP 绘制连续线条

将所有的点按顺序连接成一条连续的线

glBegin(GL_LINE_STRIP); // 开始绘制连续线
for (const auto& pt : points) {
    glVertex3f(pt.x, pt.y, pt.z);
}
glEnd();

在 GL_LINE_STRIP 中,OpenGL 会将每个顶点依次连接成一条连续的线段,直到所有点都连接完。

//By:ZHangFY #include <GL/glut.h> GLfloat rotate_angle1 = 0.0; GLfloat dSize = 0.3; //立方体大小 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(rotate_angle1, -0.3, 0.3, -0.3);//旋转点 glBegin(GL_QUADS); //上 glColor3f(0.0, 1.0, 0.0); //绿 glNormal3d(0.0, 0.0, 1.0); //上 glVertex3d(dSize, dSize, dSize); glVertex3d(-dSize, dSize, dSize); glVertex3d(-dSize, -dSize, dSize); glVertex3d(dSize, -dSize, dSize); //下 glColor3f(0.0, 0.0, 1.0); //蓝 glNormal3d(0.0, 0.0, -1.0);//下 glVertex3d(dSize, dSize, -dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(dSize, -dSize, -dSize); //前 glColor3f(1.0, 0.0, 0.0); //红 glNormal3d(1.0, 0.0, 0.0);//前 glVertex3d(dSize, dSize, dSize); glVertex3d(dSize, -dSize, dSize); glVertex3d(dSize, -dSize, -dSize); glVertex3d(dSize, dSize, -dSize); //后 glColor3f(0.0, 1.0, 1.0); //青 glNormal3d(-1.0, 0.0, 0.0);//后 glVertex3d(-dSize, dSize, dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, dSize); //左 glColor3f(1.0, 0.0, 1.0); //品红 glNormal3d(0.0, -1.0, 0.0);//左 glVertex3d(dSize, -dSize, dSize); glVertex3d(dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, dSize); //右 glColor3f(1.0, 1.0, 0.0); //黄 glNormal3d(0.0, 1.0, 0.0);//右 glVertex3d(dSize, dSize, dSize); glVertex3d(dSize, dSize, -dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, dSize, dSize); rotate_angle1 += 3; glEnd(); glFlush(); glutSwapBuffers(); } void myIdle(void) { myDisplay(); //Sleep(20); //减慢旋转速度 } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("立方体旋转MODEL"); glutDisplayFunc(&myDisplay); glutIdleFunc(&myIdle); glutMainLoop(); return 0; }
05-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值