Примечание . Библиотека активно не поддерживается и не создается. Если вы хотите внести свой вклад, откройте проблему.
Simulate — это библиотека для простого создания и совместного использования сред моделирования для интеллектуальных агентов (например, обучение с подкреплением) или генерации синтетических данных.
Установите Simulate (предпочтительно в виртуальной среде) с помощью простой pip install simulate
Примечание . vtk
не создан для Apple Silicon с Python 3.8. В этом случае установите версию >3.9.
Создайте виртуальную среду, а затем локально установите инструменты стиля/качества кода, а также базу кода.
pip install --upgrade simulate
Прежде чем объединить PR, исправьте стиль (мы используем isort
+ black
)
make style
API Simulate вдохновлен API великого Кубрика. Пользователь создает Scene
и добавляет в нее Assets
(объекты, камеры, источники света и т. д.).
После создания сцены вы можете сохранить ее и поделиться ею в виде файла. Это файл GIFT, также известный как файл JSON со связанными ресурсами.
Вы также можете визуализировать сцену или выполнить симуляцию, используя один из серверных движков рендеринга/симуляции (на данный момент Unity, Blender и Godot).
Формат сохранения/передачи не зависит от движка и использует графический отраслевой стандарт.
Давайте вместе проведем быстрое исследование.
import simulate as sm
scene = sm.Scene()
API Python находится в src/simulate. Он позволяет создавать и загружать сцены, а также отправлять команды на серверную часть.
Мы предоставляем несколько бэкэндов для рендеринга и/или запуска сцены. Серверная часть по умолчанию не требует специальной установки и основана на pyvista. Он позволяет быстро визуализировать/исследовать сцену, но не поддерживает физическую симуляцию. Чтобы разрешить физическое моделирование, можно, например, использовать бэкэнд Unity, установив engine="unity"
(а вскоре также и бэкэнд Godot и Blender Engines). Сборка Unity будет автоматически загружена (если это еще не сделано) и запущена для запуска моделирования. Альтернативно, можно скачать и использовать сам редактор Unity, который затем необходимо открыть с помощью Unity версии 2021.3.2f1.
Загрузка сцены из локального файла или хаба выполняется с помощью Scene.create_from()
, сохранение локально или отправка в хаб с помощью scene.save()
или scene.push_to_hub()
:
from simulate import Scene
scene = Scene.create_from('tests/test_assets/fixtures/Box.gltf') # either local (priority) or on the Hub with full path to file
scene = Scene.create_from('simulate-tests/Box/glTF/Box.gltf', is_local=False) # Set priority to the Hub file
scene.save('local_dir/file.gltf') # Save to a local file
scene.push_to_hub('simulate-tests/Debug/glTF/Box.gltf') # Save to the Hub - use a token if necessary
scene.show()
Базовый пример создания сцены с плоскостью и сферой над ней:
import simulate as sm
scene = sm.Scene()
scene += sm.Plane() + sm.Sphere(position=[0, 1, 0], radius=0.2)
>>> scene
>>> Scene(dimensionality=3, engine='PyVistaEngine')
>>> └── plane_01 (Plane - Mesh: 121 points, 100 cells)
>>> └── sphere_02 (Sphere - Mesh: 842 points, 870 cells)
scene.show()
Объект (как и сцена) — это просто узел в дереве, снабженный дополнительной сеткой (созданной/хранимой/редактируемой как объекты pyvista.PolyData
или pyvista.MultiBlock
) и материалом и/или светом, камерой, агентами. специальные объекты.
В настоящее время предоставляются следующие помощники по созданию объектов:
Object3D
любой объект с сеткой и/или материаломPlane
Sphere
Capsule
Cylinder
Box
Cone
Line
MultipleLines
Tube
Polygon
Ring
Text3D
Triangle
Rectangle
Circle
StructuredGrid
Многие из этих объектов можно визуализировать, выполнив следующий пример:
python examples/basic/objects.py
Добавление/удаление объектов:
+
) (или, альтернативно, метода .add(object)
) добавит объект как дочерний объект предыдущего объекта.-
) или команды .remove(object)
..clear()
.scene.sphere += sphere_child
.Доступ к объектам:
name
при создании или автоматически сгенерированные из имени класса + счетчика создания)..get_node(name)
.tree_*
доступны на любом узле для быстрого перемещения по дереву узлов или составления списка частей.Вот пара примеров манипуляций:
# Add two copy of the sphere to the scene as children of the root node (using list will add all objects on the same level)
# Using `.copy()` will create a copy of an object (the copy doesn't have any parent or children)
scene += [scene.plane_01.sphere_02.copy(), scene.plane_01.sphere_02.copy()]
>>> scene
>>> Scene(dimensionality=3, engine='pyvista')
>>> ├── plane_01 (Plane - Mesh: 121 points, 100 cells)
>>> │ └── sphere_02 (Sphere - Mesh: 842 points, 870 cells)
>>> ├── sphere_03 (Sphere - Mesh: 842 points, 870 cells)
>>> └── sphere_04 (Sphere - Mesh: 842 points, 870 cells)
# Remove the last added sphere
>>> scene.remove(scene.sphere_04)
>>> Scene(dimensionality=3, engine='pyvista')
>>> ├── plane_01 (Plane - Mesh: 121 points, 100 cells)
>>> │ └── sphere_02 (Sphere - Mesh: 842 points, 870 cells)
>>> └── sphere_03 (Sphere - Mesh: 842 points, 870 cells)
Объекты можно легко переводить, вращать, масштабировать.
Вот несколько примеров:
# Let's translate our floor (with the first sphere, it's child)
scene.plane_01.translate_x(1)
# Let's scale the second sphere uniformly
scene.sphere_03.scale(0.1)
# Inspect the current position and scaling values
print(scene.plane_01.position)
>>> array([1., 0., 0.])
print(scene.sphere_03.scaling)
>>> array([0.1, 0.1, 0.1])
# We can also translate from a vector and rotate from a quaternion or along the various axis
Редактирование объектов:
Механизм визуализации по умолчанию поставляется с серверной частью vtk pyvista
.
Запустить механизм визуализации можно просто с помощью .show()
.
scene.show()
Вы можете найти мосты к другим механизмам рендеринга/симуляции в каталоге integrations
.
Если вы используете GCP, не забудьте не устанавливать pyvistaqt
, а если вы это сделали, удалите его в своей среде, поскольку QT не работает с GCP.
@misc { simulate ,
author = { Thomas Wolf, Edward Beeching, Carl Cochet, Dylan Ebert, Alicia Machado, Nathan Lambert, Clément Romac } ,
title = { Simulate } ,
year = { 2022 } ,
publisher = { GitHub } ,
journal = { GitHub repository } ,
howpublished = { url{https://github.com/huggingface/simulate} }
}