{{notification.text}}

MirGames

08.12.14 22:25
0

Доброго времени суток!
Подскажите как отрисовать объекты, и в дальнейшем управлять ими. Сейчас есть функция Render(), в ней происходит вся отрисовка и это не очень удобно. Как ей передать объект или класс на отрисовку?

Вот пример, что хочу получить:
TMesh cube = CreateCube(); //Создание объекта и отправка на отрисовку.
MeshPosition(cube, Vec3(x,y,z));

Все должно происходить вне функции Render()

Заранее прощу глубочайшие извинения, если не четко выразил свое мысль.

#1
MirGames Dev
08.12.14 23:29
1

Надеюсь, что я понял вопрос правильно.

Обычно делают, условно говоря, независимые модель и отрисовку. Т.е. модель - это набор объектов в системе, которые каким-либо образом взаимодействуют друг с другом, имеют позицию в пространстве, и т.п. И отдельно отрисовка, которая их, собственно, и рендерит.

Чаще всего создаются классы сущностей, в каждом классе есть методы Render и Update. Я бы на самом деле сделал пару интерфейсов IRenderable и IUpdatable, но это уже на вкус и цвет.

Соответственно, есть глобальные методы Render и Update, которые проходят по сущностям и отрисовывают их. При этом используются некоторые оптимизации, в зависимости от системы. Например, не вызывают Render для тех объектов, которые не попадают в область видимости. Сущности могут лежать как и в простом списке, так и в виде дерева (binary tree, quad-tree). В виде дерева проще определять возможные столкновения объектов, ну и оптимизировать ренденинг.

Ну т.е. в простом варианте в псевдо-коде что-то вроде

TMesh cube = ObjectsFactory.createCube(); // создаём куб
cube.setPosition(new Vec3(x, y, z));

Scene.addEntity(cube); // добавляем куб на сцену
...
class Scene {
    TMesh[] entities;
    ...
    addEntity(TMesh mesh) {
        this.entities.add(mesh);
    }
    ...
    render() {
        for (int i = 0; i < this.entities.length; i++) {
            this.entities[i].render();
        }
    }
    ...
    update(double delta) {
        for (int i = 0; i < this.entities.length; i++) {
            this.entities[i].update(delta);
        }
    }
}

class TMesh {
    void setPosition(Vec3 position);
    ...
    void render() {
        // отрисовка объекта
    }

    void update(double delta) {
        // обновление объекта с учетом delta - количеством секунд, прошедших со времени последнего обновления
    }
}

Можно даже попытаться render и update в разных потоках производить. Только аккуратно :-)

Как альтернативный вариант реализации, можно модель держать совсем отдельно - т.е. никаких методов Render. И отдельно создавать классы, которые занимаются только рендерингом. Это в некоторых ситуация позволяет отвязаться от используемой графической подсистемы или движка.

#2
MirGames Dev
08.12.14 23:34
0

Правда, в случае с OpenGL здесь есть ещё некоторые хитрости с сохранением состояния в render, ну т.е. флаг, выставленный одним объектом, может ненароком повлиять на другой. В этом случае часто вводят абстракцию некой StateMachine, которая следит за состоянием и не дергает без нужды glEnable, glDisable, etc..

#3
09.12.14 00:07
0

Большое спасибо MeF Dei Corvi, за такой открытый ответ. Пойду экспериментировать :)

#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}