109 lines
5.3 KiB
Markdown
109 lines
5.3 KiB
Markdown
|
# Die Havok-Engine ⚙️
|
|||
|
|
|||
|
## Inhalt
|
|||
|
|
|||
|
- [Die Havok-Engine ⚙️](#die-havok-engine-️)
|
|||
|
- [Inhalt](#inhalt)
|
|||
|
- [Was ist die Havok-Engine?](#was-ist-die-havok-engine)
|
|||
|
- [Integration in andere Engines](#integration-in-andere-engines)
|
|||
|
- ["Hello, World!" in der Havok-Engine](#hello-world-in-der-havok-engine)
|
|||
|
- [Beispielcode](#beispielcode)
|
|||
|
- [Erläuterung des Codes](#erläuterung-des-codes)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## Was ist die Havok-Engine?
|
|||
|
|
|||
|
Die **Havok-Engine** ist eine leistungsstarke und weit verbreitete **Physik-Middleware**, die in zahlreichen Videospielen zur Simulation realistischer physikalischer Interaktionen eingesetzt wird.
|
|||
|
Entwickelt von der irischen Firma Havok, die zu Microsoft gehört, ist sie keine allumfassende Game-Engine wie Unity oder Unreal, sondern spezialisiert sich auf die realistische Darstellung von Physik, Animationen und Kollisionen.
|
|||
|
|
|||
|
Im Kern ist Havok eine Sammlung von Software-Werkzeugen (SDK), die Entwickler in ihre eigenen Game-Engines oder Projekte integrieren können.
|
|||
|
Anstatt eine komplette Entwicklungsumgebung bereitzustellen, konzentriert sich Havok auf die folgenden Kernbereiche:
|
|||
|
|
|||
|
- **Havok Physics:** Das bekannteste Produkt. Es ermöglicht die Simulation von Starrkörperdynamik, Kollisionserkennung und -reaktion in Echtzeit.
|
|||
|
Wenn in einem Spiel Kisten realistisch umfallen, Gebäude einstürzen oder Ragdoll-Effekte bei Charakteren auftreten, steckt oft Havok Physics dahinter.
|
|||
|
- **Havok Animation Studio:** Ein Werkzeugset für fortschrittliche Charakteranimationen, das flüssige und prozedurale Bewegungen ermöglicht.
|
|||
|
- **Havok Cloth:** Wird für die realistische Simulation von Stoffen und Kleidung verwendet, wie z.B. wehende Umhänge oder Fahnen im Wind.
|
|||
|
- **Havok Destruction:** Dieses Modul wird verwendet, um dynamisch zerstörbare Umgebungen zu erstellen.
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
### Integration in andere Engines
|
|||
|
|
|||
|
Havok wird von vielen großen Spielestudios lizenziert und in deren eigene Engines integriert.
|
|||
|
Bekannte Spiele, die Havok nutzen, sind unter anderem *The Elder Scrolls V: Skyrim*, *Halo*, *Dark Souls* und *Assassin's Creed*.
|
|||
|
|
|||
|
Es kann als eigenständiges SDK in eine C++-basierte Engine integriert werden.
|
|||
|
Zudem existiert das **"Havok Physics for Unity"**-Paket, um die Physik-Engine direkt in Unity-Projekten zu nutzen.
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## "Hello, World!" in der Havok-Engine
|
|||
|
|
|||
|
Ein klassisches "Hello, World!" ist für eine Physik-Engine nicht repräsentativ. Ein passenderes Äquivalent ist die Erstellung einer minimalen physikalischen Simulation: **eine Kiste, die unter dem Einfluss der Schwerkraft auf eine unbewegliche Ebene fällt.**
|
|||
|
|
|||
|
Das folgende konzeptionelle Code-Beispiel in C++-ähnlichem Pseudocode verdeutlicht die grundlegenden Schritte.
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
### Beispielcode
|
|||
|
|
|||
|
```cpp
|
|||
|
// 1. Initialisierung der Havok-Engine
|
|||
|
Havok::initializeMemory();
|
|||
|
Havok::initializeBaseSystems();
|
|||
|
|
|||
|
// 2. Erstellen einer Physik-Welt mit Schwerkraft
|
|||
|
hkpWorld::Cinfo worldInfo;
|
|||
|
worldInfo.m_gravity = hkVector4(0.0f, -9.8f, 0.0f);
|
|||
|
hkpWorld* physicsWorld = new hkpWorld(worldInfo);
|
|||
|
|
|||
|
// 3. Erstellen eines statischen Bodens (unbewegliche Ebene)
|
|||
|
hkpBoxShape* groundShape = new hkpBoxShape(hkVector4(50.0f, 1.0f, 50.0f));
|
|||
|
hkpRigidBody::Cinfo groundInfo;
|
|||
|
groundInfo.m_shape = groundShape;
|
|||
|
groundInfo.m_motionType = hkpMotion::MOTION_FIXED; // Unbeweglich
|
|||
|
groundInfo.m_position.set(0.0f, 0.0f, 0.0f);
|
|||
|
hkpRigidBody* ground = new hkpRigidBody(groundInfo);
|
|||
|
physicsWorld->addEntity(ground);
|
|||
|
|
|||
|
// 4. Erstellen einer dynamischen Kiste (bewegliches Objekt)
|
|||
|
hkpBoxShape* boxShape = new hkpBoxShape(hkVector4(0.5f, 0.5f, 0.5f));
|
|||
|
hkpRigidBody::Cinfo boxInfo;
|
|||
|
boxInfo.m_shape = boxShape;
|
|||
|
boxInfo.m_mass = 10.0f; // Masse von 10 kg
|
|||
|
boxInfo.m_motionType = hkpMotion::MOTION_DYNAMIC; // Wird von Physik beeinflusst
|
|||
|
boxInfo.m_position.set(0.0f, 10.0f, 0.0f); // Startposition über dem Boden
|
|||
|
hkpInertiaTensorComputer::setShapeVolumeMassProperties(boxShape, boxInfo.m_mass, boxInfo);
|
|||
|
hkpRigidBody* box = new hkpRigidBody(boxInfo);
|
|||
|
physicsWorld->addEntity(box);
|
|||
|
|
|||
|
// 5. Die Simulations-Schleife (in der Praxis pro Frame)
|
|||
|
for (int i = 0; i < 300; ++i) {
|
|||
|
// Physik-Welt um einen Zeitschritt (1/60s) fortschreiten lassen
|
|||
|
physicsWorld->stepDeltaTime(1.0f / 60.0f);
|
|||
|
|
|||
|
// Position der Kiste abfragen und ausgeben/darstellen
|
|||
|
hkVector4 currentPosition = box->getPosition();
|
|||
|
printf("Position nach Schritt %d: (%.2f, %.2f, %.2f)\n", i, currentPosition(0), currentPosition(1), currentPosition(2));
|
|||
|
}
|
|||
|
|
|||
|
// 6. Aufräumen
|
|||
|
box->removeReference();
|
|||
|
ground->removeReference();
|
|||
|
physicsWorld->removeReference();
|
|||
|
Havok::quitBaseSystems();
|
|||
|
Havok::quitMemory();
|
|||
|
```
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
### Erläuterung des Codes
|
|||
|
|
|||
|
1. **Initialisierung:** Starten der internen Speichermanager und Basissysteme von Havok.
|
|||
|
2. **Physik-Welt:** Das `hkpWorld`-Objekt ist das Herzstück der Simulation. Es verwaltet alle Objekte und wendet Kräfte wie die Schwerkraft an.
|
|||
|
3. **Statischer Boden:** Ein unbeweglicher Körper (`MOTION_FIXED`), der als Kollisionsobjekt dient, damit die Kiste nicht ins Unendliche fällt.
|
|||
|
4. **Dynamische Kiste:** Das "Hello, World!"-Objekt. Es hat eine Masse, ist als `MOTION_DYNAMIC` definiert und wird somit von der Schwerkraft beeinflusst und reagiert auf Kollisionen.
|
|||
|
5. **Simulations-Schleife:** Der Aufruf von `physicsWorld->stepDeltaTime()` lässt die Zeit in der Simulation vergehen und aktualisiert die Positionen der dynamischen Objekte.
|
|||
|
6. **Aufräumen:** Der belegte Speicher wird nach der Simulation wieder freigegeben.
|