Game Engine Math

KWEngine, Teil 16: Objekte an Stellen anderer Objekte anheften

Damit ein GameObject (z.B. eine Spielfigur) ein anderes GameObject (z.B. ein Waffenmodell) z.B. in der Hand führen kann, müssen mehrere Bedingungen erfüllt sein:

  • Das Modell der Spielfigur muss animiert sein. Ist ein Modell animiert bzw. verfügt über Animationen, hat das Modell automatisch eine Reihe von Knochen, die sein Skelett beschreiben. Diese Knochen dienen als Punkte, an denen andere Objekte angehängt werden können.
  • Das Anhängen von Modellen funktioniert in allen Modi außer dem First-Person-Modus.

Der benötigte Code kann in der Prepare()-Methode der Welt-Klasse positioniert werden:

public override void Prepare()
{
    KWEngine.LoadMode("PlayerModel", "./modelverzeichnis/player.fbx");
    KWEngine.LoadModel("GunModel", @"./modelverzeichnis/gun.fbx");

    Player p = new Player();
    p.SetModel("PlayerModel");
    AddGameObject(p);

    Gun gun = new Gun();
    gun.SetModel("GunModel");
    AddGameObject(gun);
    
    // Jetzt muss das Waffenmodell 'g' an das Spielerobjekt 'p' 
    // angeheftet werden:
    p.AttachGameObjectToBone(gun, "Knochenname");
    
    // Soll die Waffe nach dem Anheften größer/kleiner erscheinen,
    // muss ihre Skalierung NACH dem Anheften erneut aktualisiert werden:
    HelperGameObjectAttachment.SetScaleForAttachment(gun, 1.0f);

    // Gleiches gilt für die Rotation (Orientierung):
    HelperGameObjectAttachment.SetRotationForAttachment(gun, 0f, 0f, 0f);
}

Um herauszufinden, welche Knochen ein 3D-Modell zur Verfügung stellt, können Sie z.B. folgenden Befehl verwenden:

List<string> boneNames = KWEngine.GetModelBoneNames("GunModel");
foreach(string bone in boneNames)
{
    KWEngine.LogWriteLine(bone);
}

Wie werden Objekte wieder gelöst?

Für das obige Beispiel würde das Lösen des Waffenobjekts wie folgt lauten:

p.DetachGameObjectFromBone("Knochenname");

Beitrag veröffentlicht

in

von

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.