Полноценный 3D игровой движок на Python с OpenGL
Project description
AETHER ENGINE
============
Полноценный 3D игровой движок на Python с OpenGL 4.6
Автор: entiti937 | Версия: 1.0.2 | Лицензия: MIT
PyPI: https://pypi.org/project/aether-engine/
УСТАНОВКА
--------
Базовая:
pip install aether-engine
С аудио:
pip install aether-engine[audio]
С физикой:
pip install aether-engine[physics]
Полная:
pip install aether-engine[full]
БЫСТРЫЙ СТАРТ
-------------
Создайте файл main.py:
from aether.core.engine import Engine
from aether.scene.scene import Scene
from aether.scene.entity import Entity
from aether.scene.component import Transform, MeshRenderer
from aether.graphics.mesh_factory import MeshFactory
from aether.graphics.material import Material
from aether.graphics.camera import Camera
engine = Engine(1280, 720, "Моя игра")
scene = Scene("MainScene")
camera = Camera(position=(0, 2, 8))
scene.set_main_camera(camera)
cube = Entity("Player")
cube.add_component(Transform(position=(0, 1, 0)))
cube.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=Material()))
scene.spawn(cube)
engine.load_scene(scene)
engine.run()
Запустите:
python main.py
Управление: WASD - движение, мышь - поворот, ESC - выход.
СОЗДАНИЕ ОКНА И СЦЕНЫ
---------------------
Настройка движка:
from aether.core.engine import Engine
from aether.core.config import EngineConfig
config = EngineConfig()
config.app_name = "Моя RPG"
config.graphics.width = 1920
config.graphics.height = 1080
engine = Engine(config=config)
# Или просто
engine = Engine(1280, 720, "Моя игра")
Работа со сценами:
from aether.scene.scene import Scene
from aether.scene.scene_manager import SceneManager
menu = Scene("Menu")
game = Scene("Game")
manager = SceneManager()
manager.register_scene(menu)
manager.register_scene(game)
manager.load_scene("Game")
manager.transition_to("Menu", transition_time=1.0)
ENTITY И КОМПОНЕНТЫ
-------------------
Создание объекта:
from aether.scene.entity import Entity
from aether.scene.component import Transform, MeshRenderer, RigidbodyComponent
player = Entity("Player", tag="player")
player.add_component(Transform(position=(0, 2, 0), rotation=(0, 45, 0), scale=(1, 1, 1)))
player.add_component(MeshRenderer(mesh=MeshFactory.create_cube(), material=Material()))
player.add_component(RigidbodyComponent(mass=75.0, use_gravity=True))
scene.spawn(player)
Доступ к компонентам:
transform = player.get_component("Transform")
transform.translate(0, 0, 1)
transform.rotate(0, 10, 0)
mesh = player.get_component("MeshRenderer")
mesh.visible = False
Свой компонент:
from aether.scene.component import Component
class HealthComponent(Component):
def __init__(self, max_hp=100):
super().__init__()
self.max_hp = max_hp
self.hp = max_hp
def update(self, dt):
if self.hp <= 0:
print(f"{self.entity.name} died!")
def take_damage(self, amount):
self.hp -= amount
player.add_component(HealthComponent(100))
КАМЕРА
------
from aether.graphics.camera import Camera
camera = Camera(position=(0, 5, 15), yaw=-90, pitch=-20, fov=60)
scene.set_main_camera(camera)
camera.move_forward(dt)
camera.move_left(dt)
camera.rotate(dx, dy)
ОСВЕЩЕНИЕ
---------
from aether.graphics.light import DirectionalLight, PointLight, SpotLight
sun = DirectionalLight(direction=(0.5, -1, 0.3), color=(1.0, 0.95, 0.8), intensity=1.5)
lamp = PointLight(position=(0, 3, 0), color=(1.0, 0.8, 0.6), intensity=2.0, range=15.0)
flashlight = SpotLight(position=(0, 2, 0), direction=(0, 0, -1), intensity=3.0)
МАТЕРИАЛЫ И ТЕКСТУРЫ
--------------------
from aether.graphics.material import Material
from aether.graphics.texture import Texture
mat = Material("Metal")
mat.albedo = (0.8, 0.2, 0.2)
mat.metallic = 1.0
mat.roughness = 0.3
mat.albedo_map = Texture("textures/rust.png")
mat.normal_map = Texture("textures/rust_normal.png")
ФИЗИКА
------
Встроенная (AABB):
from aether.physics.collider import BoxCollider, SphereCollider
from aether.scene.component import RigidbodyComponent
body = RigidbodyComponent(mass=10.0, use_gravity=True)
entity.add_component(body)
entity.add_component(BoxCollider(size=(1, 1, 1)))
body.add_force((0, 100, 0))
body.add_impulse((0, 0, 50))
Raycast:
from aether.physics.raycast import Ray, raycast
ray = Ray(origin=(0, 10, 0), direction=(0, -1, 0))
hit = physics_world.raycast(ray.origin, ray.direction)
if hit.hit:
print(f"Попадание в {hit.entity.name}")
PyBullet (опционально):
from aether.physics.bullet_backend import BulletPhysicsBackend
bullet = BulletPhysicsBackend()
bullet.initialize(gravity=(0, -9.81, 0))
body_id = bullet.create_rigid_body("my_entity", mass=1.0, shape_type="box", dimensions=(1,1,1), position=(0,5,0))
bullet.step(dt)
СИСТЕМА ЧАСТИЦ
--------------
from aether.graphics.particle_system import ParticleEmitter
fire = ParticleEmitter(max_particles=1000)
fire.position = (0, 1, 0)
fire.emission_rate = 200
fire.start_color = (1.0, 0.5, 0.0, 1.0)
fire.end_color = (1.0, 0.0, 0.0, 0.0)
fire.velocity = (0, 3, 0)
fire.update(dt)
fire.render(view, projection)
ТЕРРАЙН
-------
from aether.graphics.terrain import Terrain
terrain = Terrain(width=512, depth=512, max_height=100)
terrain.generate_height_map(seed=42, octaves=6)
terrain.generate_chunks()
height = terrain.get_height(world_x, world_z)
terrain.render(view, projection, camera_position)
ВОДА
----
from aether.graphics.water import WaterBody
water = WaterBody(size=100, resolution=256, position=(0, 0, 0))
water.wave_speed = 1.5
water.water_color = (0.0, 0.3, 0.6)
water.update(dt)
water.render(view, projection, camera_position)
НЕБО И АТМОСФЕРА
----------------
from aether.graphics.sky_atmosphere import SkyDome
sky = SkyDome(radius=500)
sky.set_time_of_day(12.0) # Полдень
sky.render(view, projection)
ОКРУЖЕНИЕ
---------
from aether.environment.environment_system import EnvironmentSystem, Weather, Season
env = EnvironmentSystem()
env.set_weather(Weather.RAIN)
env.set_time(18, 30, 0)
env.set_season(Season.WINTER)
env.update(dt)
AI И НАВИГАЦИЯ
--------------
Деревья поведения:
from aether.ai.behavior_tree import BehaviorTree, Sequence, Selector, IsEnemyNearby, AttackTarget
bt = BehaviorTree()
root = Selector("Root")
attack = Sequence("Attack")
attack.add_child(IsEnemyNearby(radius=5.0))
attack.add_child(AttackTarget(damage=10.0))
root.add_child(attack)
bt.set_root(root)
bt.set_context("entity", enemy)
bt.set_context("target", player)
bt.tick()
NavMesh:
from aether.ai.navmesh import NavMeshBuilder
navmesh = NavMeshBuilder.build_from_grid(origin=(0,0,0), size_x=100, size_z=100, cell_size=1.0)
path = navmesh.find_path(start_pos, end_pos)
smoothed = navmesh.smooth_path(path)
АУДИО
-----
from aether.audio.audio_manager import AudioManager
audio = AudioManager()
audio.load_sound("explosion", "sounds/explosion.wav")
audio.play_sound("explosion", volume=0.8)
audio.play_music("music/background.mp3", loop=True)
audio.set_master_volume(0.7)
UI
--
from aether.ui.canvas import Canvas
from aether.ui.button import Button, Panel, Label
canvas = Canvas(1920, 1080)
def on_click():
print("Нажали!")
btn = Button("Начать игру", x=100, y=100, width=200, height=50, callback=on_click)
panel = Panel(x=50, y=50, width=400, height=300)
panel.title = "Инвентарь"
canvas.add(panel)
canvas.add(btn)
canvas.update(dt, mouse_x, mouse_y, mouse_pressed, mouse_just_pressed)
canvas.render()
СЕТЬ
----
Сервер:
from aether.network.network_manager import NetworkServer
server = NetworkServer(max_clients=32)
server.start(host="0.0.0.0", port=7777)
Клиент:
from aether.network.network_manager import NetworkClient
client = NetworkClient("Player1")
client.connect("127.0.0.1", 7777)
client.send(NetworkMessage("chat", {"text": "Привет!"}))
СОХРАНЕНИЯ
----------
from aether.core.save_system import SaveSystem, SaveData
save_system = SaveSystem()
data = SaveData("save_01")
data.set_custom("health", 85)
save_system.save(slot_id=0, save_data=data)
loaded = save_system.load(slot_id=0)
ДОСТИЖЕНИЯ
----------
from aether.core.achievement_system import AchievementSystem
achievements = AchievementSystem()
achievements.register_achievement("first_kill", "Первая кровь", points=10)
achievements.increment_stat("kills")
КОНСОЛЬ РАЗРАБОТЧИКА
--------------------
from aether.core.console import Console
console = Console()
console.register_command("spawn", spawn_enemy)
console.register_variable("g_difficulty", 2, "Сложность", 1, 5)
console.execute("spawn 5")
РЕДАКТОР (ImGui)
----------------
from aether.editor.imgui_integration import ImGuiManager, EditorLayout, HierarchyPanel, InspectorPanel
imgui = ImGuiManager()
imgui.initialize(window, 1920, 1080)
editor = EditorLayout()
editor.add_panel(HierarchyPanel())
editor.add_panel(InspectorPanel())
# В игровом цикле:
imgui.begin_frame()
editor.render(scene, console, profiler)
imgui.end_frame()
STEAM API
---------
from aether.platform.steam_api import SteamAPI
steam = SteamAPI()
steam.initialize(app_id=1234567)
steam.set_achievement("ACH_WIN_ONE_GAME")
steam.cloud_save("save.sav", data)
СТРУКТУРА ДВИЖКА
----------------
aether/
core/ - Ядро (Engine, Config, Input, Time, Console, SaveSystem)
graphics/ - Графика (Renderer, Shader, Mesh, Camera, Light, Water, Sky, Terrain, Particles)
scene/ - Сцена (Entity, Component, Scene, SceneGraph, SceneManager)
physics/ - Физика (PhysicsWorld, Collider, Rigidbody, Raycast, BulletBackend)
ai/ - AI (NavMesh, BehaviorTree)
network/ - Сеть (Client, Server)
audio/ - Аудио (AudioManager, Sound, Music)
ui/ - UI (Canvas, Button, Panel, Label, Font)
editor/ - Редактор (ImGui, Gizmo, DebugDraw)
environment/ - Окружение (TimeOfDay, Weather, Seasons)
resources/ - Ресурсы (ResourceManager, AssetDatabase, OBJ Loader, Texture Loader)
platform/ - Платформа (SteamAPI)
animation/ - Анимация (Skeleton, AnimationClip, Animator)
assets/ - Ассеты (AssetPipeline)
utils/ - Утилиты (Math, Logger, Profiler, ObjectPool)
ЗАВИСИМОСТИ
-----------
Базовая установка (обязательно):
numpy>=1.24, glfw>=2.6, PyOpenGL>=3.1.7, Pillow>=10.0
Аудио (опционально):
pygame>=2.5 (Python 3.10-3.12) или pygame-ce (Python 3.13+)
Физика (опционально):
PyBullet>=3.2.5 (требует Visual Studio Build Tools)
pymunk>=6.0 (альтернатива, не требует компиляции)
Полная установка:
Все выше + freetype-py, imgui, noise, pyyaml, imageio
Примечание по версиям Python:
Python 3.10-3.12: все пакеты доступны
Python 3.13+: используйте pygame-ce вместо pygame
Python 3.14+: PyBullet может не собраться, используйте pymunk
СИСТЕМНЫЕ ТРЕБОВАНИЯ
--------------------
Python 3.10+
OpenGL 4.6
Windows 10+ / Linux / macOS
Видеокарта с поддержкой OpenGL 4.6
4 GB RAM минимум
ЛИЦЕНЗИЯ
--------
MIT License. Используйте свободно в любых проектах.
Автор: entiti937
Версия: 1.0.3 - Исправления установки библеотек на разные версии пайтон
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
aether_engine-1.0.3.tar.gz
(105.2 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aether_engine-1.0.3.tar.gz.
File metadata
- Download URL: aether_engine-1.0.3.tar.gz
- Upload date:
- Size: 105.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d8c511b9e79bde2de4c5da4c0ab081268037e6808c312a7b60d83b8220fadc6d
|
|
| MD5 |
9a13b68ced9360097d55a84d4f9f9a55
|
|
| BLAKE2b-256 |
16eab0f6237d7ad133599f874163a98eec15bd068643d0b3161bdc84cf88dc6e
|
File details
Details for the file aether_engine-1.0.3-py3-none-any.whl.
File metadata
- Download URL: aether_engine-1.0.3-py3-none-any.whl
- Upload date:
- Size: 92.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f664fb8639fc5ca91fc9c79a279d1762cd2a71eb8e3c635a2529f41e61289014
|
|
| MD5 |
8e33e596cea41d33cb3233fdd19b84e7
|
|
| BLAKE2b-256 |
18682b9957459998b11cc4e1412f02d4147a48a3fabbc2d13aa6e995b445b693
|