1

目前,我一直在研究一些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;
    };
4

2 回答 2

1

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

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

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

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

于 2012-07-14T09:41:20.853 回答
0

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

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

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

为什么你想要这种模块化的其他一些例子是

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