代码之家  ›  专栏  ›  技术社区  ›  Tigran

OpenGL中的动画[关闭]

  •  2
  • Tigran  · 技术社区  · 15 年前

    我想请您分享一些关于如何在OpenGL应用程序中实现动画支持的想法。 例如,如果我们希望在用户输入触发某些事件的情况下,在屏幕上动画一个球粒子,我们需要如何组织我们的代码?:

    1. 将动画属性设置为球粒子对象的成员?(包含一组要应用于所有者模型的矩阵,它们之间的延迟,是否播放动画等。)
    2. 需要有一个包含球粒子和应用动画之间关系的中央存储库(老实说,我更喜欢这个)。?
    3. 还有什么……?

    渲染之后呢?如何使其流动和快速?(我知道这是非常上下文敏感的,但只是为了给出一个想法…)

    3 回复  |  直到 8 年前
        1
  •  3
  •   Luca    15 年前

    我会定义一个 动画 类,它可以实现以下动画:

    • 旋转/平移/缩放动画
    • 关键帧动画
    • 蒙皮动画

    当然,上面列出的动画技术之一需要对 对象 班级。

    轮转翻译 动画需要访问 对象 模型视图矩阵; 关键帧 动画需要访问模型顶点缓冲区; 剥皮 动画需要访问 对象 (材质球属性和程序,或使用扩展的顶点属性)。

    除剥皮外,还应执行通用值(浮点、向量或矩阵)的插值,以便使用插值公式(与genpfault链接的公式相同)更改值。所以一个 插补器 类应能轻松引入新的插值方程。

    动画类使用一组 插补器 执行动画的实例(更改要插值的值)。如何选择、访问和修改值(范围),应在 对象 班级。

    在这一点上,必须有一个 时间线 类,该类定义已用时间(不能是实际时间),该类触发 动画 实例(或者可能是 插补器 实例)使插值值前进中间值。

    这个 动画 实例在上排队 时间线 类,所以它知道 动画 实例处于活动状态。激活可能是由用户输入或以编程方式使用内部生成的事件引起的。终止 动画 执行 动画 类可以定义 被阉割的 方法是从 时间线 实例(可能是 动画 可以循环动画以获得连续动画)。


    当然,一切都取决于你的实际需求。

    在动画计算可能需要很长时间的情况下,可以缓存整个模型数据并在单独的线程中运行动画。一旦终止,模型就可以被更新,从而阻塞渲染循环。

    但是,我会考虑通过向着色程序发出适当的数据来内联动画处理,从而允许更快的计算,这可以提高系统性能。

        2
  •  4
  •   genpfault    15 年前

    就“流畅和快速”而言,您可能希望了解 easing equations 应用于动画插值值。

        3
  •  1
  •   Aaron Digulla    15 年前

    OpenGL不支持动画;您需要编写自己的框架(例如使用GLX, see this article )或使用现有框架,如 ones mentioned here .

    推荐文章