【问题标题】:OpenGL Water fountain simulation [closed]OpenGL喷泉模拟[关闭]
【发布时间】:2012-12-10 17:48:46
【问题描述】:

我的任务是创建一个带有水粒子和水面碰撞的喷泉模拟。至此,我已经使用一个着色器创建了水面,另一个着色器创建了喷泉粒子(喷泉粒子的着色器也使用了变换反馈机制)。

我的问题是:如何制作/检测喷泉粒子和水面碰撞? - 我想知道,我如何从平面的着色器/GL 缓冲区和粒子的着色器/GL 缓冲区获取/连接信息以进行碰撞 - 我知道水波方程和碰撞检测方法 - 我只是不知道为什么允许 OpenGL 的 API。

【问题讨论】:

  • 这个问题根本不属于这里。该网站旨在帮助有问题的人,而不是为一般问题提供解决方案。 whathaveyoutried.com
  • 你能用数学方法描述水面吗?我假设粒子只是一个小球体?
  • 也许我的问题不正确。我想知道如何从平面着色器中获取平面顶点,从 GL 缓冲区中获取粒子顶点以进行碰撞。

标签: c++ opengl simulation


【解决方案1】:

您描述的问题与 OpenGL 的工作描述不符。 OpenGL是一个绘图API,它的目的是画出漂亮的图片。碰撞检测之类的东西完全超出了 OpenGL 的范围。

但是,您可以使用 OpenGL 来实现基于图像的算法来执行与您的问题匹配的基于图像的测试。在您的情况下,我会在正交投影中从顶部渲染水面,然后在启用深度测试的情况下渲染每个粒子。使用 Occlusion Query 我会测试粒子是否仍然可见。对于每一帧,我都会比较粒子可见性是否发生变化:如果它消失了,它会进入水下并发生碰撞。

这种方法有效,但坦率地说,我会说它完全被过度设计了。只需测试地面以上的颗粒高度是否大于平均水位;对于小波纹,这已经足够准确了。

【讨论】:

  • 是的,第二种方法要容易得多,我知道我可以在粒子着色器中简单地做到这一点,但这暗示了我的下一个问题:我将如何知道(或程序如何知道)什么是这个粒子的坐标(X和Z)在一定高度(水有不同的着色器) - 这样我就可以在粒子与水面碰撞的地方在水面上产生波纹?我应该以某种方式在 CPU 上预先计算它吗?
  • @Shot:您应该在执行粒子动画的代码中处理这个问题。就像粒子一样,您必须将一些几何图形发送到 OpenGL 以渲染水面;很可能是某个四边形,在其上应用波纹着色器。你测试这个四边形的几何形状,或者只是它跨越的平面。你知道,取一个平面方程,把粒子位置放进去,然后测试得到的数字是正数还是负数。
【解决方案2】:

您需要做的是调查 OpenCL 与 OpenGL 互操作的可能性。查看here 的 nVidia 示例,该示例显示了使用 OpenCL 进行粒子碰撞模拟(使用 OpenGL 进行渲染)。 OpenGL 作为计算 API 是非常有限的,如果不跳槽就很难做你想做的事(我想有可能——只是不太容易)。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2011-02-23
    • 2013-04-19
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2011-09-12
    相关资源
    最近更新 更多