查看: 3314|回复: 11

请教动态绘制圆柱体问题

[复制链接]

该用户从未签到

发表于 2009-3-2 07:04:52 | 显示全部楼层 |阅读模式
我想绘制一个跟随时间逐渐变长的圆柱体,如何实现?
如果想要顺序绘制几个圆柱体,如何控制他们的回调函数?
想要绘制透明效果,如何实现?好像只有一半是透明的?
希望高手指点!

该用户从未签到

发表于 2009-3-2 09:39:19 | 显示全部楼层
建议自己派生Geometry类来实现,可以参考我的osgModeling工程的各种算法。如果需要动态效果的话,可以设置对象的DataVariance为DYNAMIC,在回调里面更改顶点数组的数据并执行dirtyDisplayList()来更新。

“如果想要顺序绘制几个圆柱体,如何控制他们的回调函数”,没有太明白您想要完成的工作,我个人不认为这和绘制单个圆柱有什么区别。

透明效果的话,可以在设置颜色数组的时候指定Alpha分量的值,并使用Alpha检验和Blend混合来控制。

该用户从未签到

 楼主| 发表于 2009-3-2 10:36:11 | 显示全部楼层

多谢array版主的耐心解答!但是,我的问题还没有解决!

多谢array版主的耐心解答!但是,我的问题还没有解决!
问题如下!
1)我已经可以实现动态的绘制矩形线框,如左上角和左下角的两点位置不变,右上角和右下角的位置动态改变。
但是,动态绘制圆柱体,用同样的方法还是没有实现,再次麻烦array版主给与解答!
2)我说的是一个圆柱体绘制完成后,再继续绘制第二个,第二个绘制完成后,再绘制第三个,如此进行,怎样控制绘制先后顺序!我用回调函数实现了动态矩形线框绘制,但是,是两个同时绘制。
3)透明效果也有问题,如果是绘制透明的圆柱体,则总是有一半是透明的,另一半显示的不透明,如何解决?

该用户从未签到

发表于 2009-3-2 12:21:26 | 显示全部楼层
关键问题在于,我不知道您是如何绘制圆柱体的,因此问题1)和3)我都无法再给您更多的建议了。我以前做过动态车削的例子,因此圆柱体的动态伸长缩短肯定是可以做到的,其方法与您的代码实现方式密切相关。

2)的话,您需要自己编写代码处理,例如在回调里判断第一个对象绘制完毕,才打开第二个对象的绘制标志(可以用一个布尔变量在这里控制)等等。

该用户从未签到

 楼主| 发表于 2009-3-2 12:46:19 | 显示全部楼层

继续

代码附件中!

drawtranperv.rar

2.83 KB, 下载次数: 220, 下载积分: 威望 1

该用户从未签到

 楼主| 发表于 2009-3-2 12:57:01 | 显示全部楼层

继续!

第二个问题继续:
1)已知几个圆柱体的底和顶面中心位置,应该更复杂一些,考虑某几个圆柱体顶或底面需要在某个面上进行投影,形成椭球面。

需要将这一系列圆柱体顺序绘制出来,如何控制?我的想法是:假设圆柱体沿x轴进行绘制,即顶和底面在yz平面上,当地平面顶点的x值大于某个数值时,设定全局变量,进行第二个圆柱体的绘制。

即在代码中
   for (osg::Vec3* itr = begin+count/2;itr<end;itr++)

进行判断,结果出错,总是显示顶平面数据被调用。


2)另外,附件代码中有绘制透明立方体代码,我绘制时发现立方体总是一面是透明的,另一面没有透明效果。

该用户从未签到

 楼主| 发表于 2009-3-2 13:00:47 | 显示全部楼层

如果模拟手电筒的光束,如何更好的实现其效果?

如果模拟手电筒的光束,如何更好的实现其效果?
希望能有3ds max中模拟汽车前灯的那种效果。
多谢版主指点!

该用户从未签到

发表于 2009-3-2 13:36:17 | 显示全部楼层
对于顺序绘制圆柱体,我个人倒是建议写一个Drawable::CullCallback回调,当cull函数返回true时,该Drawable对象会被裁减掉因而不在场景中显示。您可以以此来控制当前帧要绘制哪些圆柱体而不绘制哪些

对于Blend的问题,说实话OSG里面不是很好控制,往往必须使用setRenderBinDetails严格设置渲染顺序才行;这里我个人更倾向于使用着色语言。

模拟手电筒光照的话,绘制圆锥并用着色语言控制,或者使用纹理和法线控制自发光效果,都是可行的选择

该用户从未签到

 楼主| 发表于 2009-3-2 16:44:16 | 显示全部楼层

着色语言

对于着色语言,听说过,很想学习一下,如何入门?有没有好一点的书?比较权威类的。
看了一下网站中关于shader版区,只有hihe教程,没有比较详细而权威的中文介绍,希望指教!
多谢了!

后两个问题,多谢array版主的关注和指点,可以我的动态圆柱还是没有绘制出来。希望您能继续指点!

该用户从未签到

发表于 2009-3-2 19:10:28 | 显示全部楼层
目前市面上只有《OpenGL着色语言》一本书,作者Randi J. Rost,俗称“橙皮书”。应当说是和“红皮书”一起为OpenGL开发者人手必备的。

此外您的程序中对于VBO的应用似乎有误,通常这样设置就可以了:
setUseDisplayList(false);
setUseVertexBufferObjects(true);

我对于您的动态圆柱绘制恐怕也提不出更多的意见,您的代码里似乎也没有这方面的内容;因此我无法得知您的思路事实呢么以及问题出在哪里。通常的做法几乎肯定是在回调中实时更改顶点的值来实现这类动画的

该用户从未签到

 楼主| 发表于 2009-3-3 07:13:16 | 显示全部楼层

关于回调函数

利用osg::ref_ptr<osg::Node> createQuad()进行圆柱体绘制,前提是

注释掉geom->setUpdateCallback(new MyGeometryCallback1(pos1,pos2));

否则不执行,
多谢array的关注,

还有关于vbo,之前没有理解,多谢指正!

该用户从未签到

发表于 2009-3-3 09:09:49 | 显示全部楼层
我个人的意见是先不要设计得太过复杂,VBO还有Functor之类的如果不熟悉没必要都用上。往回调里面传递顶点数组的Vec3Array*的指针,然后每一帧对其进行改动就可以了,注意及时dirtyDisplayList和设置DYNAMIC
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表