由小到大绘制多个点,排成螺旋
-
void RenderScene(void)
-
{
-
GLfloat x, y, z, angle;
-
z = -50.0f;
-
GLfloat zStep = 0.5f;
-
GLfloat sizes[2];
-
GLfloat sizeStep;
-
GLfloat curSize;
-
-
glGetFloatv(GL_POINT_SIZE_RANGE, sizes);
-
glGetFloatv(GL_POINT_SIZE_GRANULARITY, &sizeStep);
-
-
curSize = sizes[0] + sizeStep;
-
-
glClear(GL_COLOR_BUFFER_BIT);
-
glPushMatrix();
-
glRotatef(40.0f, 10.0f, -10.0f, 0.0f);
-
-
-
-
for (angle = 0.0f; angle <= (2.0f * GL_PI) * 3.0f; angle += 0.1f)
-
{
-
x = 50.0f * sin(angle);
-
y = 50.0f * cos(angle);
-
z += zStep;
-
glPointSize(curSize);
-
glBegin(GL_POINTS);
-
glVertex3f(x, y, z);
-
glEnd();
-
if (curSize < 10.0f) curSize += sizeStep;
-
-
}
-
-
-
glPopMatrix();
-
glutSwapBuffers();
-
}
-
-
void ChangeSize(GLsizei w, GLsizei h)
-
{
-
GLfloat nRange = 100.0f;
-
if (h == 0) h = 1;
-
glViewport(0, 0, w, h);
-
glMatrixMode(GL_PROJECTION);
-
glLoadIdentity();
-
-
-
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);
-
}
-
-
glMatrixMode(GL_MODELVIEW);
-
glLoadIdentity();
-
}
绘制直线、折线
-
void RenderScene(void)
-
{
-
glClear(GL_COLOR_BUFFER_BIT);
-
glPushMatrix();
-
glRotatef(40.0f, 10.0f, -10.0f, 0.0f);
-
-
GLfloat x, y, z, angle;
-
-
glBegin(GL_LINE_STRIP); //如果用GL_LINE_LOOP,会自动加一条线,形成环,如果用GL_LINES,则只是画一条线
-
glVertex3f(x, y, z);
-
glVertex3f(x + 30, y + 30, z + 30);
-
glVertex3f(x + 30, y + 60, z + 30);
-
glVertex3f(x + 20, y + 40, z + 80);
-
glEnd();
-
-
glPopMatrix();
-
glutSwapBuffers();
-
}
用折线画螺旋,并且用上下左右控制旋转
-
/*
-
* File: main.c
-
* Author: root
-
*
-
* Created on August 30, 2013, 12:57 PM
-
*/
-
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <time.h>
-
#include <GL/glut.h>
-
#include <GL/gl.h>
-
#include <math.h>
-
-
-
#define GL_PI 3.1415f
-
#define KEY_UP 101
-
#define KEY_DOWN 103
-
#define KEY_LEFT 102
-
#define KEY_RIGHT 100
-
-
GLfloat rotateX = 0.0f;
-
GLfloat rotateY = 0.0f;
-
-
void RenderScene(void)
-
{
-
glClear(GL_COLOR_BUFFER_BIT);
-
glPushMatrix();
-
glRotatef(rotateX, 1.0f, 0.0f, 0.0f);
-
glRotatef(rotateY, 0.0f, 1.0f, 0.0f);
-
-
-
GLfloat x, y, z, angle;
-
z = -50.0f;
-
glBegin(GL_LINE_STRIP);
-
for(angle = 0.0f; angle < (2.0f * GL_PI) * 4; angle += 0.1f)
-
{
-
x = 50.0f * sin(angle);
-
y = 50.0f * cos(angle);
-
z += 0.5f;
-
-
glVertex3f(x, y, z);
-
-
}
-
glEnd();
-
-
-
-
glPopMatrix();
-
glutSwapBuffers();
-
}
-
-
void ChangeSize(GLsizei w, GLsizei h)
-
{
-
GLfloat nRange = 100.0f;
-
if (h == 0) h = 1;
-
glViewport(0, 0, w, h);
-
glMatrixMode(GL_PROJECTION);
-
glLoadIdentity();
-
-
-
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);
-
}
-
-
glMatrixMode(GL_MODELVIEW);
-
glLoadIdentity();
-
}
-
-
void SetupRC(void)
-
{
-
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
-
glColor3f(0.0f, 1.0f, 0.0f);
-
}
-
-
void myTimer(int i)
-
{
-
-
}
-
-
void keyAction (int key, int x, int y)
-
{
-
switch (key)
-
{
-
case KEY_UP:
-
rotateX += 1.5f;
-
break;
-
case KEY_DOWN:
-
rotateX -= 1.5f;
-
break;
-
case KEY_LEFT:
-
rotateY -= 1.5f;
-
break;
-
case KEY_RIGHT:
-
rotateY += 1.5f;
-
break;
-
default:
-
break;
-
}
-
RenderScene();
-
}
-
-
-
/*
-
*
-
*/
-
int main(int argc, char** argv) {
-
glutInit(&argc, argv);
-
glutInitWindowPosition(100, 100);
-
glutInitWindowSize(399, 400);
-
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
-
glutCreateWindow("asd");
-
SetupRC();
-
glutDisplayFunc(RenderScene);
-
glutReshapeFunc(ChangeSize);
-
glutSpecialFunc(keyAction);
-
glutMainLoop();
-
return (EXIT_SUCCESS);
-
}
用三角形画圆锥
两个扇面组成封口的锥形
-
void RenderScene(void)
-
{
-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
glPushMatrix();
-
-
glRotatef(rotateX, 10.0f, 0.0f, 0.0f);
-
glRotatef(rotateY, 0.0f, 10.0f, 0.0f);
-
-
char p0[3] = {0.0f, 50.0f, 0.0f};
-
char p1[3] = {20.0f, 0.0, 20.0f};
-
GLfloat angle;
-
glShadeModel(GL_SMOOTH);
-
glEnable(GL_CULL_FACE); //开启多边形剔除,不渲染多边形的背面,这样如果要显示一个正面朝外的封闭多边形,则背面超前的地方根本就不渲染。如果是创建不发呢关闭的集合形体,如纸,就不能打开这个选项。
-
glEnable(GL_DEPTH_TEST); // 开启深度测试,可以避免晚描绘的像素错误遮挡之前描绘的Z坐标靠前的像素
-
-
glPolygonMode(GL_BACK, GL_FILL); // 显示填充好的多边形,如果选GL_LINE,则只显示每个多边形的轮廓。
-
-
glBegin(GL_TRIANGLE_FAN);
-
glVertex3f(p0[0], p0[1], p0[2]);
-
for (angle = 0; angle <= 2*GL_PI + 0.1f; angle += 0.1f)
-
{
-
glColor3f(sin(angle), 0.0f, 0.5f);
-
glVertex3f(p1[0] * sin(angle), p1[1], p1[2] * cos(angle));
-
}
-
glEnd();
-
-
glBegin(GL_TRIANGLE_FAN);
-
glColor3f(1.0f, 1.0f, 1.0f);
-
glVertex3f(p0[0], p1[1], p0[2]);
-
for (angle = 0; angle <= 2*GL_PI + 0.1f; angle += 0.1f)
-
{
-
glVertex3f(p1[0] * cos(angle), p1[1], p1[2] * sin(angle));
-
}
-
glEnd();
-
-
glPopMatrix();
-
glutSwapBuffers();
-
}
用GL_QUAD_STRIP绘制连续的四边形。提供顶点的方向是折线形的
提供顶点的顺序逆时针,则为正面。
-
void RenderScene(void)
-
{
-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
glRotatef(rotateX, 1.0f, 0.0f, 0.0f);
-
glRotatef(rotateY, 0.0f, 1.0f, 0.0f);
-
glEnable(GL_CULL_FACE);
-
glEnable(GL_DEPTH_TEST);
-
glPolygonMode(GL_BACK, GL_FILL);
-
-
GLfloat r = 2.0f;
-
-
glPushMatrix();
-
-
glBegin(GL_QUAD_STRIP);
-
glColor3f(1.0, 0.0f, 0.0f);
-
-
glVertex3f(r, -r, -r);
-
glVertex3f(r, -r, r);
-
glVertex3f(-r, -r, -r);
-
glVertex3f(-r, -r, r);
-
-
glColor3f(0.0, 1.0f, 0.0f);
-
glVertex3f(-r, r, -r);
-
glVertex3f(-r, r, r);
-
-
glColor3f(0.0, 0.0f, 1.0f);
-
glVertex3f(r, r, -r);
-
glVertex3f(r, r, r);
-
-
glColor3f(0.0, 1.0f, 1.0f);
-
glVertex3f(r, -r, -r);
-
glVertex3f(r, -r, r);
-
glEnd();
-
-
glBegin(GL_QUADS);
-
glColor3f(1.0, 1.0f, 1.0f);
-
glVertex3f(-r, -r, r);
-
glVertex3f(r, -r, r);
-
glVertex3f(r, r, r);
-
glVertex3f(-r, r, r);
-
-
glEnd();
-
-
glBegin(GL_QUADS);
-
glColor3f(1.0, 0.0f, 1.0f);
-
glVertex3f(r, -r, -r);
-
glVertex3f(-r, -r, -r);
-
glVertex3f(-r, r, -r);
-
glVertex3f(r, r, -r);
-
-
-
glEnd();
-
-
glPopMatrix();
-
glutSwapBuffers();
-
}
透视效果
-
void ChangeSize(GLsizei w, GLsizei h)
-
{
-
if (h == 0) h = 1;
-
glViewport(0, 0, w, h);
-
glMatrixMode(GL_PROJECTION);
-
glLoadIdentity();
-
-
gluPerspective(80.0f, (GLfloat)w/(GLfloat)h, 11.0, 30.0);
-
-
glMatrixMode(GL_MODELVIEW);
-
glLoadIdentity();
-
glTranslatef(0.0f, 0.0f, -15.0f); 把坐标向x轴负方向推,使得图像装到gluPerspective的后两个参数范围里
-
}
-
方块回弹
-
/*
-
* File: main.c
-
* Author: root
-
*
-
* Created on August 30, 2013, 12:57 PM
-
*/
-
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <time.h>
-
#include <GL/glut.h>
-
#include <GL/gl.h>
-
-
-
GLfloat rsize = 25.0f;
-
GLfloat x = 200.0f;
-
GLfloat y = 25.0f;
-
-
GLfloat xStep = 5.0f;
-
GLfloat yStep = 5.0f;
-
-
GLfloat windowWidth;
-
GLfloat windowHight;
-
-
void RenderScene(void)
-
{
-
-
glClear(GL_COLOR_BUFFER_BIT);
-
glColor3f(1.0f, 0.0f, 0.0f);
-
glRectf(x , y , x + rsize, y - rsize);
-
-
-
glutSwapBuffers();
-
}
-
-
void ChangeSize(GLsizei w, GLsizei h)
-
{
-
windowWidth = w;
-
windowHight = h;
-
glViewport(0, 0, windowWidth, windowHight);
-
glMatrixMode(GL_PROJECTION);
-
glLoadIdentity();
-
glOrtho(0, windowWidth, 0, windowHight, 20.0, -20.0);
-
glMatrixMode(GL_MODELVIEW);
-
glLoadIdentity();
-
}
-
-
void SetupRC(void)
-
{
-
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
-
// glColor3f(0.0f, 1.0f, 0.0f);
-
}
-
-
void myTimer(int i)
-
{
-
if (x > windowWidth - rsize || x < 0) xStep *= -1;
-
if (y > windowHight || y < rsize) yStep *= -1;
-
x += xStep;
-
y += yStep;
-
-
glutPostRedisplay();
-
-
glutTimerFunc(30, myTimer, i);
-
}
-
-
/*
-
*
-
*/
-
int main(int argc, char** argv) {
-
glutInit(&argc, argv);
-
glutInitWindowPosition(100, 100);
-
glutInitWindowSize(399, 400);
-
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
-
glutCreateWindow("asd");
-
// glEnable(GL_LIGHTING);
-
glutDisplayFunc(RenderScene);
-
glutReshapeFunc(ChangeSize);
-
glutTimerFunc(30, myTimer, 1);
-
SetupRC();
-
glutMainLoop();
-
return (EXIT_SUCCESS);
-
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26239116/viewspace-2125609/
,如需转载,请注明出处,否则将追究法律责任。