学习OpenGL(三)绘制螺旋状图形

         学习OpenGL(三)绘制螺旋状图形

kezunhai@gmail.com

http://blog.csdn.net/kezunhai

           在OpenGl中,图形都是有一些基本的图元组成的,图元是把一组定点或顶点列表解释为屏幕上绘制的某些图形,OpenGL中的最小图元就是点。在OpenGL中有10中图元,可以实现从空间中绘制的简单的点到任意变数的封闭多边形,这十种图元分别是:


绘制图形的格式如下:

glBegin("图元类型");
	glVertex3f(GLfloat x, GLfloat y, GLfloat z);
	glVertex3f(GLfloat x, GLfloat y, GLfloat z);
	glVertex3f(GLfloat x, GLfloat y, GLfloat z);
	......
glEnd();
          下面以一个实例来说明点的绘制,该实例运用三角形的原理绘制一系列简单的点,这些点沿着Z轴上升,形成一个螺旋状的形状。整个实例的源代码如下:

#include "stdafx.h"
#include <gl/glut.h>
#include <cmath>
#include <iostream>
using namespace std;

#ifndef GL_PI
#define  GL_PI 3.14159
#endif

GLfloat xRot = 45.0f;
GLfloat yRot = 30.0f;

void SetupRC_GRAPHIC(void)
{
	// black background
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

	// Set drawing color to Green
	glColor3f(1.0f, 1.0f, 0.0f);
}

// Called to draw scene
void RenderScene_GRAPHIC(void)
{
	GLfloat X, Y, Z, angle;

	GLfloat fR = 50.0f;

	// Clear the window with current color
	glClear(GL_COLOR_BUFFER_BIT);

	// Save matrix state and do the rotation
	glPushMatrix();

	// Rotate
	glRotatef(xRot, 1.0f, 0.0f, 0.0f);
	glRotatef(yRot, 0.0f, 1.0f, 0.0f);

	glBegin(GL_POINTS);
		Z = -fR;
		for ( angle = 0.0f; angle<=2.0f*GL_PI*5.0f; angle+=0.1f) // 5圈
		{
			X = fR * sin(angle);
			Y = fR * cos(angle);

			glVertex3f(X, Y, Z);
			Z += 0.5;
		}
		
	glEnd();

	// restore transformations
	glPopMatrix();

	// Flush drawing commands
	glFlush();
}

// called by GLUT library when the window has changed size
void ChangeSize_GRAPHIC(GLsizei w, GLsizei h)
{
	GLfloat nRange = 100.0f;
	if ( h ==0)
		h = 1;

	// Set Viewport to window dimensions
	glViewport(0, 0, w, h);

	// Reset coordinate system
	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();
}

int _tmain(int argc, char* argv[])
{
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutCreateWindow("Graphics");	

	glutDisplayFunc(RenderScene_GRAPHIC);
	glutReshapeFunc(ChangeSize_GRAPHIC);

	SetupRC_GRAPHIC();
	glutMainLoop();

	return 0;
}
        上面代码中首先采用glOrtho()函数来建立修剪空间,当窗口发生变化时,ChangeSize()函数就会对视见区做一些调整。而在渲染函数RenderScene_GRAPHIC()中,通过计算某个角度的X、Y值(在0~PI之间循环了5次),并采用glVertex3f进行绘制,最终效果如图所示:

       上述代码中,所有点的大小是一致的,有时候我们可能需要对不同的点设置不同的大小。OpenGL中有设置点大小的函数,通过以下几个函数可以获取和设置点大小的信息:

void getPointSize()
{
	GLfloat sizes[2]; // store supported point size range
	GLfloat step;  // store supported size increments
	GLfloat curr;  // size of current point

	glGetFloatv(GL_POINT_SIZE_RANGE, sizes);
	glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);
	glGetFloatv(GL_POINT_SIZE, &curr);
	glPointSize(curr+1.0f);  // set current point size

	cout<<"Size:"<<sizes[0]<<","<<sizes[1]<<endl;
	cout<<"step:"<<step<<endl;
	cout<<"curr:"<<curr<<endl;
}

作者:kezunhai出处:http://blog.csdn.net/kezunhai欢迎转载或分享,但请务必声明文章出处。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值