1

現在、私はいくつかの OpenGL を研究しており、可能な限り多くのことを学びたいと考えています。現在、私が着手することを選択した他のプロジェクトで使用および派生できることを願って、シェイプ クラスを作成しています。しかし、考慮しなければならない特定の要素があることに気づきました。これらの 1 つは、質量、体積、および密度のコレクションです。これは、ジオメトリ プリミティブ自体にどのように適用されるかという点で特に重要です。

2D と 3D の両方で実際に画面にレンダリングされるプリミティブと同様に、軸方向に整列した球または境界ボックスはこのクラスから派生する可能性があります。必要な「答えを与える」ことなく、適切な Shape クラスを作成する方法について誰かが私にいくつかの指針を与えることができるかどうかを知りたいと思っていました。何らかの方向性が必要です。

私が手元に持っている 2 つの主なリソースは、Nicol Bolas の (彼の名前の綴りはそのようになっていると思います) Learning Modern Graphics Programming3D Math Primer for Graphics and Game Developmentの本です。レンダリングなどの基本と高度な概念に関しては、これらで十分です。

現時点で探しているのは、このクラスを構築する方法に関するガイドのようなものです。今のところ最後にやりたいことは、静的な値から画面上に三角形を描くことを含むチュートリアルに従うことです。私は、自分の方法を実行すると同時に、他の情報源に頼ることによって、進むにつれて学びます。

これまでのところ、これは私が持っているものです(-ctorとinlinesを除いて、これらのメソッドはまだ実装されていません):

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

必要なもの(事前の設計/プロトタイピング)をすでに理解していない限り、具体的な答えを出すのは難しいでしょう。

あなたがそれを行うことによって学ぶならば、私は先に進むための良い方法はあなたの形のクラスを利用するであろういくつかの簡単な実装を書くことであろうと提案するでしょう:

  • 2つの粒子間の1D衝突
  • 粒子と平面の間の1D衝突
  • 振り子
  • 1つの形状と1つの平面の間の2D衝突(境界チェック)
  • 2つの形状/複数の形状間の2D衝突(境界チェック、運動量伝達)
  • 上記との3D衝突

...これにより、シェイプクラスが必要とする種類のメンバー関数と内部ストレージがかなり迅速に公開されます。

于 2012-07-14T09:41:20.853 に答える
0

あなたは一つのクラスで多くのことをしようとしていると思います。モジュール性は、複雑なシステムを扱う際に非常に役立ちます。たとえば、私が使用したすべての物理エンジン ( bulletode、およびbox2d ) は、物理的なボディと衝突ジオメトリに対して個別のオブジェクトを持っています。

ボディ オブジェクトには、その位置、向き、速度、および質量の情報が含まれています。質量は、質量を慣性モーメントと一緒に管理するための別のオブジェクトであることがよくあります。次に、ボディは、システム内の力から加速度を決定し、システムを時間的に統合するために使用されます。ジオメトリ オブジェクトには、オブジェクトの形状がメッシュまたはその他の記述として含まれます。コンタクトポイントの決定に使用されます。

これらのオブジェクトを描画する場合は、別のモジュールを使用して描画することもできます。すべての描画情報とコードを形状オブジェクトに入れることもできますが、物理的な側面では、オブジェクトのテクスチャや照明情報について知る必要はありません。また、物理的な表現とは異なる方法でオブジェクトを描画することもできます。これにより、それが容易になります。

このモジュール性が必要な理由の他の例は次のとおりです。

  • 他の物理オブジェクトと衝突できるが影響を受けない静的オブジェクトの場合、対応するボディ オブジェクトのない形状オブジェクトを使用できます
  • 何かの形状を変更したい場合は、その情報を別のオブジェクトにコピーしようとするよりも、そのジオメトリ メンバーを切り替える方がはるかに簡単です。
  • まったく物理的ではないものを描きたくなる可能性が高いので、描画用に別のモジュールを用意すると便利です
  • ある時点でレンダリング システムを切り替えたり、サード パーティの物理エンジンを使用したりすることにした場合、すべてのコードが 1 つのクラスに結合されていると、可能な限りモジュール化されている場合よりもはるかに困難になります。
于 2012-07-14T17:09:44.723 に答える