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

时间:2012-07-14 07:26:02

标签: c++ opengl rendering physics shape

目前,我一直在研究一些OpenGL,我希望尽可能多地学习。现在我正在写一个形状类,我希望可以使用它来源于我选择进行的其他项目。然而,我已经认识到,我需要考虑某些因素。其中之一是质量,体积和密度的集合 - 更多关于它们如何应用于几何图元本身的关系。

任何轴向对齐的球体或边界框都可能来自这个类以及基元,它们实际上将呈现在屏幕上 - 无论是2D还是3D。我希望看看是否有人可以给我一些关于如何编写一个好的Shape类而没有必要“给出答案”的指示。我需要某种方向。

我所拥有的两个主要资源是Nicol Bolas(我认为这是他的名字拼写的方式)Learning Modern Graphics Programming3D 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;
    };

2 个答案:

答案 0 :(得分:1)

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

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

  • 两个粒子之间的1D碰撞
  • 粒子与平面之间的1D碰撞
  • 钟摆
  • 1个形状和1个平面之间的2D碰撞(边界检查)
  • 2个形状/多个形状之间的2D碰撞(边界检查,动量转移)
  • 与上述
  • 的3D碰撞

...应该相当快地公开你的形状类所需的各种成员函数和内部存储。

答案 1 :(得分:0)

我认为你试图在一堂课中做太多。模块化在处理复杂系统时非常有用。例如,我使用过的所有物理引擎(bulletodebox2d)都有物理实体和碰撞几何体的单独对象。

身体对象包含其位置,方向,速度和质量信息。质量通常也是一个单独的对象来管理质量和惯性矩。然后,主体用于确定系统中的力的加速度,并使系统及时向前积分。然后,几何对象将对象的形状包含为网格或其他描述。它用于确定接触点。

如果您要绘制这些对象,我也会使用单独的模块来完成这些操作。您可以将所有绘图信息和代码放在形状对象中,但事物的物理方面不需要知道对象纹理或光照信息。此外,您可能希望以不同于物理表示的方式绘制对象,这样可以更容易地进行操作。

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

  • 可以与其他物理对象发生碰撞但不受其影响的静态对象,则可以使用没有相应正文对象的形状对象
  • 如果你想改变某些东西的形状,那么切换它的几何构件比尝试将其信息复制到另一个对象要容易得多。
  • 您可能最终想要绘制非物质的东西,因此有一个单独的绘图模块会对此有所帮助
  • 如果您决定在某些时候想要切换渲染系统或使用第三方物理引擎,那么如果所有代码都耦合在一个类中,那么将比模块尽可能模块化更难。