回 帖 发 新 帖 刷新版面

主题: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]
[url=http://www.programfan.com/club/showbbs.asp?id=196017]第五课,三维的空间变换[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196231]第六课,动画的制作[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=218828]第七课,使用光照来表现立体感[/url]
第八课,使用显示列表  ——→  [color=0000FF]本次课程的内容[/color]

今天介绍关于OpenGL显示列表的知识。本课内容并不多,但需要一些理解能力。在学习时,可以将显示列表与C语言的“函数”进行类比,加深体会。

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

回复列表 (共19个回复)

11 楼

你写的太好了,以后要是看不到这么好的教程怎么办啊

12 楼

谢谢拉.....下回去慢满研究

13 楼

请问有没有OpenGL超级宝典的GLTOOLS库
里面有一些计算法线向量,规范化向量,压平模型等函数还挺不错的
如果有类似的东西,也帮我发一份,谢谢!

kyotk@163.com

14 楼

www.niusoft.net 中国程序员之家,有大量的技术文章,欢迎访问

15 楼

等CHM版的

16 楼

楼主辛苦了

17 楼

发现4楼那个例子中,计算正四面体坐标值的结果是错误的。数学没学好,有点失败啊。现在列出计算方法和新的计算结果,等下我会把4楼的错误修正过来。

  设正四面体中心为坐标原点,边长为1。并假设正四面体四个顶点中有一个顶点D在y轴正方向,另有一个顶点C在y轴和z轴所在平面内。
  观察正三角形ABC,由于边长为1,所以每边中点距离三角形中心的距离为sqrt(3)/6,每顶点距离三角形中心的距离为sqrt(3)/3。因为顶点D和正四面体中心都在y轴上,所以三角形ABC的中心也必在y轴上,所以顶点C的z坐标就是C到三角形ABC中心的距离(或其相反数),这里取-sqrt(3)/3。而顶点A和B的z坐标就是线段AB到三角形ABC中心的距离(或其相反数),这里取sqrt(3)/6。
  设三角形ABC的中点为P,线段AB的中点为Q,正四面体的中心为O,容易证明DOP三点在一直线上,线段PQ的长度为sqrt(3)/6,线段DQ的长度为sqrt(3)/2。根据勾股定理可计算DP的长度为sqrt(6)/3。设线段OD长度为x,则因为正四面体的高度对称性,容易证明线段OA的长度也为x,由于QA的长度为0.5,在三角形QAO中,根据勾股定理可计算OQ的平方为x^2 - 1 / 4。又在三角形POQ中,线段OP长度为DP - DO = sqrt(6)/3 - x,根据勾股定理,OQ的平方为1/12 + (sqrt(6)/3 - x)^2,即x^2 - 2*sqrt(6)*x/3 + 3/4。因此得到方程x^2 - 1/4 = x^2 - 2*sqrt(6)*x/3 + 3/4,容易解得x = sqrt(6)/4。于是DO = sqrt(6)/4,PO = DP - DO = sqrt(6)/3 - sqrt(6)/4 = sqrt(6)/12。
  有了以上数据,就可以得到各顶点的坐标了。
  设正四面体中心为坐标原点,边长为1。并假设正四面体四个顶点中有一个顶点D在y轴正方向,另有一个顶点C在y轴和z轴所在平面内。
  观察正三角形ABC,由于边长为1,所以每边中点距离三角形中心的距离为sqrt(3)/6,每顶点距离三角形中心的距离为sqrt(3)/3。因为顶点D和正四面体中心都在y轴上,所以三角形ABC的中心也必在y轴上,所以顶点C的z坐标就是C到三角形ABC中心的距离(或其相反数),这里取-sqrt(3)/3。而顶点A和B的z坐标就是线段AB到三角形ABC中心的距离(或其相反数),这里取sqrt(3)/6。
  设三角形ABC的中点为P,线段AB的中点为Q,正四面体的中心为O,容易证明DOP三点在一直线上,线段PQ的长度为sqrt(3)/6,线段DQ的长度为sqrt(3)/2。根据勾股定理可计算DP的长度为sqrt(6)/3。设线段OD长度为x,则因为正四面体的高度对称性,容易证明线段OA的长度也为x,由于QA的长度为0.5,在三角形QAO中,根据勾股定理可计算OQ的平方为x^2 - 1 / 4。又在三角形POQ中,线段OP长度为DP - DO = sqrt(6)/3 - x,根据勾股定理,OQ的平方为1/12 + (sqrt(6)/3 - x)^2,即x^2 - 2*sqrt(6)*x/3 + 3/4。因此得到方程x^2 - 1/4 = x^2 - 2*sqrt(6)*x/3 + 3/4,容易解得x = sqrt(6)/4。于是DO = sqrt(6)/4,PO = DP - DO = sqrt(6)/3 - sqrt(6)/4 = sqrt(6)/12。
  有了以上数据,就可以得到各顶点的坐标了。
   A点:(  0.5,   -sqrt(6)/12, -sqrt(3)/6)
   B点:( -0.5,   -sqrt(6)/12, -sqrt(3)/6)
   C点:(    0,   -sqrt(6)/12,  sqrt(3)/3)
   D点:(    0,    sqrt(6)/4,           0)

18 楼

你好!真的感谢你的教程。
这一课我有一个小小的问题:
void myDisplay(void)
{
    static int list = 0;
    if( list == 0 )
    {
        // 如果显示列表不存在,则创建
。。。。
        }
这里,list一直是被赋值为0的,那么每次都要创建一个新的list吗?我试着把这个赋值语句放到外面,然后再
list = glGenLists(1);
后面加上了一个打印list值的语句,结果运行的时候发现这个语句只被执行了一次,为list=0。也就是说这个语句只被执行了一次,那么也就是说后面再次进入display函数的时候(从myidle函数),就不会再进入if内部了,但是list的值是0阿,如果进行if判断,应该是会再次进入阿。这个好像自相矛盾。我搞不太明白。

19 楼

to mmjuns:
因为list被声明为static类型的变量,这种变量只在第一次使用前进行初始化,而以后将一直保持它的值,即使函数返回了也不会被销毁,下次调用这个函数时,继续使用上次设置好的值。
所以,list最初被初始化为0。第一次调用myDisplay时,if条件成立,因此执行if内部的语句,成功创建显示列表的话,list将被设置为一个不等于零的值,并且即使函数myDisplay返回了,这个值也一直保留,直到下次调用myDisplay时仍然存在。这时list不为零,if条件不成立,因此不会再次执行创建显示列表的操作。

这可是C语言的基本知识哦,建议mmjuns再看看书本。

我来回复

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