ホームページ  >  記事  >  バックエンド開発  >  J2ME Mobile 3D 入門チュートリアル シリーズの記事 2

J2ME Mobile 3D 入門チュートリアル シリーズの記事 2

黄舟
黄舟オリジナル
2016-12-19 13:53:041045ブラウズ

ここで、J2ME Mobile 3D 入門チュートリアル シリーズの 1 つである前回の記事をサポートしていただいた皆様にまず感謝の意を表します。皆様のサポートのおかげで、私の Mobile3D 学習プロセスを皆さんと共有できることを願っています。 Mobile3D について説明しましょう。

前回のチュートリアルでは、Moble3D でのリアルタイム計算による 3D グラフィックの作成について詳しく説明し、今回は、*.m3g ファイルからのモデルのインポートについて簡単に説明しました。 *.m3g ファイルの使用では、Mobile3D によるアニメーションの制御とモデルに対するいくつかの操作について簡単に紹介します。

まず、m3g ファイルの作成について簡単に説明します。これは、使い慣れた 3D グラフィック制作ソフトウェアを選択し、対応するプラグインをインストールするだけです。こちらはマヤと3DSです。 MAX では、プラグインは Maya および 3ds max で使用できる H3T EXPort プラグインを使用します。また、ソフトウェア M3G ツール キットをダウンロードする必要があります。

これらはSony EricCSSonのWebサイトでご覧いただけます。プラグインのインストールに問題はないはずです。プラグインをインストールしたら、モデルの作成、テクスチャ マップの設定、カメラの設定、キー フレームの設定などを行い、最後に H3T ファイルにエクスポートするだけです。次にM3Gを開きます ツールキットは、h3t ファイルを m3g ファイルに出力できます。 m3g ファイルを使用する前に M3G ツールを使用することをお勧めします。 キットはファイルを参照して、ユーザー ID やシーンのツリー構造など、非常に重要な対応する情報を記録します。こうすると、この方法でエクスポートしたm3gファイル内のカメラが世界樹の下になく、世界樹と同じレベルにあることがわかります。

実は前回の記事でも、カメラやレンダリング情報は世界ツリ​​ーの下に置く必要はないと言いましたが、モデル情報は全てツリーの下に置く必要があります。 m3g ファイルを確認するときは、ワールド ノードの場所と操作する必要があるモデルのユーザー ID を明確に確認することがより重要です。

準備作業はほぼ完了しました。次は Mobile3D を見てみましょう。 前回の記事で、m3g ファイルは javax.microedition.m3g.Loader.load(String url) を通じてロードされ、このメソッドは javax を返すと言いました。 microedition.m3g.Object3D の場合、world はルート ノードなので、なぜ直接 World を返さないのかと疑問に思う人もいるかもしれません。

m3g ファイルの構造を示したときに、カメラとアニメーションの設定は World ノードのあるブックに配置されるのではなく、World ノードと同じレベルにあることを説明しました。 World ノードはシーンのルート ノードです。では、World ノードを正しく削除するにはどうすればよいでしょうか?方法は2つあります:

1. Object3D配列を走査し、各要素のuseidを比較する 公式Worldノードのuseidが使用されている場合、その要素が取り出されます。

2. Object3D 配列を走査し、各要素が World クラスのインスタンスであるかどうかを比較します。World ノードはシーンのルート ノードであるため、Object3D 配列には World クラスのインスタンス オブジェクトが 1 つだけ存在する必要があります。

最初の方法は比較的単純です。ここでは 2 番目の方法のコードの断片のみを示します。 (実際は同じ)

PRivate voidloadWorld(){
System.out.println("nowloading...");
try{
buffer=Loader.load("/img/TmpMicroFile.m3g"); for(int i=0;i if(buffer[i]instanceofWorld){
world=(World)buffer[i];
return ;
}
}
}catch(Exception e){
buffer=null;
System.out.println("thorw anException whenloading");
e.printStackTrace();
}
}

次にカメラの設定をしますが、今回はWorldからカメラ情報を取得する点が異なります。いくつかの基本的な設定を行うことができますが、ここでは詳しく説明しません。この m3g ファイルをインポートすると、実際にはアニメーション情報がすでに存在します。このアニメーション情報は非常に複雑である可能性があります。コネクティングロッドの 2 つの軸の動きは正常に動作し、IK の逆方向の動きも正常に動作することがわかりました。すでに心配しているかもしれないので、アニメーションの再生を制御する方法を教えてください。 ? 簡単に言えば、World.animate() はアニメーション情報を更新します。このメソッドを初めて呼び出すとき、システムはこの値を記録し、その後の呼び出しごとに比較します。この値が比較され、システムはアニメーションを更新する場所を計算します。同時に、このメソッドは次の更新の推奨値 (ミリ秒) を表す int 型パラメーターを返します。今回は、アニメーション データを次回更新できるように、このメソッドを呼び出すスレッドをスリープさせておくことができます。ただし、ここではアニメーションが数十フレームしかありません。これは良いニュースですが、多くの場合、再生の長さと時間を制御する必要がある場合はどうすればよいでしょうか

この時点では、javax.microedition.m3g.AnimationController クラスを使用する必要があります。実際、各アニメーションの可動モデルにはそれぞれ独自の AnimeController オブジェクトがあり、モデル アニメーションと同様に、World.find(int) を使用できます。 controllerID)、このクラスでは setActiveInterval(int activeTime,int) を渡すことができます。 unactiveTime) を使用してシステムでのアニメーション再生の開始時刻とフォーカス時刻を設定し、setPosition(int startTime,int endTime) メソッドは、このアニメーションのどの段落を再生する必要があるかを制御します。

このチュートリアルの例では 2 つのメソッドを使用していないのが残念ですが、これら 2 つのメソッドの使用方法について知りたい場合は、WTK2.2 の Demo3D のカンガルーのサンプルを参照することをお勧めします。かなり具体的です。そこで。ここでは、アニメーションと描画のためのコード スニペットを示します。 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();

framePor=( int )1000/((int)System.currentTimeMillis()-perFrameTime);

System.out.println("3Dデモフレーム/sn:"+framePor);

if(validity < 1)
{ //有効性が小さすぎます; 最低 1 ミリ秒を許可します。
validity = 1;
b public void run () {
while (isrun) {
try {
thread.sleep (validity); Catch (例外 E) {}}}


If you if you if you スレッドを使用したくない場合は、タイマーに切り替えることができます。これは個人的な好みの問題なので、ここではスレッドを使用します。

私は今、これらのアニメーションだけを理解しているようですが、それらをすべて共有します。次に、Transformable クラスのいくつかのメソッドについて説明します。まず、Transformable クラスを紹介します。 Transformable クラスは非常に重要なクラスであり、Node はそのサブクラスです。その重要性をご存知ですか?

Transformable には今日簡単に説明する 4 つのメソッドがあります。 浮く、浮く、 float) はオブジェクトの回転に関連しています。Mobile3D では、デフォルトですべてのオブジェクトの回転軸が独自の中心にあるため、オブジェクトを回転するときは、特定の点や軸の周りではなく、独自の軸を中心に回転する必要があります。革命、これを明らかにする必要があります。これは少し抽象的かもしれないので、別の言い方をしましょう。つまり、ここでの回転はオブジェクトの方向を変更するだけで、オブジェクトの位置は変更しません。

もうお分かりかと思いますが、おそらく誰かが「これがまさに必要なことではありませんか?なぜそれを強調する必要があるのですか?」と尋ねたいのですが、その理由は実際には、一部の 3D エンジンでは回転が原点に基づいています。つまり、回転運動を実行する必要がある場合は、移動、回転、再度移動する必要があります。実際、これを行う利点は、点には回転の概念がないため、点の計算が容易になることです。私たちの Mobile3D はある程度点で動作できないため、その最小単位はメッシュです。では、どのようにして回転を実現するのでしょうか。行列を見れば分かります

90, 0, 0, 0
0, 0, 0, 0
0, 0, 1, 0
0, 0, 0, 0

この行列が現在のモデルを表していますY 軸上で 90 度回転します。さて、戻って postRotate(float を見てみましょう) a、float x、float y、float z) メソッドには 4 つのパラメータがあります。最初の 1 つは今回回転する必要がある角度で、実際にはこの回転の軸であり、postRotate メソッドは元の方向を継続します。新しい回転は、数式で表すと、元の行列に

a,0,0,0
0,x,0,0
0,0,y,0
0,0,0 を乗じたものを使用することになります。 ,z

この行列が新しい方向行列です。この方法が数学的な観点から理解するのが難しいと思われる場合は、最初の 4 つのパラメータは回転の角度であり、最後の 3 つは回転軸を決定するだけです。
postRotate メソッドに似ているのは、setOrientation(float a, float x, float y, float z) です。違いは、今回は回転せず、この方向に直接設定されることです。

回転について話した後、動きを見てみましょう。これはもっと単純なtranslate(float)です。 x, float y, float z) これは、指定されたベクトルに従った変換を指します。 setTranslation(float x, float y, float z) これはより簡単で、指定された位置に直接移動します。

実際、別のメソッドscale(float sx, float sy, float sz) は、setScale(float sx, float sy, float) と同様にスケーリングに使用されます。 sz) スケールを直接設定します。これら 6 つのメソッドはオブジェクトを直接操作するためのもので、特に最初の 4 つはゲームを作成するときによく使用されます。カメラの距離 (特別な必要がない限り)。以下に最初の 4 つの方法を使用する例を示します。

public void keyPressed(int keycode){
float[] camerTra;
float x;
float z;
switch(keycode){
case GameCanvas.DOWN:
break;
case GameCanvas.UP:
break;
case 52:
dir=dir-2;
System.out.println(dir);
2. 関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) にご注意ください

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。