280 likes | 365 Views
XNA 3D Tutorial. Anzeigen eines Objektes 2 – „ BasicEffect “. Inhalt. Vorwort.
E N D
XNA 3D Tutorial Anzeigen eines Objektes 2 – „BasicEffect“
Vorwort Bevor wir uns diesem Tutorial und dem „BasicEffect“ zuwenden, will ich noch sagen, dass dieses Tutorial an das vorherige Tutorial, also „Anzeigen eines Objektes“, anschließt. Deshalb sollten Sie dieses Tutorial, wenn möglich, vorher durchlesen. Falls das nicht möglich ist, gibt es kein Grund zu verzweifeln, denn ich werde hier nicht all zu viel auf das andere Tutorial eingehen.
Texturen Als erstes widmen wir uns den Texturen. Also, wie geht das? Ganz einfach: Zunächst müssen wir uns in den „BasicEffect“-Eigenschaften, die Eigenschaft „TextureEnabled“ raussuchen und sie mit „true“ belegen. Somit schalten wir die Texturen an. effect.TextureEnabled = true; Nun müssen wir ja irgendwie die Textur an den „BasicEffect“ übergeben. Dazu legen wir erst mal eine Variable für die Textur an. Wir nennen diese „myTexture“: Texture2DmyTexture;
Texturen-Fortsetzung So, nun müssen wir diese Variable natürlich noch belegen. Das machen wir wieder mithilfe der „Load()“-Methode, des Contentobjektes: myTexture = Content.Load<Texture2D>(„filename“); „filename“, wieder durch den Namen der Textur austauschen. Als letztes müssen wir die Textur ja noch übergeben. Das machen wir mit folgender Zeile: effect.Texture = myTexture;
Texturen-Fortsetzung Wenn, alles geklappt hat dann sollte die Textur jetzt auf ihrem Objekt angezeigt werden, sofern die Textur natürlich bei der Objekterstellung verwendet wurde. Um nochmals kurz alles zusammenzufassen: 1. „TextureEnabled“ des „BasicEffect“-Objektes auf „true“ setzen. 2. Variable „myTexture“ in die Klasse einfügen. 3. Variable mittels „Content.Load<Texture2D>(„f.“)“ belegen. 4. „Texture“ des „BasicEffect“-Objektes mit „myTexture“ belegen.
World Wie man die Position ändert, ist nicht schwer. Wie ich im letzten Tutorial schon erwähnt habe kann man mittels der Methode „CreateTranslation()“ des „Matrix“-Objektes eine Position für das Objekt bestimmen. Diese Funktion, die ich grad genannt hab, macht eigentlich nichts anderes, als einen Vektor in eine Matrix zu verwandeln. Doch wie kann man nun das Objekt rotieren oder skalieren. Das erklär ich auf den nächsten Seiten.
World-Fortsetzung Wie die Positionsänderung geht wissen Sie ja schon. Nun wollen wir erst mal herausfinden, wie wir unser Objekt rotieren. Da wir im 3D-Raum sind, gibt es 3 verschiedene Rotationstypen. Die Rotation um die X-Achse (hoch, runter), um die Y-Achse (links, rechts) und um die Z-Achse(links drehen, rechts drehen). Um das mal besser zu verdeutlichen, zeige ich auf der nächsten Seite wieder ein Bild.
World-Fortsetzung Hier kann man die Rotationen nochmal gut erkennen. Allerdings muss man hierbei beachten, dass die X-Rotation nicht der Rotation um die X-Achse sondern der Rotation um die Y-Achse entspricht. Ich werde auf der nächsten Seite ein Achsenmodell zeigen, was das besser erläutert.
World-Fortsetzung Hier sieht man nochmals die Rotationen und ihre zugehörigen Achsen. Kommen wir also endlich zur Implementierung.
World-Fortsetzung Die Implementierung der Rotation benötigt wie die Position eine Matrix. Diese Matrix wird dann einfach mit der Positionsmatrix „Mal“ genommen und man erhält die Endmatrix, also die „World“-Matrix. Die Rotationsmatrix erstellt man mit folgender Methode des „Matrix“-Objektes: Matrix.CreateFromYawPitchRoll(xRot,yRot,zRot); Statt xRot, yRot und zRot geben Sie einfach die Rotationswerte ein. Beispiel auf nächster Seite.
World-Fortsetzung Die „World“-Matrix, sehe zum Beispiel so aus: effect.World = Matrix.CreateTranslation(newVector3(0,5,0)) * Matrix.CreateFromYawPitchRoll(10,0,0); Hier würde das Objekt 5 Pixel über dem Nullpunkt, mit einer X-Rotation von 10 gezeichnet werden.
World-Fortsetzung Nun kommen wir zum letzten Teil der „World“-Matrix - Die Skalierung. Was Skalierung ist sagt, dass Wort eigentlich schon selber. Mit der Skalierung können wir das Objekt um einen gewissen Faktor vergrößern oder verkleinern. Dabei gilt: Wenn der Faktor kleiner als 1 und größer als 0 ist, wird verkleinert und wenn der Faktor größer als 1 ist vergrößert. Faktor 1 ist die Standartgröße des Objektes. Zur Verdeutlichung wieder ein Bild.
World-Fortsetzung Hier sieht man, wie die Skalierung erfolgt.
World-Fortsetzung Nun fehlt nur noch die Implementierung der Skalierung. Dies erfolgt durch folgende Zeile: Matrix.CreateScale(scaleFactor); Statt scaleFactorwiederum einen Wert eintragen. Schlussendlich muss diese Matrix dann auch noch mit den restlichen Matrizen multipliziert werden.
World-Fortsetzung Die „World“-Matrix sieht dann zum Beispiel so aus: effect.World = Matrix.CreateTranslation(newVector3(0, 5, 0)) * Matrix.CreateFromYawPitchRoll(10, 0, 0) * Matrix.CreateScale(3); Hier würde also das Objekt 5 Pixel über dem Nullpunkt, mit einer X-Rotation von 10 und einer 3fachen Größe gezeichnet werden.
World-Fortsetzung Das war alles, was man über die „World“-Matrix wissen sollte, bis auf eine Sache. Die Reihenfolge in der man die Matrizen multipliziert ist auch sehr wichtig. Man sollte das Objekt immer erst verschieben, dann rotieren und dann skalieren. Denn sollte man das Objekt erst rotiert haben, dann würde das Objekt in Abhängigkeit zur Rotation verschoben werden und das würde ein ganz anderes Endergebnis ausmachen.
Licht Das Licht auf ein Objekt spielt natürlich auch eine wichtige Rolle. Im „BasicEffect“ kann man 3 verschiedene Lichtquellen auf ein Objekt setzen. Diese Lichtquellen können in Farbe, Glanz und Richtung geändert werden. Auf diese Lichtquellen kann man im „BasicEffect“ mittels der 3 Variablen „DirectionalLight0“, „DirectionalLight1“ und „DirectionalLight2“ zugreifen.
Licht-Fortsetzung In diesen Variablen findet man wieder 4 Eigenschaften, die bei jeder Lichtquelle gleich sind: „SpecularColor“ (Glanzfarbe), „DiffuseColor“ (Farbe), „Direction“ (Richtung) und „Enabled“ (Aktiv oder Inaktiv). Also alle diese Eigenschaften erklären sich ja eigentlich schon von selber, aber ich werde trotzdem noch auf den nächsten Seiten ein paar Beispiele zur Verwendung dieser Eigenschaften geben.
Licht-Fortsetzung Die Farbe des Lichtes, also „DiffuseColor“ setzt man über das „Color“-Objekt: effect.DirectionalLight0.DiffuseColor = Color.Red.ToVector3(); Hier wird die Lichtfarbe auf Rot gesetzt. Das „ToVector3()“ ist dafür verantwortlich, dass das Licht in einen 3er-Vektor umgewandelt wird. Das wird aus „Shader“-technischen Gründen so gemacht, welche ich in diesem Tutorial nicht genauer erklären will.
Licht-Fortsetzung Die Glanzfarbe, wird genauso wie die Farbe des Lichtes behandelt: effect.DirectionalLight0.SpecularColor = Color.White.ToVector3(); Die Glanzfarbe wird in diesem Fall auf Weiß gesetzt. Die Verwendung der Glanzfarbe erklärt sich eigentlich von selber. Die Glanzfarbe ist für die Farbe des Glanzes, welcher bei manchen Objektmaterialien, wie beispielsweise Metall entsteht, verantwortlich.
Licht-Fortsetzung Eine weitere Eigenschaft ist die „Direction“-Eigenschaft, welche die Lichtrichtung bestimmt. Diese Eigenschaft ist ein 3er-Vektor, welcher die Richtung der Lichtquelle ist. Dieser kann zum Beispiel so aussehen: effect.DirectionalLight0.Direction = Vector3.Down; In diesem Fall würde das Licht von Oben auf das Objekt einfallen. Natürlich können Sie auch einen eigenen Vektor erstellen, wie zum Beispiel: „newVector3(1,0,0)“, welcher eine Lichteinfall von Linkssimulieren würde.
Licht-Fortsetzung Die letzte Eigenschaft, der wir uns widmen, ist die „Enabled“-Eigenschaft, welche die aktuelle Lichtquelle entweder aktiviert oder deaktiviert: effect.DirectionalLight0.Enabled = false; Diese Zeile würde das Licht deaktivieren. Falls Sie das Licht aktiviert haben wollen, schreiben Sie einfach „true“ statt „false“ hin.
Licht-Fortsetzung Nun will ich Ihnen noch ein letztes Beispiel für ein orangenes Licht geben, was von oben, links auf das Objekt mit einer weißen Glanzfarbe einfällt: effect.DirectionalLight0.Enabled = true; effect.DirectionalLight0.Direction = newVector3(1,-1,0); effect.DirectionalLight0.DiffuseColor = Color.Orange.ToVector3(); effect.DirectionalLight0.SpecularColor = Color.White.ToVector3();
Alpha Dem letzten Teil dem wir uns widmen, ist das Alpha, also die Transparenz eines Objektes. Der Alphawert ist ein Wert zwischen 0 und 1, wobei 0, volle Transparenz und 1, keine Transparenz bedeutet. Man setzt ihn folgendermaßen: effect.Alpha = 0.5f; Das wäre ein Beispiel für eine Halbtransparenz.
Alpha-Fortsetzung Damit das Objekt nun aber auch wirklich halbtransparent gezeichnet werden kann, müssen wir zunächst die Transparenz im „GraphicsDevice“-Objekt aktivieren. Das machen wir folgendermaßen: GraphicsDevice.RenderState.AlphaBlendEnable= true; Diese Zeile schreiben Sie einfach vor den Code zum Zeichnen des Objektes.
Zusammenfassung Sie haben nun also gelernt, wie man den „BasicEffect“ richtig benutzt. Sie können nun Objekte mit Texturen versehen, verschieben, rotieren, skalieren, ein Licht drauf setzen oder transparent machen. Ich will hier noch eine kleine Bemerkung zum Thema „Licht“ geben. Ich habe in den Beispielen nur das „DirectionalLight0“ verwendet. Natürlich können Sie auch die anderen Lichtquellen verwenden.
Ende So, das war alles. Falls noch Fragen sind oder etwas nicht funktioniert oder ihr etwas nicht verstanden habt, dann schickt mir bitte eine E-Mail an: carl.peuthert@freenet.de