标题可能略饶,但实际上想求助的问题很简单:
windows 下,我想用 GDI+实现一个很多蝴蝶在窗口内沿着随机顺滑曲线飞行的效果
但问题来了,本来以为搞几个随机贝塞尔曲线,然后画到屏幕上就成了。却没想到困难重重(我没相关经验)
首先一个问题就是,这路径该怎么实现……因为画蝴蝶的时候得按照飞行的切线方向进行旋转,这就得记录路径了,同时还得控制路径始终保持在窗口内,不能随机飞来飞去结果跑到窗口外了
再其次就是贝塞尔公式算出的坐标怎么映射到屏幕…………直接拿来画运动路径简直各种惨不忍睹,直接就是蝴蝶在屏幕上跳了,而不是在“飞”
关于这两个问题大家能否服给出点建议?最好是具体点的。曾有人跟我说去找路径算法,但我谷歌了半天搜出来的全部都是最短路径算法这东西……不是我想要的
1
acros 2015-09-02 19:00:53 +08:00
不是很明白,每个单体都不一样的表现? 还是一起绕着一个方向走?
这个说起来稍微麻烦,推荐你看这本书的 Chapter 13: Crowd Simulation ,网上能找到 pdf 的应该: http://item.jd.com/19173285.html 网上有类似例子,之前看过一个的,关键词 flock 。 |
2
acros 2015-09-02 19:03:00 +08:00
另外曲线不行吗?
先在屏幕上随机取几个点,为了让点分散点,可以将屏幕分象限,然后根据取的点生成曲线移动蝴蝶。 |
3
acros 2015-09-02 19:06:24 +08:00
|
4
zx120120 2015-09-02 19:25:54 +08:00
有关曲线的问题请看:
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-837-computer-graphics-fall-2012/lecture-notes 这里的 PPT 解释的比较清楚完整,看完这里的第一章和第二章的 PPT ,相信你就能自己回答这两个问题了。 但是我感觉用曲线去模拟不会取得太好的效果。 有两个问题比较难处理,一个是随机出的曲线很可能要么看起来太乱要么就太有规律,另外一个是直接跟着路径飞匀速地飞话会很生硬。 所以我建议你还是用类似粒子动画的方式去模拟蝴蝶的运动,加上一个重力加速度,然后高度太低了就往上非。类似的方式去做应该会比较自然一些。 |
7
theoractice 2015-09-02 20:20:47 +08:00
第一个问题,切线就是算斜率。你能算出每帧的蝴蝶坐标,斜率肯定就能算啦。
第二个,看上去跳跃的话,步长设置得小一点就行了嘛。 另外我看楼上都是没做过的,一来随机曲线做好看其实很容易。尤其是蝴蝶飞到屏幕边缘绕个弯又飞回来那种。二来默认的贝塞尔算法算出来的坐标,根本就不是匀速运动的模式。当然这个并不是什么问题。 |
8
hakono OP @acros 感谢推荐书籍,不过这本书看来要用到 Direct3D ? 从没学过 3D 开发不知道是否能看懂
不过你的先定点,再连曲线的想法的确似乎很可行,至少不用算窗口边界了…… 给出的那个网站示例好炫,其实我只是想画 N 只蝴蝶在窗口上做上下左右随机飞行的,当然能做成那个网站的效果自然好,但看来得用到 3D 吧 OTL |
9
hakono OP @theoractice 我居然忘了我既然连曲线方程式都有了,求个导不就有斜率了吗 OTL 但是几何白痴忽然发现我不会求坐标系的导…………等会问问学霸室友吧……
第二点问题,关于步长之类的我想了半天越想越混乱,总之就是脑内一团浆糊 总结出来就是我在屏幕上画曲线之类的画到现在,基本总是画不出我要的效果,比如步长就算取小了,但如果面对极度陡峭的线时,画到屏幕上可能还是会出现跳跃(比如起始点(0,0 )终点(1,500 )这样 x 只有一个像素差的线) 然后把没有单位的曲线方程画到有单位(像素)的屏幕上,怎么转换之类的我也依旧想不懂 |
10
acros 2015-09-02 23:28:07 +08:00
@hakono Crowd Simulation 只要看下实现思路就好了,就是解释怎么控制一个群体移动,避免穿插、混乱等等,和 D3D 关系不大,只是用到了一些数学库而已。
贝塞尔曲线····我翻了下 cocos2d-x 里面就有简单的实现。就是选定点,然后目标在曲线上移动。 实在不明白直接看他们的例子也可以。 |
11
aa88kk 2015-09-07 10:50:47 +08:00
|