蓝宝书 第三章
画点 Point1)单个点
glVertex3f(50.0f,50.0f,0.0f) 3D图像的点
glVertex2f(50.0f,50.0f) 2D图像的点
2)多个点
glBegin(GL_POINTS)
……
glEnd();
相关代码见例3.2
3)设置点大小
void glPointSize(GLfloatsize);设置点的大小
GLfloat sizes[2]; // 存放点大小的范围
GLfloat step; // 存放每次改变点大小的最小增量
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);
相关代码见例3.3
例3.1 窗口改变响应函数--3D版
void ChangeSize(GLsizei w, GLsizei h){ GLfloat nRange = 100.0f; // PRevent a divide by zero if (h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); // Reset projection matrix stack glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) if (w <= h) glOrtho(-nRange, nRange, -nRange*h / w, nRange*h / w, -nRange, nRange); else glOrtho(-nRange*w / h, nRange*w / h, -nRange, nRange, -nRange, nRange); // Reset Model view matrix stack glMatrixMode(GL_MODELVIEW); glLoadIdentity();}例3.2 显示多个点#include <windows.h>#include <math.h>#include <GL/GL.h>#include <GL/GLU.h>#include <GL/glut.h>// Define a constant for the value of PI#define GL_PI 3.1415f// This function does any needed initialization on the renderingvoid RenderScene(void){ GLfloat x, y, z, angle; // Storage for coordinates and angles // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT); // Save matrix state and do the rotation glPushMatrix(); glRotatef(30.0f, 1.0f, 0.0f, 0.0f);//书中的xRot代表x轴偏移的角度,此处改为x轴偏移30度 glRotatef(30.0f, 0.0f, 1.0f, 0.0f);//书中的yRot代表y轴偏移的角度,此处改为y轴偏移30度 // Call only once for all remaining points glBegin(GL_POINTS); z = -50.0f; for (angle = 0.0f; angle <= (2.0f*GL_PI)*3.0f; angle += 0.1f) { x = 50.0f*sin(angle);//sin输入为弧度 y = 50.0f*cos(angle); // Specify the point and move the Z value up a little glVertex3f(x, y, z); z += 0.5f; } // Done drawing points glEnd(); // Restore transformations glPopMatrix(); // Flush drawing commands glutSwapBuffers();}void SetupRC(){ // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set drawing color to green glColor3f(0.0f, 1.0f, 0.0f);}void ChangeSize(GLsizei w, GLsizei h){ GLfloat nRange = 100.0f; // Prevent a divide by zero if (h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); // Reset projection matrix stack glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) if (w <= h) glOrtho(-nRange, nRange, -nRange*h / w, nRange*h / w, -nRange, nRange); else glOrtho(-nRange*w / h, nRange*w / h, -nRange, nRange, -nRange, nRange); // Reset Model view matrix stack glMatrixMode(GL_MODELVIEW); glLoadIdentity();}int main(int argc, char* argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowSize(800, 600); glutCreateWindow("Bounce"); glutDisplayFunc(RenderScene);//显示回调函数 glutReshapeFunc(ChangeSize);//窗口大小变形回调函数 SetupRC(); glutMainLoop(); return 0;}例3.3 点大小的改变#include <windows.h>#include <math.h>#include <GL/GL.h>#include <GL/GLU.h>#include <GL/glut.h>// Define a constant for the value of PI#define GL_PI 3.1415f// This function does any needed initialization on the renderingvoid RenderScene(void){ GLfloat x, y, z, angle; // Storage for coordinates and angles GLfloat sizes[2]; // Store supported point size range GLfloat step; // Store supported point size increments GLfloat curSize; // Store current point size // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT); // Save matrix state and do the rotation glPushMatrix(); glRotatef(30.0f, 1.0f, 0.0f, 0.0f);//书中的xRot代表x轴偏移的角度 glRotatef(30.0f, 0.0f, 1.0f, 0.0f);//书中的yRot代表y轴偏移的角度 // Get supported point size range and step size glGetFloatv(GL_POINT_SIZE_RANGE, sizes); glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step); // Set the initial point size curSize = sizes[0]; // Set beginning z coordinate z = -50.0f; // Call only once for all remaining points glBegin(GL_POINTS); z = -50.0f; for (angle = 0.0f; angle <= (2.0f*GL_PI)*3.0f; angle += 0.1f) { // Calculate x and y values on the circle x = 50.0f*sin(angle); y = 50.0f*cos(angle); // Specify the point size before the primitive is specified glPointSize(curSize); // Draw the point glBegin(GL_POINTS); glVertex3f(x, y, z); glEnd(); // Bump up the z value and the point size z += 0.5f; curSize += step; } // Done drawing points glEnd(); // Restore transformations glPopMatrix(); // Flush drawing commands glutSwapBuffers();}void SetupRC(){ // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set drawing color to green glColor3f(0.0f, 1.0f, 0.0f);}void ChangeSize(GLsizei w, GLsizei h){ GLfloat nRange = 100.0f; // Prevent a divide by zero if (h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); // Reset projection matrix stack glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) if (w <= h) glOrtho(-nRange, nRange, -nRange*h / w, nRange*h / w, -nRange, nRange); else glOrtho(-nRange*w / h, nRange*w / h, -nRange, nRange, -nRange, nRange); // Reset Model view matrix stack glMatrixMode(GL_MODELVIEW); glLoadIdentity();}int main(int argc, char* argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowSize(800, 600); glutCreateWindow("Bounce"); glutDisplayFunc(RenderScene);//显示回调函数 glutReshapeFunc(ChangeSize);//窗口大小变形回调函数 SetupRC(); glutMainLoop(); return 0;}
新闻热点
疑难解答