请登陆或者注册新用户 用户名 密码 记住密码 注册新用户

回 帖 快速回帖 发 新 帖 刷新版面
主题:[原创]OpenGL入门学习——第五课

作者:eastcowboy

专家分:25080

级别:126级别:126级别:126级别:126级别:126

发表时间:2006-10-7 15:10:00    [回复] 
楼主
大家久等了。

不知道是否还有人记得这个课程啊?下面是前面四课的连接,大家可以温习一下,新朋友也可以看看。
第一课,编写第一个OpenGL程序
第二课,绘制几何图形
第三课,绘制几何图形的一些细节问题
第四课,颜色的选择
第五课,三维的空间变换  ——→  本次课程的内容

今天要讲的是三维变换的内容,课程比较枯燥。主要是因为很多函数在单独使用时都不好描述其效果,我只好在最后举一个比较综合的例子。希望大家能一口气看到底了。只看一次可能不够,如果感觉到迷糊,不妨多看两遍。有疑问可以在下面跟帖提出。
我也使用了若干图形,希望可以帮助理解。

=====================未完,请勿跟帖=====================

 

作者:zhouditty

专家分:0

级别:1

发表时间:2006-10-9 13:45:00    [回复]  [引用]
21楼


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

 

作者:godtd

专家分:0

级别:1

发表时间:2006-10-15 12:41:00    [回复]  [引用]
22楼
支持一下!我准备要学了哦!

 

作者:瞬间移动

专家分:320

级别:2

发表时间:2006-11-24 22:34:00    [回复]  [引用]
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;
}

编译通过,但是运行后就有个黑色的窗口,里面看不到东西?有那里不对吗?

 

作者:eastcowboy

专家分:25080

级别:126级别:126级别:126级别:126级别:126

发表时间:2006-11-25 13:12:00    [回复]  [引用]
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();
}

如果仍然无法正确显示,可以把显卡驱动卸载了,试试用纯软件的方式运行。

 

作者:瞬间移动

专家分:320

级别:2

发表时间:2006-11-25 16:04:00    [回复]  [引用]
25楼
谢谢楼主,缩小后可以显示了。  看来是显卡太烂了啊....

 

作者:tean60

专家分:0

级别:1

发表时间:2007-1-9 21:18:00    [回复]  [引用]
26楼

简直可以用崇拜来形容

 

作者:wolfwl

专家分:0

级别:1

发表时间:2007-4-15 11:17:00    [回复]  [引用]
27楼
very good!!!!!!!!!!!!!!!!1111

 

作者:lizhiyuan

专家分:0

级别:1

发表时间:2007-7-20 11:55:00    [回复]  [引用]
28楼

 亲爱的朋友
打扰你们了!

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

麻烦各位了。

 

作者:TopWay

专家分:20

级别:1

发表时间:2008-7-10 9:27:00    [回复]  [引用]
29楼
对这章有点疑惑....投影变换是用来延伸我们的坐标嘛?比如说glFrustum函数..和gluPerspective函数
他们有是怎么延伸的...也就是说他们的参数..比如没有延伸前调用glTranslatef(0.0f,0.0f,6.0f)是看不到所画图象的...如果我要使用glTranslatef(0.0f,0.0f,6.0f)函数,就要做投影变换 才能看到所画的图象,嘛?

 

作者:eastcowboy

专家分:25080

级别:126级别:126级别:126级别:126级别:126

发表时间:2008-7-27 18:43:00    [回复]  [引用]
30
引用
投影变换是用来延伸我们的坐标吗?

并不是这样的。

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

 

[首页] [上页]  [下页] [尾页]     共有 30 回帖 当前第 2 页(共2页 20帖/页)     跳转至第
回 帖 快速回帖 发 新 帖 刷新版面

版主管理:  删除此帖   转贴   置顶   取消精华   强制结帖   >>>进入管理页面