游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2773|回复: 6

请教高手一个OPENGL编程问题!!!急!!!

[复制链接]

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2006-8-2 22:28:00 | 显示全部楼层 |阅读模式
        我在做一三维根系图形的编程,现在所生成的图象是:在同一窗口下生成两个根系图象,我是先生成一个图形,再通过glTranslate(),平移后调用同样的函数生成另一根系图形,所以两个根系是完全相同的 ,我想问的问题:
       因为是三维的图象,有X,Y.Z三的坐标,第一个图形是在窗口的中心生成的,这是系统编程默认的原点,我调用glTranslate()后,相当于把原点平移,平移后在窗口的另一个地方生成了另一个根系,现在就想做的是,怎么样得到另一个根系在这个生成两根系的窗口中,以窗口中心为原点的三维坐标.
       根系的生成是根据不同的点连接到一起生成的,这些都是三维的点(X,Y,Z),那么平移后生成的根系上的各个点的坐标(以窗口的中心为原点(0.0.0)下的坐标)怎么确定??
       不知道我表述清楚没有,忘哪位高手能给予指点,十分感谢!!!!急!!! [em24] [em24] [em24]

41

主题

184

帖子

184

积分

注册会员

Rank: 2

积分
184
发表于 2006-8-2 22:45:00 | 显示全部楼层

Re: 请教高手一个OPENGL编程问题!!!急!!!

你已知了根系模型的坐标(x,y,z)。
在不做任何变化的情况下,在视口坐标系中,它的坐标为(x,y,z)。OpenGL默认的视口范围是x(-1,-1),y(-1,1),z(0,1)。

现在你调用了平移函数gltranslate(x',y',z')那么它的坐标就是(x+x',y+y',z+z')。

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-8-3 13:16:00 | 显示全部楼层

Re:请教高手一个OPENGL编程问题!!!急!!!

   我现在要实现的是:平移后的根系,在生成的时候,碰到了未平移的根系,那么这个根系会改变它的生长方向,这就是根系生成时的回避问题,两根长到一起的时候,它们会各自的避开,改变生长方向!!!!
   我就要通过两个根系的生成过程中的坐标来对比,当两根系在某时间都长到某一点,即有相同的坐标,就确定它们碰到了一起,通过检测然后来改变各自的生长方向,让它们绕开!!!
哦,但是调用gltranslate()后,所画的根系的每点坐标是以平移的新原点坐标为准则,那么在数据缓冲区中的根系坐标还是与没平移前的根系坐标相同,是不?
    因为gltranslate()的定义是相当于平移了坐标系,那么所画的图象在平移后以新原点来执行,它的数据缓冲区中是与原来没平移前的根系坐标相同,我不能直接通过指针调用数据缓冲区的数据来得到新根系的实际窗口坐标,应该怎么来得到新根系的实际坐标,然后与第一个根系进行坐标对比呢?简单的(x+x',y+y',z+z')这样计算行吗?

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-8-3 13:31:00 | 显示全部楼层

Re: 请教高手一个OPENGL编程问题!!!急!!!

      这是我生成的两个根系的图象,现在还没有实现根系之间的回避问题!!!!望高手指点,问题如上!!!!!! [em10] [em10]

sf_200683133118.rar

19.89 KB, 下载次数:

41

主题

184

帖子

184

积分

注册会员

Rank: 2

积分
184
发表于 2006-8-6 02:18:00 | 显示全部楼层

Re: 请教高手一个OPENGL编程问题!!!急!!!

不好意思,这几天电脑中病毒了,重装了系统,回的晚了一点。

这个问题好像和OpenGL没有关系,是和你的建模有关系,记住OpenGL只管显示的问题。

你可以创建两个根系,它们的初始生长点不一样,比如一个在x=-0.5,一个在x=0.5处,然后按你的模拟方法。最好在调用OpenGL显示。

当你调用OpenGL显示的时候,是不改变模型的原始数据的。

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-8-8 10:04:00 | 显示全部楼层

Re:请教高手一个OPENGL编程问题!!!急!!!

     谢谢啊!!
     我现在就是关于OPENGL的坐标方面的问题不是很清楚,系统默认视口的范围是x(-1,-1),y(-1,1),z(0,1),我在进行画图和图象平移时gltranslate(x',y',z'),X,Y,Z的值是以CM为单位的数据,很大,模型的坐标的原始数据也比较大,根据空间三维坐标来进行图形的实现的,但是这些坐标间的转换和关系不是很清楚,同时我进行两根系数据的对比也是以原始数据来进行的,现在要进行坐标的变动来实现根系的回避,这些也不是很清楚,希望高手能给于指点,万分感谢!!!!!!

41

主题

184

帖子

184

积分

注册会员

Rank: 2

积分
184
发表于 2006-8-8 14:06:00 | 显示全部楼层

Re:请教高手一个OPENGL编程问题!!!急!!!

还是那句话,OpenGL中的命令都只管显示的内容,和你模拟是不相关的。

比如你有一棵树的数据tree[N],数组中的每一个元素包含一个顶点,它有自己的坐标单位。如果你不想设置OpenGL的视口变换矩阵,那么你就把的坐标范围限制在-1到1之间。
for(int i=0;i++;i<N)
tree.x*ScaleX;
tree.y*ScaleY;
tree.z*ScaleZ;
这样就把它们缩放到OpenGL可以显示的范围了

/********************************************************************/

如果你要显示两棵树,那么使用两个数组来保存数据,tree1[N],tree2[N],假设这两棵树相对于原始得树的位移是(x1,y1,z1)和(x2,y2,z2)那么,先把数据变换到这两个树里:
for(int i=0;i++;i<N)
tree1.x+x1;
tree1.y+y1;
tree1.z+z1;

tree2.x+x2;
tree2.y+y2;
tree2.z+z2;

结下来进行你的模拟操作,删除,添加,改变 tree1或tree2的顶点数据,这些我帮不了你,不是我的专业了,也不关OpenGL的事。

最后得到tree1和tree2的结果数据,调用OpenGL把它显示出来。使用前面的方法,把它们缩放到OpenGL可见的范围,即tree1和tree2的数据中不能有小于-1或大于1的点。
然后绘制两棵树:
绘制tree1
glBegin(GL_LINE_STRIP); //记不太清了,查一下手册,绘制折线的参数
for(int i=0;i++;i<N)
glVertex3f(tree1.x,tree1.y,tree1.z);
glEnd();

tree2的绘制方法和上面一样。

留给联系方式吧,这个论坛好慢,有问题直接发邮件给我:
zhouwei02@mails.tsinghua.edu.cn
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 02:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表