V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hakono
V2EX  ›  问与答

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

  •  
  •   hakono · 2015-09-02 18:02:00 +08:00 · 5092 次点击
    这是一个创建于 3371 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    11 条回复    2015-09-07 10:50:47 +08:00
    acros
        1
    acros  
       2015-09-02 19:00:53 +08:00
    不是很明白,每个单体都不一样的表现? 还是一起绕着一个方向走?

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

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


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

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

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

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

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

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

    贝塞尔曲线····我翻了下 cocos2d-x 里面就有简单的实现。就是选定点,然后目标在曲线上移动。
    实在不明白直接看他们的例子也可以。
    aa88kk
        11
    aa88kk  
       2015-09-07 10:50:47 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5648 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:54 · PVG 14:54 · LAX 22:54 · JFK 01:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.