Hier möchte ich mich zunächst bei allen für die Unterstützung des vorherigen Artikels, eines der J2ME Mobile 3D-Einführungs-Tutorials, bedanken. Mit Ihrer Unterstützung habe ich beschlossen, meinen Mobile3D-Lernprozess mit allen zu teilen Besprechen Sie gemeinsam Mobile3D.
Im letzten Tutorial habe ich Ihnen eine detaillierte Einführung in die Erstellung von 3D-Grafiken durch Echtzeitberechnungen in Moble3D gegeben und eine kurze Einführung in das Importieren von Modellen aus *.m3g-Dateien gegeben. Diesmal möchte ich es tun Stellen Sie kurz die Animationssteuerung von Mobile3D und einige Vorgänge am Modell mithilfe von *.m3g-Dateien vor.
Lassen Sie mich zunächst kurz auf die Erstellung von m3g-Dateien eingehen. Dies ist eigentlich sehr einfach. Sie müssen lediglich eine 3D-Grafikproduktionssoftware auswählen, mit der Sie vertraut sind, und das entsprechende Plug-In installieren. Hier verwende ich die Software Maya und 3DS
MAX, das Plug-in verwendet das H3T EXPort Plugin, das für Maya und 3ds max verfügbar ist. Sie müssen außerdem ein Software-M3G-Tools-Kit herunterladen.
Diese finden Sie auf der Sony EricCSson-Website. Die Installation des Plug-Ins sollte kein Problem darstellen. Nachdem das Plug-in installiert ist, können Sie das Modell erstellen, die Texturkarte festlegen, die Kamera einstellen, den Schlüsselrahmen festlegen usw. und es schließlich einfach in eine H3T-Datei exportieren. Öffnen Sie dann M3G
Das Tools-Kit kann H3T-Dateien in M3G-Dateien ausgeben. Es ist am besten, die M3G-Tools zu verwenden, bevor Sie m3g-Dateien verwenden
Kit durchsucht die Datei, um die entsprechenden Informationen aufzuzeichnen, z. B. die Benutzer-ID und die Baumstruktur der Szene, die sehr wichtig sind. Wenn Sie dies tun, werden Sie feststellen, dass sich die Kamera in der auf diese Weise exportierten m3g-Datei nicht unter dem Weltbaum befindet, sondern auf derselben Ebene wie der Weltbaum.
Tatsächlich habe ich im vorherigen Artikel auch gesagt, dass Kamera- und Rendering-Informationen nicht unter dem Weltbaum platziert werden müssen, sondern alle Modellinformationen unter dem Baum platziert werden müssen. Wenn wir uns die m3g-Datei ansehen, ist es wichtiger, den Standort des Weltknotens und die Benutzer-ID des Modells, das wir zum Betrieb benötigen, klar zu erkennen.
Die Vorbereitungsarbeiten sind fast abgeschlossen. Schauen wir uns nun Mobile3D an. Im vorherigen Artikel habe ich gesagt, dass die m3g-Datei über javax.microedition.m3g.Loader.load (String-URL) und die Methode geladen wird „returns“ ist ein Array von javax.microedition.m3g.Object3D. Manche Leute fragen sich vielleicht, warum nicht einfach eine „World“ direkt zurückgegeben werden, da „world“ der Wurzelknoten ist.
Als ich Ihnen gerade die Struktur der m3g-Datei gezeigt habe, habe ich bereits erklärt, dass die Kamera- und Animationseinstellungen nicht im Buch mit dem Weltknoten platziert sind, sondern auf der gleichen Ebene wie der Weltknoten liegen. Der Weltknoten ist der Wurzelknoten der Szene. Wie entfernen wir also den Weltknoten richtig? Es gibt zwei Methoden:
1. Durchlaufen Sie das Object3D-Array und vergleichen Sie die Useid jedes Elements. Wenn die Useid des offiziellen Weltknotens verwendet wird, nehmen Sie das Element heraus.
2. Durchlaufen Sie das Object3D-Array und vergleichen Sie, ob jedes Element eine Instanz der World-Klasse ist. Da der World-Knoten der Wurzelknoten der Szene ist, sollte es nur ein Instanzobjekt der World-Klasse geben Object3D-Array.
Die erste Methode ist relativ einfach. Ich gebe hier nur einen Ausschnitt des Codes für die zweite Methode. (eigentlich das Gleiche)
PRivate void loadWorld(){
System.out.println("now wird geladen...");
try{
buffer=Loader.load( " /img/TmpMicroFile.m3g");
for(int i=0;i if(buffer[i] exampleof World){
world=(World)buffer[i];
return ;
}
}
}catch(Exception e){
buffer=null;
System.out.println("thorw an Ausnahme beim Laden");
e.printStackTrace() ;
}
}
Der Unterschied besteht darin, dass wir dieses Mal die Kamerainformationen von World erhalten und einige grundlegende Einstellungen dafür vornehmen können Wir werden hier nicht auf Details eingehen.
Wenn wir diese m3g-Datei importieren, sind diese Animationsinformationen möglicherweise sehr kompliziert Es gibt kein Problem mit der Achsenbewegung, und es gibt kein Problem mit der IK-Rückwärtsbewegung, wie aus einigen Informationen hervorgeht. Vielleicht sind Sie schon besorgt, warum sprechen Sie nicht darüber, wie Sie die Animationswiedergabe steuern können? Einfach ausgedrückt: Um Animationsinformationen zu aktualisieren, muss diese Methode einen Parameter vom Typ int übergeben. Wenn Sie diese Methode zum ersten Mal aufrufen, vergleicht das System ihn mit diesem Wert , und dann wird das System berechnen, wo die Animation aktualisiert wird, und diese Methode gibt einen int-Typ-Parameter zurück, der einen empfohlenen Wert für die nächste Aktualisierung darstellt (in Millisekunden). Lassen Sie den Thread, der diese Methode aufruft, für diese Zeit ruhen, damit die Animationsdaten beim nächsten Mal aktualisiert werden können. Meine Animation hat natürlich nur ein paar Dutzend Frames, aber sie wird hier wiederholt abgespielt , aber was sollen wir tun, wenn es viele Situationen gibt, in denen wir die Länge und Zeit der Wiedergabe kontrollieren müssen
?Zu diesem Zeitpunkt müssen wir die Klasse javax.microedition.m3g.AnimationController verwenden. Tatsächlich verfügt jedes bewegliche Modell in jeder Animation über ein eigenes AnimationController-Objekt. Wie die Modellanimation können wir World.find(int.) verwenden
ControllerID), in dieser Klasse können wir setActiveInterval(int activeTime,int
unactiveTime), um die Start- und Fokuszeit der Animationswiedergabe im System festzulegen, und setPosition(int startTime,int
endTime)-Methode steuert, welcher Absatz dieser Animation abgespielt werden muss.
Es tut mir leid, dass ich die beiden Methoden in diesem Tutorial-Beispiel nicht verwendet habe, aber wenn Sie mehr über die Verwendung dieser beiden Methoden erfahren möchten, empfehle ich Ihnen, einen Blick auf die Demo3D von WTK2 zu werfen. 2 Das Känguru-Beispiel ist sehr konkret. Hier gebe ich Codeausschnitte für Animation und Zeichnung.
protected void paint(Graphics g) {
startTime= System.currentTimeMillis() - worldStartTime;
validity= world.animate((int)startTime);
perFrameTime= (int)System.currentTimeMillis();
g.setColor(0x00);
g.fillRect(0,0,getWidth(), getHeight());
g. setClip(0,0,getWidth(),getHeight());
g3d.bindTarget(g,true,Graphics3D.DITHERGraphics3D.TRUE_COLOR);
g3d.setViewport(0,0,getWidth(),getHeight( ));
g3d.render(world);
g3d.releaseTarget(); -perFrameTime);
System.out.println("3D-Demo-Frame/sn :"+framePor);
if(validity < 1)
{ // Die Gültigkeit ist zu klein; mindestens 1 ms zulassen.
Validity = 1;
validity=1000;
}
}
Thread.sleep(validity);
}catch(Exception e){}
}
}
If Wenn Sie keine Threads verwenden möchten, können Sie auf Timer umsteigen. Es ist eine Frage der persönlichen Vorlieben, ich bin mit Threads vertraut, daher verwende ich hier Threads.
Es scheint, dass ich diese Animationen erst jetzt verstehe und sie alle mit Ihnen teile. Als nächstes möchte ich über mehrere Methoden in der Transformable-Klasse sprechen. Lassen Sie uns zunächst die Transformable-Klasse vorstellen. Die Transformable-Klasse ist eine sehr wichtige Klasse und Node ist ihre Unterklasse. Kennen Sie ihre Bedeutung?
Es gibt vier Methoden in Transformable, über die ich heute kurz sprechen werde: postRotate(float,
schweben, schweben,
float) hängt mit der Drehung des Objekts zusammen. In Mobile3D befindet sich die Rotationsachse aller Objekte standardmäßig in ihrer eigenen Mitte. Wenn Sie also ein Objekt drehen, muss es sich um seine eigene Achse drehen, nicht um einen bestimmten Punkt oder eine bestimmte Achse . Revolution, das muss geklärt werden. Vielleicht ist das etwas abstrakt, also lassen Sie es mich anders formulieren: Durch die Drehung ändert sich hier nur die Ausrichtung des Objekts, nicht jedoch die Position des Objekts.
Jetzt wissen Sie, vielleicht möchte jemand fragen: „Ist das nicht genau das, was wir brauchen? Warum sollten wir es betonen?“ In einigen 3D-Engines basiert die Rotation tatsächlich auf dem Ursprung . von. Das heißt, wenn Sie eine Rotationsbewegung ausführen müssen, müssen Sie sich bewegen, drehen und erneut bewegen. Tatsächlich besteht der Vorteil darin, dass Punktberechnungen erleichtert werden können, da es kein Rotationskonzept für Punkte gibt. Bis zu einem gewissen Grad kann unser Mobile3D nicht mit Punkten arbeiten, daher ist seine kleinste Einheit Mesh. Wie erreicht es also eine Rotation? Sie werden es verstehen, wenn Sie sich eine Matrix
90,0,0,0
0,0,0,0
0,0,1,0
0,0,0 ansehen , 0
Diese Matrix stellt das aktuelle Modell mit einer 90-Grad-Drehung auf der Y-Achse dar. Gehen wir nun zurück und schauen uns postRotate(float
a, Float x, Float y, Float
z)-Methode, die 4 Parameter hat. Der erste ist der Winkel, der dieses Mal gedreht werden muss. Die letzten drei sind tatsächlich die Achse dieser Drehung, die durch einen Vektor dargestellt wird. Die neue Rotation besteht, wenn sie durch eine mathematische Formel ausgedrückt wird, darin, die ursprüngliche Matrix multipliziert mit
a,0,0,0
0,x,0,0
0,0,y zu verwenden ,0
0,0,0,z
Diese Matrix ist die neue Richtungsmatrix. Wenn diese Methode aus mathematischer Sicht schwer zu verstehen klingt, müssen Sie sich nur die vier Parameter merken. Der erste ist der Winkel dieser Drehung und die letzten drei bestimmen die Drehachse.
Ähnlich wie die postRotate-Methode ist setOrientation(float a, float x, float y, float z). Der Unterschied besteht darin, dass es dieses Mal nicht mehr gedreht, sondern direkt auf diese Ausrichtung eingestellt wird.
Nachdem wir über Rotation gesprochen haben, schauen wir uns die Bewegung an. Dies scheint viel einfacher zu sein zu übersetzen(float).
x, float y, float z) Dies bezieht sich auf die Übersetzung gemäß dem angegebenen Vektor setTranslation(float x, float y,
float z) Dies ist einfacher: Bewegen Sie sich direkt an die angegebene Position.
Tatsächlich gibt es eine andere Methodenskala(float sx, float sy,
float sz) wird zur Skalierung verwendet, ebenso setScale(float sx, float sy, float
sz) Diese sechs Methoden dienen der direkten Manipulation von Objekten und sind beim Schreiben von Spielen sehr nützlich. Die beiden letzteren scheinen seltener verwendet zu werden, da es viele gibt Entfernung der Kamera (es sei denn, es besteht ein außergewöhnlicher Bedarf). Lassen Sie mich unten ein Beispiel für die Verwendung der ersten vier Methoden geben.
public void keyPressed(int keycode){
float[] cameraTra;
float x;
float z;
switch(keycode){
case GameCanvas.DOWN:
break;
case GameCanvas.UP:
break;
case 52:
dir=dir-2; (float)(3*Math.sin((dir * 3.14159f)
Das Obige ist der Inhalt des zweiten Artikels der Einführungs-Tutorialreihe zu J2ME Mobile 3D. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)