为在 OpenGL 中使用基本物理和渲染寻找一个好的形状类设计

Posted

技术标签:

【中文标题】为在 OpenGL 中使用基本物理和渲染寻找一个好的形状类设计【英文标题】:Looking for a good shape class design for the use of elementary physics and rendering in OpenGL 【发布时间】:2012-07-14 07:26:01 【问题描述】:

目前,我一直在研究一些 OpenGL,希望尽可能多地学习。现在我正在编写一个形状类,我希望可以在我选择承担的其他项目中使用和派生它。然而,我已经意识到有一些我需要考虑的因素。其中之一是质量、体积和密度的集合——更重要的是它们如何应用于几何图元本身。

任何轴向对齐的球体或边界框都可能派生自此类,以及将实际呈现到屏幕上的基元 - 2D 和 3D 都一样。我希望看看是否有人可以给我一些关于如何编写一个好的 Shape 类而不需要“放弃答案”的指示。我需要某种方向。

我身边的两个主要资源是 Nicol Bolas(我认为他的名字是这样拼写的)Learning Modern Graphics Programming 和 3D Math Primer for Graphics and Game Development 书。就渲染等方面的基础和高级概念而言,这些应该就足够了。

我目前正在寻找的是关于如何构建此类的指南。我现在要做的最后一件事就是遵循教程,这些教程涉及从静态值在屏幕上绘制三角形,因为我只是那种学得不太好的人之一;我通过实施自己的方法并同时依赖其他信息来源来学习。

到目前为止,这就是我所拥有的(注意 - 除了 ctor 和内联之外,这些方法都还没有实现):

class Shape
    
    public:
        Shape(float radius, glm::vec4 center_pos);
        virtual ~Shape(void)  

        virtual void draw(void) = 0;
        void collide(Shape& s);
    public:
        inline void setRadius(float radius)
        
            mRadius = radius;
            redetermineStructure();
        

    public:
        glm::vec4 CenterPosition;
    protected:
        float mass(void);
        void redetermineStructure(void); //used to recalculate the dimensions and attributes of the primitive after a new value such as radius or position has been set.
    protected:
        float mRadius, mVolume, mDensity;
        glm::vec4 mLastPosition;
        int mHP;
    ;

【问题讨论】:

【参考方案1】:

除非您已经知道自己需要什么(前期设计/原型制作),否则很难给出具体答案。

如果你边做边学,那么我建议一个好的方法是编写一些简单的实现来利用你的形状类:

两个粒子之间的一维碰撞 粒子与平面之间的一维碰撞 钟摆 1 个形状和 1 个平面之间的 2D 碰撞(边界检查) 2 个形状/多个形状之间的 2D 碰撞(边界检查、动量传递) 与上述的 3D 碰撞

...这应该会很快公开你的 shape 类将需要的各种成员函数和内部存储。

【讨论】:

【参考方案2】:

我认为你在一节课上做得太多了。模块化对于处理复杂的系统非常有帮助。例如,我使用过的所有物理引擎(bullet、ode 和box2d)都有单独的物理物体和碰撞几何对象。

body 对象包含它的位置、方向、速度和质量信息。质量通常也是一个单独的对象,用于管理质量和转动惯量。然后身体用于确定系统中的力的加速度并及时整合系统。几何对象然后包含对象的形状作为网格或一些其他描述。它用于确定接触点。

如果您要绘制这些对象,我也会使用一个单独的模块来执行此操作。您可以将所有绘图信息和代码放在形状对象中,但事物的物理方面不需要了解对象纹理或照明信息。此外,您可能希望以不同于其物理表示的方式绘制对象,这样会更容易做到这一点。

您想要这种模块化的其他一些示例是

可以与其他物理对象碰撞但不受它们影响的静态对象,那么您可以使用没有相应身体对象的形状对象 如果您想更改某物的形状,只需切换它的几何成员就比尝试将其信息复制到另一个对象要容易得多。 您最终可能会想要绘制根本不是物理的东西,因此有一个单独的绘图模块会有所帮助 如果您决定在某个时候切换渲染系统或使用第 3 方物理引擎,那么如果您的所有代码都耦合在一个类中,那么这将比尽可能模块化的情况困难得多。李>

【讨论】:

以上是关于为在 OpenGL 中使用基本物理和渲染寻找一个好的形状类设计的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 学习 -- 渲染模式和GLSL

如何在 OpenGL 中使用立方体贴图数组来渲染带有阴影贴图的多个点光源?

OpenGL1.0 线段

OpenGL 加载和渲染 png 到屏幕

使用 OpenGL 函数的非常基本的体积渲染(用于教学目的)[关闭]

基于OpenGL编写一个简易的2D渲染框架01——创建窗口