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

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

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

3Dグラフィックス技術は様々な分野で活用が進んでいますが、もちろんJ2ME分野も含まれます。 J2ME は、携帯電話上で 3D グラフィックス プログラミングを実装する API セットである JSR184 などのオプション パッケージを提供します。同時に、モバイル デバイスのハードウェアの発展に伴い、このオプション パッケージをサポートする携帯電話がますます増えています。 EricCSSonのKシリーズ、Sシリーズなど

たまたま、少し前に 3D グラフィックスについて勉強したので、最近モバイル 3D について勉強し始めました。これが皆さんのお役に立てれば幸いです。 JSR184を一緒に学ぶことができます。

それでは、本題に入りましょう。まず、私たちが現実の世界をどのように観察しているかを想像してみましょう。私たちは目を通して観察し、三次元の座標系で構成される世界に住んでいます。 Mobile3D には、必要な世界を自由に構築できる World クラスもあり、3D グラフィックスではこれを「シーン」と呼びます。目のように位置、角度、その他のパラメータを設定して、さまざまな画像を表示できます。

モバイルで 3D映像を3Dで表示するにはどうすればよいでしょうか?まず、3D モデルを作成またはロードし、必要に応じてシーン内の環境やレンダリング方法などの一連のパラメーターを設定します。次に、カメラを生成してセットアップし、必要な光を調整し、必要なものを調整します。位置と角度が必要です。 OK、他に何が必要ですか?シャッターを押すこのステップは「レンダリング」と呼ばれ、すべてが完了します。これは簡単なようで、実際には難しくありません。

これらの手順を順を追って説明しましょう:

まず、モバイルでのモデルの確立について話しましょう。 3D は、ほとんどの 3D プログラミング API と同じです。1. リアルタイム操作の生成。 外部モデリングのインポート。外部モデリングのインポートでは環境情報も同時にインポートされるので、詳しくは後ほど紹介します。ここではMobileの理解に役立つ「リアルタイム計算生成」の部分を中心に紹介します。 3D の仕組み。 Mobile 3D には、3D モデルの頂点情報を保存するために使用される VertexArray と VertexBuffer という 2 つのクラスが用意されています。

その中には VertexArray このクラスには多くの用途があり、より柔軟です。このクラスの最も一般的な用途は 3 つあります。1 つは頂点座標情報を保存するためです。 通常情報を保存します。 3 マップ情報を保存します。このクラスが 3 つの異なるものをどのように管理しているのかと疑問に思う人もいるかもしれません。このクラスを分析してみましょう。まず、このクラスのコンストラクターには 3 つのパラメーターがあります。 このインスタンスに含まれる要素の数 2 各要素に含まれる要素の数 3 各サブ要素が占めるバイト数。これにより、このクラスが 3 つの用途に使用できる理由が明らかになったようです。

さらに、このクラスには、より一般的に使用されるメソッド set(int index, int length, short [] array0) もあり、このメソッドは、このクラスのインスタンス オブジェクトにデータを格納するために使用されます。最初のパラメーターは数値を参照します。要素から開始します。2 番目のパラメータは設定する要素の数を示します。3 番目のパラメータは実際の設定です。

実際にポリゴンのフレーム情報を保存するクラスであるVertexBufferクラスについて簡単に紹介します。頂点位置、検出、マップ情報を設定してグラフィックスを作成するようにクラスを変更します。このうち、

setPositions(VertexBuffer v, float s, float[]b)

このメソッドでは、言うまでもなく、3つのパラメータがあることがわかります。最後の 2 つは、座標オフセットやその他の演算を実行するために使用されます。演算は、

v'=v*s+b


setNormals(vertexBuffer Norm) というものもあります。

メソッドWireを設定するメソッド。非常に重要なメソッドもあります

setTexCoords(int, VertexArray, float, float[])

最初のパラメータに加えて、このメソッドの最後の3つのパラメータはsetPositions(VertexBuffer v, float s, float[] b )

も同様で、最初のパラメータは開始要素番号です。これは少し抽象的ではありませんか?理解できるように例を挙げてみましょう。 short x = 20;

short fz = (short ) -z;

// 固定小数点座標
short[] vert = {x,y,z, fx,y,z, x,fy,z, fx, fy,z, //D

fx,y, fz, x,y,fz, fx,fy,fz, x,fy,fz, //C

fx,y,z, fx,y,fz, fx,fy,z, fx,fy,fz, / /B

x,y,fz, x,y,z, x,fy,fz, x,fy,z, //F

, fx,y ,z, //A

x,fy,z, fx,fy,z, x,fy,fz, fx,fy,fz} //E

try{vertArray=new VertexArray(vert .length/3) ,3,2);
vertArray.set(0,vert.length/3,vert);
}catch(Exception e){System.out.PRintln("vert");}

// 髪の生え際
byte[] ノルム = { 0,0,127, 0,0,127, 0,0,127, 0,0,127,

0,0,-127, 0,0,-127, 0,0,-127, 0,0,- 127,

-127,0,0, -127,0,0, -127,0,0, -127,0,0,

127,0,0, 127,0,0, 127,0, 0, 127,0,0,

0,127,0, 0,127,0, 0,127,0, 0,127,0,

0,-127,0, 0,-127,0, 0,-127,0, 0 ,-127,0};

try{normArray=new VertexArray(norm.length/3,3,1);
normArray.set(0,norm.length/3,norm);
}catch(Exception e) {System.out.println("norm");e.printStackTrace();}

