主题:[原创]OpenGL入门学习——第五课
eastcowboy
[专家分:25370] 发布于 2006-10-07 15:10:00
大家久等了。
不知道是否还有人记得这个课程啊?下面是前面四课的连接,大家可以温习一下,新朋友也可以看看。
[url=http://www.programfan.com/club/showbbs.asp?id=184355]第一课,编写第一个OpenGL程序[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184525]第二课,绘制几何图形[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184769]第三课,绘制几何图形的一些细节问题[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=185032]第四课,颜色的选择[/url]
第五课,三维的空间变换 ——→ [color=0000FF]本次课程的内容[/color]
今天要讲的是三维变换的内容,课程比较枯燥。主要是因为很多函数在单独使用时都不好描述其效果,我只好在最后举一个比较综合的例子。希望大家能一口气看到底了。只看一次可能不够,如果感觉到迷糊,不妨多看两遍。有疑问可以在下面跟帖提出。
我也使用了若干图形,希望可以帮助理解。
=====================未完,请勿跟帖=====================
回复列表 (共30个回复)
21 楼
zhouditty [专家分:0] 发布于 2006-10-09 13:45:00
[em28]
谢谢楼主啊~
这个学期正在学计算机图形学,那老师总顾着吹水,又不备课。有这个教程真的太好了。坚持下去啊,期待ing
22 楼
godtd [专家分:0] 发布于 2006-10-15 12:41:00
支持一下!我准备要学了哦!
23 楼
瞬间移动 [专家分:320] 发布于 2006-11-24 22:34:00
#include <GL/glut.h>
// 太阳、地球和月亮
// 假设每个月都是30天
// 一年12个月,共是360天
static int day = 200; // day的变化:从0到359
void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 1, 400000000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1);
// 绘制红色的“太阳”
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(69600000, 20, 20);
// 绘制蓝色的“地球”
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(150000000, 0.0f, 0.0f);
glutSolidSphere(15945000, 20, 20);
// 绘制黄色的“月亮”
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(38000000, 0.0f, 0.0f);
glutSolidSphere(4345000, 20, 20);
glFlush();
}
int main( int argc, char *argv[] )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE );
glutInitWindowPosition( 100, 100 );
glutInitWindowSize( 400, 400 );
glutCreateWindow("三维图形");
glutDisplayFunc( &myDisplay );
glutMainLoop();
return 0;
}
编译通过,但是运行后就有个黑色的窗口,里面看不到东西?有那里不对吗?
24 楼
eastcowboy [专家分:25370] 发布于 2006-11-25 13:12:00
瞬间移动@23楼:
这个程序在我的电脑上运行没有任何问题。我认为可能是由于OpenGL具体实现引起的原因。
默认情况下,Windows平台用纯软件形式实现了一个OpenGL,虽然速度缓慢(没有利用显卡的各种优势),版本老旧,但由于比较保守,不容易出错。在安装显卡驱动时,一般都会安装一个新的OpenGL(常见的nVidia和ATI的显卡都是如此)。某些型号较旧的ATI显卡对OpenGL支持不佳,可能会造成显示错误。我同学一个9200的显卡就是如此。
某些OpenGL实现可能对较大的空间支持不够好,试试把每个表示长度和大小的值都缩小1000000倍,再看看运行结果。
void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 1, 40);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -20, 20, 0, 0, 0, 0, 0, 1);
// 绘制红色的“太阳”
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(6.96, 20, 20);
// 绘制蓝色的“地球”
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(15, 0.0f, 0.0f);
glutSolidSphere(1.5945, 20, 20);
// 绘制黄色的“月亮”
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(3.8, 0.0f, 0.0f);
glutSolidSphere(0.4345, 20, 20);
glFlush();
}
如果仍然无法正确显示,可以把显卡驱动卸载了,试试用纯软件的方式运行。
25 楼
瞬间移动 [专家分:320] 发布于 2006-11-25 16:04:00
谢谢楼主,缩小后可以显示了。 看来是显卡太烂了啊....
26 楼
tean60 [专家分:0] 发布于 2007-01-09 21:18:00
简直可以用崇拜来形容[em2]
27 楼
wolfwl [专家分:0] 发布于 2007-04-15 11:17:00
very good!!!!!!!!!!!!!!!!1111
28 楼
lizhiyuan [专家分:0] 发布于 2007-07-20 11:55:00
亲爱的朋友
打扰你们了!
我现在有个问题是: 要再vc++6.0 和MFC一起做这个图形设计,如何有效地取做,多谢了。 还有怎么样让一个正方体旋转45度或90度时停下来。很着急。多谢各位了。
我的email: lizhiyuan16@yahoo.com and lizhiyuan16@hotmail.com.
麻烦各位了。
29 楼
TopWay [专家分:20] 发布于 2008-07-10 09:27:00
对这章有点疑惑....投影变换是用来延伸我们的坐标嘛?比如说glFrustum函数..和gluPerspective函数
他们有是怎么延伸的...也就是说他们的参数..比如没有延伸前调用glTranslatef(0.0f,0.0f,6.0f)是看不到所画图象的...如果我要使用glTranslatef(0.0f,0.0f,6.0f)函数,就要做投影变换 才能看到所画的图象,嘛?
30 楼
eastcowboy [专家分:25370] 发布于 2008-07-27 18:43:00
[quote]投影变换是用来延伸我们的坐标吗?[/quote]
并不是这样的。
首先确定,无论你如何设置,OpenGL都只能在窗口的内部绘制图象。从这个意义上说,坐标定为[-1, 1]和坐标定为[-100, 100]是一样的。
比如调用glOrtho(-100, 100, -100, 100, -100, 100),看起来是将坐标范围从原来的[-1, 1]改变为[-100, 100],但实际上也可以理解为:坐标范围还是原来的[-1, 1],但是我们指定到OpenGL的坐标不再是原来的值了,而是将它们统一缩小100倍。
这是一个相对的概念。就像照相,人远离照相机,照相机远离人,思路不同,最终得到的图象却一样。
我来回复