# 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.