//画像上の点に対応する頂点を与える(vert配列とtex配列は1対1対応)
short[ ] tex = { 1, 0, 0, 0, 1, 1, 0, 1,

1, 0, 0, 0, 1, 1, 0, 1,

1, 0, 0, 0, 1, 1、0、1、0、0、0、1、1、0、1、

1、0、0、0、1、1、0、1、

1、0、0、0、1、 1, 0, 1 };

try{
texArray=new VertexArray(tex.length/2,2,2);
texArray.set(0,tex.length/2,tex);
}catch(Exception e ){System.out.println("tex");}

//立方体を作成する
vb=new VertexBuffer();
vb.setPositions(vertArray,1.0f,null);
vb.setNormals(normArray);
vb.setTexCoords(0,texArray,1.0f,null);

上記のコードでは、立方体の作成に必要な頂点と面の情報をすべて作成していますが、ここでは対応するモデルが生成されないことに皆さん注意してください。その理由は、モデルを生成するために他の情報を設定していないためです。TriangleStripArray クラスを見てみましょう。このクラスは、3D グラフィックスの構築に必要な三角形の情報クラスであることを知っています。複数のサーフェスを使用して 3D ソリッドを構築するには、三角形のサーフェスがより一般的に使用される方法です。ここでは具体的な内容については詳しく説明しません。

次に、環境とマテリアルの情報も設定する必要があります。ここで使用するクラスは、Appearance、Texture2D、およびマテリアルです。まずは例を見てみましょう:

Appearance=newAppearance();

//テクスチャを作成する
Texture2D texture=new Texture2D(image2d);
texture.setBlendColor(Texture2D.FUNC_DECAL);
texture.setWrapping(Texture2D. WRAP_REP EAT ,Texture2D.WRAP_REPEAT);
texture.setFiltering(Texture2D.FILTER_NEAREST,Texture2D.FILTER_NEAREST);

material=new Material();
material.setColor(material.DIFFUSE, 0xFFFFFFFF);
material.setColor(material. SPECULAR, 0xFFFFFFFF);
material.setShininess(100.0f);
Appearance.setTexture(0,texture);Appearance.setMaterial(material);
mesh=new Mesh(vb,tsa,Appearance);
mesh.setAppearance( 0 ,Appearance);

個人的には、Appearance クラスは VertexBuffer クラスに似ていると感じており、複数の属性の保持者でもあります。ここで強調すべきことの 1 つは、Appearance クラスの設定は指定されたものよりもはるかに多いということです。上記以外にも多くの設定があります (たとえば、FOG は霧の設定です)。 Texture2D は、テクスチャをタイル化するかどうかなどのテクスチャ情報を設定するために使用します。マテリアルという名前は材質を意味します。ここでは「反射率」や「色」などの情報を設定します。また、ここではレンダリングパラメータの設定方法も紹介します

//ポリモード設定を行う
PolygonMode PolygonMode=new PolygonMode();
polygonMode.setShading(PolygonMode.SHADE_SMOOTH);
polygonMode.setCulling(PolygonMode.CULL_NONE) ;

//外観を生成する
Appearance=newAppearance();
Appearance.setPolygonMode(polygonMode);

先ほどのコードを見ると、上記のコードよりも簡単に見えますね。実際、PolygonMode はすでに多くの作業を行ってくれています。この設定は、3D MAX でのポリの使用に非常に似ています。

今のコードは、このタイプのマテリアルに必要な最終モデルである Mesh クラスも提供します。モデルを確立したら、カメラを作成する必要があります。 Camera では、setParallel(float, float、float、float) および setPerspective(float、float、float、 浮く)。まず setParallel(float, float, float, float) このメソッドは、カメラのビュー メソッドをフラット ビューに設定します。最初のパラメータは画角の高さを設定します。これはフラット ビューであるため、角度ではなく高さに焦点を当てます。カメラの幅と高さの比率。たとえば、テレビは 4:3、ワイドスクリーン ムービーは 16:9 です。3 番目と 4 番目のパラメータは、それぞれ最も近いレンダリング範囲と最も遠いレンダリング範囲です。同じ setPerspective は、カメラを日常生活での観察角度に近い透視図に設定します。このメソッドの最後の 3 つのパラメーターは setParallel の最後の 3 つのパラメーターと同じで、最初のパラメーターは Angle です。ここでこの角度の問題を無視しないでください。この角度は遠近法の投影を計算するための重要なパラメータです。

すべてが準備できているように見えますが、実際はそうではありません。これまでのところ、必要な材料がすべて準備されています。モバイルを見てみましょう 3D のガバナンス メカニズムは、3D 描画に精通している人なら誰でも、ほとんどの 3D ソフトウェアが 3D であることを知っています。 API はマテリアルをツリー構造で管理します。この利点は、各モデル、モデル グループ、カメラ、その他の要素がノードとして独自の回転軸やその他の属性を設定でき、設定されたアニメーション情報に従うことができることです。 。モバイルで 3D では、ツリー構造のルート ノードが World クラスのインスタンス オブジェクトである必要があると規定されており、カメラとライトはこのツリーに配置する必要はなく、代わりに Graphics3D のオブジェクトを通じて設定されます。 class (ただし、そうである必要はありません

上記は、J2ME Mobile 3D 入門チュートリアル シリーズの記事の 1 つです。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) を参照してください


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