Краткое описание того, как работать со сценой и 3D движком
Сцена служит для обработки взаимодействия между объектами
Объект на сцену добавляется функцией add_object
.
Она принимает в параметры экземпляр класса GameObject
и добавляет его на сцену.
Далее можно будет получить ссылку на этот объект через функцию get_object_by_id
по его id
или же через функцию get_object_by_name
по его имени.
Пример:
cat = GameObject("cat")
cat.set_component(Model(app, cat, "cat_model", "cat_texture"))
cat.transform.position = glm.vec3(0, -2, 0)
cat.transform.scale = glm.vec3(0.5, 0.5, 0.5)
self.add_object(cat)
Тут мы создаём экземпляр класса GameObject
, добавляем компонент Model
, задаём позицию и размер, и затем мы добавляем
его на сцену.
Работа со светом похожа на работу с объектами.
Для создания источника света используется функция add_light_source(light_source)
как параметр она принимает экземпляр
класса LightSource
.
Ссылку на экземпляр класса LightSource
на сцене можно получить через функцию get_light_by_id
, посылая на вход id
источника света.
Пример:
self.add_light_source(LightSource(glm.vec3(0, 8, 0), glm.vec3(0, 1, 0)))
Тут мы добавляем экземпляр класса LightSource
на сцену.
У экземпляра класса GameObject
есть словарь с компонентами (экземплярами класса Component
).
Объекты класса Component
хранят в себе описания для поведения экземпляра класса GameObject
.
Пример:
cat = GameObject("cat")
cat.set_component(Model(app, cat, "cat_model", "cat_texture"))
Тут мы создаём экземпляр класса GameObject
и добавляем к нему компонент Model
для того, что-бы привязать 3D модель
к экземпляру класса GameObject
.
Что-бы как-то изменять компоненты, можно воспользоваться функцией get_component
, она вернёт ссылку на компонент,
в котором уже можно будет совершать изменения.
Пример:
cat_rb = cat.get_component("RigidBody")
cat_rb.mass = 50
Тут мы получаем ссылку на компонент RigidBody, у экземпляра класса GameObject
, с именем cat, и изменяем его массу
У каждого созданного экземпляра класса GameObject
есть стандартный компонент Transform
. Компонент Transform
хранит в себе данные об положении, размере и вращении объекта.
Пример:
cat.transform.position = glm.vec3(0, 0, 0)
Тут мы изменяем позицию, экземпляра класса GameObject
, с именем cat
У каждого экземпляра класса GameObject
есть массив "детей". "Дети" - это другие экземпляры класса GameObject
.
"Дети" нужны для древовидной структуры сцены.
Пример:
cat_parent = GameObject("big cat")
cat_child = GameObject("small cat")
cat_parent.add_child(cat_child)
self.add_object(cat_parent)
Тут мы создаём два экземпляра класса GameObject
и добавляем один из них (cat_child
), как ребёнок для второго
(cat_parent
).
Получить ссылку на "ребёнка" можно через функции get_child_by_id
или get_child_by_name
, по id и имени соответственно.
Он не имеет какой-либо сложной структуры, он лишь хранить в себе настройки для источника света (цвет и положение).
Пример:
light = LightSource(glm.vec3(0, 8, 0), glm.vec3(0, 1, 0))
Первый аргумент - положение в пространстве. Второй - цвет света, в формате RGB (яркость цвета записывается в диапазоне от 0.0 до 1.0)
Для загрузки 3D моделей и текстур используется скрипт resource_loader.py
.
Для загрузки 3D модели используется функция load_3d_model
. На вход она принимает два аргумента, название модели и
путь до самой 3D модели. Движок может работать только с объектами с расширением .obj
.
Пример:
load_3d_model("cat_model", "models/cat.obj")
Тут мы загружаем модель cat.obj
под именем cat_model
Для загрузки текстур используется функция load_texture
. На вход она как и load_3d_model
принимает два аргумента,
название текстуры и путь до самой текстуры.
Пример:
load_texture("cat_texture", "textures/cat.jpg")
Тут мы загружаем текстуру cat.jpg
под именем cat_texture
Настройки (скорость перемещения и чувствительность мыши) изменяются в классе Player
, который находиться в скрипте
player.py
Если нужно изменить размер окна или выключить режим полного окна, это можно изменить в функции main
(скрипт main.py
)
Базовое управление камерой:
WASD - перемещение по горизонтали
SPACE - взлёт вверх
C - спуск вниз
Мышь - вращение камеры
Если будут какие-либо вопросы, можете писать мне в viber