查看: 1886|回复: 9

如何逐点显示曲线

[复制链接]

该用户从未签到

发表于 2011-3-23 10:08:52 | 显示全部楼层 |阅读模式
画了一条曲线,但是构成曲线的50个点是同时显示的,现在想让这些点隔一小会一个一个的显示。尝试了“在点的压入栈函数 push_back() 后加 Sleep(20) 语句”,发现显示结果是“将点每压入栈一次暂停20ms”, 而不是每显示一个点暂停20 ms。请问如何实现每显示一个点暂停20 ms 然后再显示下一个点呢?

该用户从未签到

发表于 2011-3-23 11:53:34 | 显示全部楼层
你这50个点是怎么画的啊,你可以在画的时候控制;也可以在回调里更改stateset实现

该用户从未签到

 楼主| 发表于 2011-3-23 12:18:27 | 显示全部楼层
用 for 循环, 就是每得到一个点的坐标将点push_back() 压入堆栈,不知画的时候怎么控制呢?

该用户从未签到

发表于 2011-3-23 12:46:07 | 显示全部楼层
您应该在每帧的更新回调中判断是否要新加顶点,从而实现逐步添加数据的效果;在同一帧里多次使用Sleep的行为是疯狂的

该用户从未签到

 楼主| 发表于 2011-3-24 21:34:25 | 显示全部楼层
王老师,在更新回调中这两行代码是什么意思呢?
osg::Vec3&pt = vertices->back();
vertices->dirty();

该用户从未签到

发表于 2011-3-24 21:49:36 | 显示全部楼层
我还没写过一行OSG代码,但是一直在看书,老师忙的很,我试着解答一下不知道对不对,不对老师再来指正,顺便也纠正一下我的错误理解吧,呵呵。
第一行是不是从 集合或堆栈或队列里返回最后一个向量(返回的同时该集合将丢失该元素,也就是从n个编程了n-1个)
第二行应该是告诉OSG该集合有了变化,渲染的时候应该重新计算。

该用户从未签到

 楼主| 发表于 2011-3-24 21:57:36 | 显示全部楼层
在下一帧更新回调时还想保留上一帧的效果,应该如何实现呢?

该用户从未签到

发表于 2011-3-24 22:15:22 | 显示全部楼层
我想你误解了,你不能把每一帧连起来考虑,其实下一帧和上一帧根本没啥关系的。
你的理解可能像在纸上作画,每增加一笔纸张上都多了一点东西。OSG不是这样子的,你应该这样理解:
每一帧之前都需要用橡皮擦将以前的全部擦去再画,所以为了实现逐渐增加的动画效果的话应该是这样子的;
在上一帧中你画n个点,下一帧画N+1个点,那样就能实现逐渐变长的效果了(但是每一帧时间是很短的,所以你可以每x帧或者每隔x毫秒增加一个点或者当达到绘制全部点后再从第一个点开始循环或者之后一直保持显示全部的点,看你的需要)。
总之类似如下伪代码函数:
画点(数组地址,数组长度,需要绘制的个数m);//个数小于等于数组长度
然后你在每一帧里面调用这个函数画点,改变m的值即可。
在OSG里面实现细节我不清楚,但我想就像你顶楼所说的用 push_back()的话,也就是多压入一个后续点即可。(OSG不管你要啥效果,它只管在每一帧都将栈里所有的点画一遍,但看起来就是逐渐延伸的了)

该用户从未签到

 楼主| 发表于 2011-3-24 22:31:32 | 显示全部楼层
回复 8# rcyboom


    谢谢啊,感觉思路清晰多了

该用户从未签到

发表于 2011-3-24 23:29:23 | 显示全部楼层
要对数据以及逻辑处理线程与渲染线程区分清楚,Sleep只是对你的数据处理线程起作用,而对osg渲染线程不会起作用,除非你人为在Render Thread中加入信号量进行控制;
渲染中你可以使用帧数统计完成你想要的显示效果,也即回调中判断条件:如果达到一定的帧数则执行下一步的顶点绘制等,否则当前回调不继续执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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