随机曲线运动路径具体该怎么实现?以及如何映射到屏幕上( C/C++

2015-09-02 18:02:00 +08:00
 hakono

标题可能略饶,但实际上想求助的问题很简单:
windows 下,我想用 GDI+实现一个很多蝴蝶在窗口内沿着随机顺滑曲线飞行的效果

但问题来了,本来以为搞几个随机贝塞尔曲线,然后画到屏幕上就成了。却没想到困难重重(我没相关经验)
首先一个问题就是,这路径该怎么实现……因为画蝴蝶的时候得按照飞行的切线方向进行旋转,这就得记录路径了,同时还得控制路径始终保持在窗口内,不能随机飞来飞去结果跑到窗口外了

再其次就是贝塞尔公式算出的坐标怎么映射到屏幕…………直接拿来画运动路径简直各种惨不忍睹,直接就是蝴蝶在屏幕上跳了,而不是在“飞”

关于这两个问题大家能否服给出点建议?最好是具体点的。曾有人跟我说去找路径算法,但我谷歌了半天搜出来的全部都是最短路径算法这东西……不是我想要的

5069 次点击
所在节点    问与答
11 条回复
acros
2015-09-02 19:00:53 +08:00
不是很明白,每个单体都不一样的表现? 还是一起绕着一个方向走?

这个说起来稍微麻烦,推荐你看这本书的 Chapter 13: Crowd Simulation ,网上能找到 pdf 的应该:
http://item.jd.com/19173285.html

网上有类似例子,之前看过一个的,关键词 flock 。
acros
2015-09-02 19:03:00 +08:00
另外曲线不行吗?
先在屏幕上随机取几个点,为了让点分散点,可以将屏幕分象限,然后根据取的点生成曲线移动蝴蝶。
acros
2015-09-02 19:06:24 +08:00
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 ,相信你就能自己回答这两个问题了。


但是我感觉用曲线去模拟不会取得太好的效果。
有两个问题比较难处理,一个是随机出的曲线很可能要么看起来太乱要么就太有规律,另外一个是直接跟着路径飞匀速地飞话会很生硬。

所以我建议你还是用类似粒子动画的方式去模拟蝴蝶的运动,加上一个重力加速度,然后高度太低了就往上非。类似的方式去做应该会比较自然一些。
wuxiaomo
2015-09-02 19:48:09 +08:00
@acros hi 请问有没有 2d 类似的书籍?
acros
2015-09-02 20:06:06 +08:00
@wuxiaomo 哪类,动画? 纯 2d 的不知道,估计现在也很难找到了吧, dx9 时代的书几乎都是 2D 3D 通讲了。
theoractice
2015-09-02 20:20:47 +08:00
第一个问题,切线就是算斜率。你能算出每帧的蝴蝶坐标,斜率肯定就能算啦。

第二个,看上去跳跃的话,步长设置得小一点就行了嘛。

另外我看楼上都是没做过的,一来随机曲线做好看其实很容易。尤其是蝴蝶飞到屏幕边缘绕个弯又飞回来那种。二来默认的贝塞尔算法算出来的坐标,根本就不是匀速运动的模式。当然这个并不是什么问题。
hakono
2015-09-02 21:56:31 +08:00
@acros 感谢推荐书籍,不过这本书看来要用到 Direct3D ? 从没学过 3D 开发不知道是否能看懂

不过你的先定点,再连曲线的想法的确似乎很可行,至少不用算窗口边界了……
给出的那个网站示例好炫,其实我只是想画 N 只蝴蝶在窗口上做上下左右随机飞行的,当然能做成那个网站的效果自然好,但看来得用到 3D 吧 OTL
hakono
2015-09-02 23:04:43 +08:00
@theoractice 我居然忘了我既然连曲线方程式都有了,求个导不就有斜率了吗 OTL 但是几何白痴忽然发现我不会求坐标系的导…………等会问问学霸室友吧……

第二点问题,关于步长之类的我想了半天越想越混乱,总之就是脑内一团浆糊
总结出来就是我在屏幕上画曲线之类的画到现在,基本总是画不出我要的效果,比如步长就算取小了,但如果面对极度陡峭的线时,画到屏幕上可能还是会出现跳跃(比如起始点(0,0 )终点(1,500 )这样 x 只有一个像素差的线)
然后把没有单位的曲线方程画到有单位(像素)的屏幕上,怎么转换之类的我也依旧想不懂
acros
2015-09-02 23:28:07 +08:00
@hakono Crowd Simulation 只要看下实现思路就好了,就是解释怎么控制一个群体移动,避免穿插、混乱等等,和 D3D 关系不大,只是用到了一些数学库而已。

贝塞尔曲线····我翻了下 cocos2d-x 里面就有简单的实现。就是选定点,然后目标在曲线上移动。
实在不明白直接看他们的例子也可以。
aa88kk
2015-09-07 10:50:47 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/217912

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX