GMOgre3D - Basis Wissen 1

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • GMOgre3D - Basis Wissen 1

      GMOgre3D - Basis Wissen 1

      Ich möchte euch heute mein Erstes Tutorial zeigen. Naja, eigentlich ist es kein wirkliches Tutorial von mir. Es ist eine Übersetzung dieses Tutorials (code.google.com/p/gmogre3d/wiki/BasicTutorial1 ) von robgeiman. Es wird den Usern, die der englischen Sprache nicht sehr mächtig sind den Umgang mit der GMOgre DLL sicherlich erleichtern.
      Ich bitte darum mich auf Fehler beim übersetzen Aufmerksam zu machen, es ist mit Sicherheit noch nicht perfekt.
      Basis Tutorial 1
      Erklärung zu den Basis Ogre Funktionen:
      SceneManager, SceneNode, und Einheiten (Entities)
      Wie GMOgre3D funktioniert:
      Dies ist ein Umfassendes Thema. Wir werden mit SceneManagers starten und arbeiten uns durch über Entities bis SceneNodes. Diese 3 Klassen sind die Fundamentalbausteine von GMOgre3D Spielen.
      SceneManager Grundlagen
      Alles was auf dem Bildschirm angezeigt wird steuert der SceneManager (Wer hätte das gedacht…). Wenn du ein Objekt in einer Szene platzierst, speichert der SceneManager seine Position. Wenn du Kameras platzierst um die Szene anzuzeigen (Was wir in einem späteren Tutorial noch behandeln werden) speichert der SceneManager auch diese. Kreierst du Ebenen, Billboards, Lichter usw, speichert Sie wieder der SceneManager.
      Es gibt mehrere Typen des SceneManagers. Hier siehst du die verschiedenen Typen aufgelistet:
      • ST_GENERIC – Genereller SceneManager
      • ST_EXTERIOR_CLOSE – Terrain SceneManager
      • ST_EXERIOR_FAR – Umgebung SceneManager
      • ST_EXTERIOR_REAL_FAR – Seiten SceneManager
      • ST_INTERIOR – BSP SceneManager
      Wir werden mehr über andere SceneManager im Laufe des Tutorials erfahren.
      Einheiten Grundlagen
      Eine Einheit (Entity) ist eine Art von Objekten die du in einer Scene rendern kannst. Du kannst dir eine Einheit als solches vorstellen, was ein 3D Mesh repräsentiert. Ein Roboter ist eine Einheit, ein Fisch ist eine Einheit und der Boden auf dem dein Charakter läuft ist eine große Einheit. Dinge wie Lichter, Billboards, Partikel, Kameras, usw. sind keine Einheiten.
      Eine Besonderheit von GMOgre3D ist, dass sie renderbare Objekte von ihrer Position und ihrer Ausrichtung unterscheidet. Das beinhaltet dass du Einheiten nicht Direkt in der Szene platzieren kannst. Stattdessen musst du die Einheit an ein SceneNode Objekt anhängen, und diese beinhaltet die Informationen über Position und Ausrichtung.
      SceneNode Grundlagen
      Wie bereits Erwähnt, speichern SceneNodes die Position und Ausrichtung für alle Objekte die an ihnen Angehängt sind. Wenn du ein Objekt kreierst, wird es nicht in der Szene gerendert bis du es an eine SceneNode anhängst. Außerdem ist eine SceneNode kein Objekt was auf dem Bildschirm angezeigt wird. Erst sobald du ihr ein Objekt zuordnest, wird etwas auf dem Bildschirm angezeigt.
      Du kannst beliebig viele Objekte an eine SceneNode anhängen. Sagen wir du hast einen Charakter der auf dem Bildschirm umherwandert und du möchtest ein Licht um ihn herum generieren. Dies stellst du an, indem du zuerst ein SceneNode Objekt kreierst und danach ein Objekt für den Charakter, welches du dem SceneNode Objekt zuordnest. Anschließend erstellst du ein Licht Objekt und hängst es an die SceneNode. SceneNodes können auch an andere SceneNodes angehängt werden, was die Erlaubt ganze Hierarchien von SceneNodes zu erstellen. Wir behandeln erweiterte Funktionen von SceneNodes Zuordnungen in einem späteren Tutorial.
      Ein Hauptkonzept das bei SceneNodes anzumerken ist: Die Position einer SceneNode ist immer Relativ zu seiner Ursprungs SceneNode, und jeder SceneManager beinhaltet eine Haupt SceneNode der alle anderen Untergeordnet sind.
      Starten der GMOgre3D
      Um die GMOgre3D in deinem Projekt zu benutzen musst du erst einmal alle GM Script in dein bestehendes GameMaker Projekt importieren. Oder benutze einfach eine Kopie der example.gmk als Basis für dein Projekt.
      Um die GMOgre3D zu verwenden musst du sie zuerst Initialisieren. Dann kannst du ihr den Render-Typ mitteilen, welchen du benutzen willst. Hier sind die 2 Typen aufgelistet:
      • RENDER_DX9 – DirectX 9 Render
      • RENDER_GL – OpenGL Render.
      Erstelle ein Objekt Namens „obj_engine“ und platziere es in deinem Raum. Im Create Event des Objektes führst du folgendes Skript aus:

      GML-Quellcode

      1. InitializeOgre3D();
      2. StartOgre3DEngine(global.RENDER_DX9);

      Wenn du GMOgre3D initialisiert und gestartet hast, musst du ihr mitteilen wo deine Externen Ressourcen sind und danach diese initialisieren. Diese können in einem Ordner oder einem simplen Zip-Archiv. Für unsere Zwecke fügen wir folgende Ressourcen hinzu:

      GML-Quellcode

      1. AddResourceLocation("./media/packs/OgreCore.zip", global.LOC_ZIP);
      2. AddResourceLocation("./media/materials/programs", global.LOC_FILESYSTEM);
      3. AddResourceLocation("./media/materials/scripts", global.LOC_FILESYSTEM);
      4. AddResourceLocation("./media/materials/textures", global.LOC_FILESYSTEM);
      5. AddResourceLocation("./media/models", global.LOC_FILESYSTEM);
      6. InitializeAllResourceGroups();


      Die Szene erstellen:

      Da du nun alles eingerichtet hast um deine 3D Welt anzuzeigen, musst du einen SceneManager erstellen. Für dieses Tutorial benutzen wir den Generellen SceneManager.

      GML-Quellcode

      1. CreateSceneManager(global.ST_GENERIC);


      Ansicht und Kamera einrichten

      Du hast soeben die GMOgre3D eingerichtet und gestartet. Nun müssen wir einen Weg finden die Spielwelt anzuzeigen. Das heißt Wir müssen eine Ansicht und eine Kamera erstellen. GMOgre3D Ansichten ähneln den GM Ansichten, also brauchen sie Nicht wirklich eine Erklärung. Um sie zu erstellen musst du die zorder, left, top, width, und height Parameter angeben. Der Nachfolgende Code kreiert eine einzelne Ansicht des Gesamten GM Fensters:

      GML-Quellcode

      1. view_id = CreateViewport(0, 0, 0, room_width, room_height);


      Als nächstes musst du eine Kamera zu jedem deiner Ansichten hinzufügen. Wir gehen darauf im nächsten Tutorial noch genauer ein. Erstelle ein neues Objekt obj_camera und platziere es im Raum. Schreibe den folgenden Code ins Create Event:

      GML-Quellcode

      1. camera_id = CreateCamera(room_width / room_height, 5, 10000, 45);
      2. SetViewportCamera(view_id, camera_id);
      3. SetCameraPosition(camera_id, 0, 200, 40);



      Dein erstes GMOgre3D Spiel

      Wenn du dies alles eingerichtet hast, ist das erste was wir machen wollen ein Umgebungs Licht (Englisch: ambient light) zu erstellen um zu sehen was wir überhaupt im Raum machen.
      Wie stellen wir das an? Wir rufen die SetAmbientLight Funktion auf und legen eine Farbe die uns gefällt fest. Füge diese Code Zeilen dem Ende des Create Events deines Objekt obj_engine hinzu:

      GML-Quellcode

      1. SetAmbientLight(c_white);

      Das nächste was wir machen müssen ist eine Einheit zu erstellen. Erstelle ein weiteres Objekt namens obj_entity und platziere es in deinem Raum. In das Create Event packst du folgendes:

      GML-Quellcode

      1. ent_id = CreateEntity("Robot.mesh");

      Die Parameter von CreateEntity legen das Mesh fest welches für die Einheit benutzen wollen. Dieses haben wir ja oben mithilfe von AddResourceLocation geladen.

      Jetzt müssen wir dem Objekt eine SceneNode zuordnen. Wir erstellen eine SceneNode, die der Haupt SceneNode der Szene untergeordnet ist:

      GML-Quellcode

      1. node_id = CreateRootChildSceneNode();


      Nun müssen wir die Einheit der SceneNode zuordnen um dem Roboter eine Renderumgebung zu geben:

      GML-Quellcode

      1. AttachEntityToSceneNode(ent_id, node_id);

      Abschließend müssen wir die GMOgre3D Dll auffordern jeden Frame zu rendern. Platziere einfach den folgenden Code ins Step Event deines obj_engine Objektes:

      GML-Quellcode

      1. RenderFrame();

      Und das war’s! Führe dein Spiel aus, und betrachte den Roboter auf deinem Bildschirm.

      Koordinaten und Vektoren

      Bevor wir weiter machen, müssen wir Bildschirm Koordinaten und GMOgre3D Vektor Objekte behandeln. Wie auch der GM, benutzt GMOgre3D die x und y Achse als horizontale Ebene, und die Z Achse als vertikale Achse.

      Hast du gesehen wie unser Roboter der positiven x Richtung zugewandt war? Das ist eine Eigenschaft des Mesh an sich, und wie es erstellt wurde. Ogre macht dir keine Vorschriften wie du deine Objekte Ausrichtest. Jedes Mesh das du lädst kann eine andere Start Richtung haben in die es schaut.

      GMOgre3D benutzt die Vektoren um Richtung und Position darzustellen. Wenn du nicht mit Vektoren vertraut bist, schlage ich vor du frischt dein Wissen etwas auf bevor du etwas Ernstes mit der GMOgre3D machst. Die Mathematik, die hinter Vektoren steckt wird dir in komplexeren Spielen noch sehr behilflich sein.

      Ein weiteres Objekt hinzufügen

      Da du nun verstanden hast wie Koordinaten Systeme funktionieren, können wir mit unserem Code weitermachen. In den 3 Zeilen die wir schrieben, legten wir nirgends die exakte Position fest, an der unser Roboter erscheinen soll. Einige Funktionen in GMOgre3D haben voreingestellte Werte dafür. Beispiel: Die CreateRootSceneNode Funktion in GMOgre3D hat 6 Parameter: 3 für die Anfangsposition der SceneNode, und 3 für die Startausrichtung der SceneNode. Wenn du nichts angibst, wird die SceneNode an Position 0,0,0 mit einer Ausrichtung von 0,0,0 erstellt. Lass uns eine weiter SceneNode erstellen, aber diesmal geben wir die Startposition an. Füg den folgenden Code am Ende deines Create Event Codes deines Objekts obj_entity ein:

      Das sollte dir vertraut sein. Wir haben genau dasselbe wie vorher getan – mit Zwei Ausnahmen: Zu allererst haben wir die SceneNode und die Einheit etwas anders benannt. Die Zweite Sache die wir verändert haben ist das die Startposition 50 Einheiten in Richtung x, weg von der Haupt SceneNode, liegt. (Wir erinnern uns: Alle SceneNodes sind Relativ zu ihren Übergeordneten). Kompiliere dein Spiel und starte es. Du siehst Zwei Roboter, Seite an Seite.

      Weitere Einheiten Funktionen

      Einheiten sind sehr ausführlich, und wir behandeln jetzt nicht jeden Teil der Objekte in diesem Tutorial…Nur genug damit du anfangen kannst. Es gibt mehrere gleich nützliche zugehörige Funktionen für Einheiten, welche ich jetzt gerne herausnehmen möchte.

      Die Erste ist ShowEntity/HideEntity. Du kannst jede Einheit sichtbar oder unsichtbar machen, indem du einfach diese Funktion aufrufst. Wenn du eine Einheit ausblenden möchtest, aber sie später wieder anzeigen möchtest mach sie unsichtbar und wieder Sichtbar anstatt sie zu zerstören und später wieder zu erstellen. Merk dir das du Einheiten nicht „zusammenführen“ musst. Es wird immer nur eine Kopie jedes Objekt Mesh oder jeder Textur in den Speicher geladen, also machst du es dir nicht leichter wenn du versucht sie zu speichern. Die Einzigen Sachen die du wirklich speicherst sind die Erstellung und Zerstörung von Einheiten. Dieser Speicherverbrauch ist aber relativ gering.

      Die GetParentSceneNode Funktion gibt die Einheiten aus die einer SceneNode zugeteilt sind.

      Weitere SceneNode Funktionen

      SceneNodes sind sehr komplex. Man kann eine Menge mit SceneNodes anstellen, wir werden also nur die nützlichsten behandeln. Du kannst die Position einer SceneNode mit GetSceneNodePosition abrufen und mit SetSceneNodePosition festlegen (Immer relativ zur Haupt SceneNode). Du kannst das Objekt relativ zu seiner aktuellen Position mithilfe von TranslateSceneNode bewegen. SceneNodes setzen zwar nicht die Position der Objekte, aber sie setzen die Skalierung und Rotation des Objektes. Die Skalierung eines Objektes kannst du mit der Skalierungs-Funktion setzen. PitchSceneNode, YawSceneNode und RollSceneNode rotieren das Objekt. ResetScreenNodeOrientation setzt dies wieder zurück.

      Weil jedes Positionieren und Rotieren relativ zum Objket ausgeführt wird, können wir es leicht anstellen dass zwei SceneNodes sich zusammen bewegen. Wir haben zurzeit diesen Code im Create Event von obj_entity:

      GML-Quellcode

      1. ent1_id = CreateEntity("Robot.mesh");
      2. node1_id = CreateRootChildSceneNode();
      3. AttachEntityToSceneNode(ent1_id, node1_id);
      4. ent2_id = CreateEntity("Robot.mesh");
      5. node2_id = CreateRootChildSceneNode(50, 0, 0);
      6. AttachEntityToSceneNode(ent2_id, node2_id);


      Wenn wir die 5. Zeile von

      GML-Quellcode

      1. node2_id = CreateRootChildSceneNode(50, 0, 0);



      Nach

      GML-Quellcode

      1. node2_id = CreateChildSceneNode(node1_id, 50, 0, 0);

      Abändern, ist RobotNode2 RobotNode untergeordnet. Bewegen wir nun Node1, passiert dasselbe mit Node2. Bewegen wir aber Node2, wird sich Node1 nicht bewegen. Dieser Code bewegt beispielsweise nur Node2

      GML-Quellcode

      1. TranslateSceneNode(node2_id, 10, 0, 10);

      Der Nachfolgende Code bewegt Node1, und weil Node2 Node1 zugeordnet ist bewegt sich Node2 ebenfalls:

      GML-Quellcode

      1. Translate(node1_id, 25, 0, 0);

      Wenn du damit Probleme hast, ist es am einfachsten bei der Haupt SceneNode zu starten und abwärts zu gehen. Sagen wir wir starten wie in diesem Fall node1 mit (0, 0, 0) und transformieren es zu (25, 0, 0), folglich ist die Position von nude1 (25, 0, 0) relativ zu ihrer übergeordneten. Node2 startete bei (50, 0, 0) und wir transformierten es zu (10, 0, 10), sodass ihre neue Position (60, 0, 10), relativ zu ihrer übergeordneten, ist.

      Nun stell dir vor wo diese Dinge wirklich sind. Beginne bei der Haupt SceneNode. Ihre Position ist immer (0, 0, 0). Nun ist Node1’s Position (root + node1): (0, 0, 0) + (25, 0, 0) = (25, 0, 0). Logisch. Nun, node2 ist node1 untergeordnet, so ist ihre Position (root + node1 + node2): (0, 0, 0) + (25, 0, 0) + (60, 0, 10) = (85, 0, 10). Dies ist nur ein Beispiel um zu zeigen wie die SceneNode Unterteilung ist. Du wirst selten die genaue endposition berechnen müssen.

      Dinge zum probieren

      Du solltest nun einen Basis Eindruck von Einheiten, SceneNodes und dem SceneManager haben. I schlage vor du startest mit dem Code unten und fügst Roboter hinzu und entfernst welche. Wenn du dies getan hast, Lösche alle Einheiten und SceneNotes im Create Event deines Objekts, und spiele mit den folgenden Code Segmenten:

      Scale

      Du kannst die Meshes Skalieren, in dem du die Skalierungs-Methode im SceneNode aufrufst. Spiele ein bisschen mit den Werten und schau was passiert.

      Rotationen

      Du kannst ein Objekt mit yaw, pitch und roll Methoden rotieren. Pitch gehört zur X Achse, Yaw zu Z und roll ist die Y Achsenrotation.

      Versuche die Stärke zu verändern und kombiniere verschiedene Transformationen:

      Abschluss

      Nun solltest du ein Basis Wissen über SceneManager, SceneNode und Einheiten Klassen besitzen. Du musst nicht sofort mit all den Funktionen vertraut sein, die ich grade angesprochen habe. Durch arbeiten mit den Funktionen wirst du selbständig lernen. Außerdem lernst du mehr mit diesen Funktionen in den folgenden Tutorials.
      Ich hoffe dass das einigen hier weiterhilft. Ich werde versuchen in der nächsten Zeit noch die restlichen Tutorials zu übersetzen.

      - frischideu



    • Nice!
      Schön dass du den Hype um Ogre aufnimmst und es ein wenig pushst, vielleicht wird GMOgre3D ja mal Standart in der Community!
      "das war meine letzte flamewar PM an dich ."
    • Benutzer online 1

      1 Besucher