回 帖 发 新 帖 刷新版面

主题:[原创]OpenGL入门学习——第五课

大家久等了。

不知道是否还有人记得这个课程啊?下面是前面四课的连接,大家可以温习一下,新朋友也可以看看。
[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 楼


[em28]
 谢谢楼主啊~
这个学期正在学计算机图形学,那老师总顾着吹水,又不备课。有这个教程真的太好了。坚持下去啊,期待ing

22 楼

支持一下!我准备要学了哦!

23 楼

#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 楼

瞬间移动@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 楼

谢谢楼主,缩小后可以显示了。  看来是显卡太烂了啊....

26 楼


简直可以用崇拜来形容[em2]

27 楼

very good!!!!!!!!!!!!!!!!1111

28 楼


 亲爱的朋友
打扰你们了!

我现在有个问题是:  要再vc++6.0 和MFC一起做这个图形设计,如何有效地取做,多谢了。 还有怎么样让一个正方体旋转45度或90度时停下来。很着急。多谢各位了。
我的email: lizhiyuan16@yahoo.com and lizhiyuan16@hotmail.com.

麻烦各位了。

29 楼

对这章有点疑惑....投影变换是用来延伸我们的坐标嘛?比如说glFrustum函数..和gluPerspective函数
他们有是怎么延伸的...也就是说他们的参数..比如没有延伸前调用glTranslatef(0.0f,0.0f,6.0f)是看不到所画图象的...如果我要使用glTranslatef(0.0f,0.0f,6.0f)函数,就要做投影变换 才能看到所画的图象,嘛?

30 楼

[quote]投影变换是用来延伸我们的坐标吗?[/quote]
并不是这样的。

首先确定,无论你如何设置,OpenGL都只能在窗口的内部绘制图象。从这个意义上说,坐标定为[-1, 1]和坐标定为[-100, 100]是一样的。
比如调用glOrtho(-100, 100, -100, 100, -100, 100),看起来是将坐标范围从原来的[-1, 1]改变为[-100, 100],但实际上也可以理解为:坐标范围还是原来的[-1, 1],但是我们指定到OpenGL的坐标不再是原来的值了,而是将它们统一缩小100倍。
这是一个相对的概念。就像照相,人远离照相机,照相机远离人,思路不同,最终得到的图象却一样。

我来回复

您尚未登录,请登录后再回复。点此登录或注册