Ищем хороший дизайн класса формы для использования элементарной физики и рендеринга в OpenGL

На данный момент я немного изучаю OpenGL и надеюсь узнать как можно больше. Прямо сейчас я пишу класс формы, который, надеюсь, смогу использовать в других проектах, которые я решу взять на себя. Однако я пришел к выводу, что есть определенные элементы, которые мне необходимо принять во внимание. Одним из них является набор массы, объема и плотности - в большей степени в отношении того, как они будут применяться к самому геометрическому примитиву.

Любые выровненные по оси сферы или ограничивающие прямоугольники, скорее всего, будут производными от этого класса, а также примитивы, которые фактически будут отображаться на экране — как в 2D, так и в 3D. Я надеялся узнать, может ли кто-нибудь дать мне несколько советов о том, как написать хороший класс Shape без необходимости «давать ответ». Мне нужно какое-то направление.

Два основных ресурса, которые у меня есть, это Никол Болас (думаю, именно так пишется его имя) >Изучение современного графического программирования и 3D-математика Букварь для разработки графики и игр. Что касается основ и продвинутых концепций с точки зрения рендеринга и тому подобного, этого должно быть достаточно.

На данный момент я ищу что-то вроде руководства с точки зрения того, как я могу создать этот класс. Последнее, что я хочу сделать сейчас, это просто следовать руководствам, которые включают в себя рисование треугольников на экране из статических значений, потому что я просто один из тех людей, которые не слишком хорошо учатся таким образом; Я учусь по ходу дела, применяя свои собственные методы и одновременно полагаясь на другие источники информации.

Пока что это то, что у меня есть (ПРИМЕЧАНИЕ — ни один из этих методов еще не реализован, кроме 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;
    };

person zeboidlund    schedule 14.07.2012    source источник


Ответы (2)


Если вы уже не знаете, что вам понадобится (предварительный дизайн/прототипирование), вам будет сложно дать конкретный ответ.

Если вы учитесь на практике, я бы посоветовал написать несколько простых реализаций, которые будут использовать ваш класс формы:

  • Одномерное столкновение двух частиц
  • Одномерное столкновение между частицей и плоскостью
  • Маятники
  • 2D-столкновения между 1 формой и 1 плоскостью (проверка границ)
  • 2D-столкновения между двумя фигурами / несколькими фигурами (проверка границ, передача импульса)
  • 3D-столкновения с вышеперечисленным

... это должно довольно быстро раскрыть виды функций-членов и внутреннюю память, которые потребуются вашему классу формы.

person Jon Cage    schedule 14.07.2012

Я думаю, вы пытаетесь сделать слишком много в одном классе. Модульность очень полезна при работе со сложными системами. Например, все физические движки, которые я использовал (bullet, ode и box2d) имеют отдельные объекты для физических тел и для геометрии столкновения.

Объект body содержит информацию о его положении, ориентации, скорости и массе. Масса также часто является отдельным объектом для управления массой вместе с моментом инерции. Затем тело используется для определения ускорения от сил в системе и интегрирования системы вперед во времени. Затем объект геометрии содержит форму объекта либо в виде сетки, либо в виде какого-либо другого описания. Он используется для определения точек контакта.

Если вы собираетесь рисовать эти объекты, я бы также использовал для этого отдельный модуль. Вы можете поместить всю информацию о рисовании и код в объект формы, но физике не нужно знать о текстуре объекта или информации об освещении. Также вы можете захотеть нарисовать объект иначе, чем его физическое представление, и это облегчит вам задачу.

Некоторые другие примеры того, почему вам нужна эта модульность:

  • Статический объект, который может сталкиваться с другими физическими объектами, но не зависит от них, тогда вы можете использовать объект формы без соответствующего объекта тела.
  • Если вы хотите изменить форму чего-либо, гораздо проще просто отключить его элемент геометрии, чем пытаться скопировать его информацию в другой объект.
  • Скорее всего, в конечном итоге вы захотите рисовать вещи, которые вообще не являются физическими, поэтому вам будет полезен отдельный модуль для рисования.
  • Если в какой-то момент вы решите, что хотите сменить систему рендеринга или использовать сторонний физический движок, то, если весь ваш код будет объединен в один класс, это будет намного сложнее, чем если бы все было настолько модульным, насколько это возможно.
person David Brown    schedule 14.07.2012