3D グラフィックス技術はさまざまな分野でますます使用されています。もちろん、これには J2ME 分野も含まれます。 J2ME は、携帯電話上で 3D グラフィックス プログラミングを実装する API セットである JSR184 などのオプション パッケージを提供します。同時に、モバイル デバイスのハードウェアの発展に伴い、ソニー エリクソンの K シリーズ、S シリーズなど、このオプション パッケージをサポートする携帯電話がますます増えています。
たまたま、少し前に 3D グラフィックスについて勉強したので、最近モバイル 3D について勉強し始めました。これが皆さんのお役に立てれば幸いです。 JSR184を一緒に学ぶことができます。
それでは、本題に入りましょう。まず、私たちが現実の世界をどのように観察しているかを想像してみましょう。私たちは目を通して観察し、三次元の座標系で構成される世界に住んでいます。 Mobile3D には、必要な世界を自由に構築できる World クラスもあり、3D グラフィックスではこれを「シーン」と呼びます。目の位置や角度などを設定して、さまざまな画像を表示できます。
Mobile 3Dで3D画像の表示を実現するにはどうすればよいでしょうか?まず、3D モデルを作成またはロードし、必要に応じてシーン内の環境やレンダリング方法などの一連のパラメーターを設定し、カメラを生成して設定し、必要な光を調整し、調整する必要があります必要な位置と角度。 OK、他に何が必要ですか?シャッターを押すこのステップは「レンダリング」と呼ばれ、すべてが完了します。これは簡単なように思えますが、実際にはそれほど難しいことではありません。
これらの手順を順を追って説明しましょう:
まず最初に、Mobile 3D では、ほとんどの 3D プログラミング API と同じです: 1. リアルタイム計算。生成; 2. 外部モデリングのインポート。外部モデリングのインポートでは環境情報も同時にインポートされるため、詳しくは後ほど紹介します。ここでは、Mobile の動作原理を理解するのに役立つ「リアルタイム計算生成」の部分を中心に紹介します。 3D。 Mobile 3D は、3D モデルの頂点情報を保存するために使用される VertexArray と VertexBuffer という 2 つのクラスを提供します。
その中で、VertexArray クラスにはより多くの用途があり、より柔軟です。このクラスの最も一般的な用途は、1 頂点座標情報の保存、2 法線情報の保存、3 テクスチャ情報の保存です。このクラスが 3 つの異なるものをどのように管理しているのかと疑問に思う人もいるかもしれません。まず、このクラスのコンストラクターには 3 つのパラメーターがあります。1. このインスタンスに含まれる要素の数。2. 各要素に含まれる要素の数。各サブ要素。これにより、このクラスが 3 つのことに使用できる理由が明らかになるようです。
さらに、このクラスには、より一般的に使用されるメソッド set(int index, int length, short [] array0) もあり、このメソッドは、このクラスのインスタンス
オブジェクト にデータを格納するために使用されます。どの要素から開始するか。2 番目のパラメータは設定する要素の数を示します。3 番目のパラメータは実際の設定です。
実際にポリゴンの
frame情報を保存するクラスであるVertexBufferクラスについて簡単に紹介します。頂点位置、検出、マップ情報を設定してグラフィックスを作成するようにクラスを変更します。このうち、
setPositions(VertexBuffer v, float s, float[]b)
このメソッドでは、言うまでもなく、3つのパラメータがあることがわかります。最後の 2 つは、座標オフセットなどの演算を実行するために使用されます。演算は次の数式です。
setNormals(vertexBuffer Norm) もあります。 )
メソッドを設定するメソッド Wire。非常に重要なメソッドもあります
setTexCo
ord
s(int, VertexArray, float, float[])
最初のパラメータに加えて、このメソッドの最後の3つのパラメータはsumです
setPositions(VertexBuffer v, float s 、 float[]b)
は同じで、最初のパラメータは開始要素番号です。これは少し抽象的ではありませんか?理解できるように例を挙げてみましょう。
short x = 20; short y = 20; short z = 20; short fx = (short) -x; short fy = (short) -y; 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 x,y,fz, fx,y,fz, x,y,z, 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. PRint ln("vert");} //发线 byte[] norm = { 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 数组 是一一对应的) 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, 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、およびマテリアルです。まず例を見てみましょう:
appearnce=new Appearance();
//创建帖图 Texture2D texture=new Texture2D(image2d); texture.setBl end Color(Texture2D.FUNC_DECAL); texture.setWrapping(Texture2D.WRAP_REPEAT,Texture2D.WRAP_REPEAT); texture.setFiltering(Texture2D.FILTER_NEAREST,Texture2D.FILTER_NEAREST); material=new Material(); material.setColor(Material.D IF FUSE, 0xFFFFFFFF); material.setColor(Material.SPECULAR, 0xFFFFFFFF); material.setShininess(100.0f); appearnce.setTexture(0,texture); appearnce.setMaterial(material); mesh=new Mesh(vb,tsa,appearnce); mesh.setAppearance(0,appearnce);
私は個人的に、Appearance クラスは VertexBuffer クラスに似ていると感じており、さまざまな 属性 の保持者でもあります。ここで強調すべきことの 1 つは、外観クラスは上記のものよりもはるかに多く、多くの設定 (フォグ設定である FOG など) があります。 Texture2D は、テクスチャをタイル化するかどうかなどのテクスチャ情報を設定するために使用します。マテリアルという名前は材質を意味します。ここでは「反射率」や「色」などの情報を設定します。また、ここではレンダリングパラメータの設定方法も紹介します
//设置poly模式设置 PolygonMode polygonMode=new PolygonMode(); polygonMode.setShading(PolygonMode.SHADE_SMOOTH); polygonMode.setCulling(PolygonMode.CULL_NONE); //生成外貌 appearnce=new Appearance(); appearnce.setPolygonMode(polygonMode);
先ほどのコードを見ると、上記よりも簡単に見えますよね?実際、PolygonMode はすでに多くの作業を行ってくれています。この設定は、3D MAX でのポリの使用に非常に似ています。
今のコードは、このタイプのマテリアルに必要な最終モデルである Mesh クラスも提供します。モデルを確立したら、カメラを作成する必要があります。 Camera では、setParallel(float, float, float, float) と setPerspective(float, float, float, float) の 2 つのメソッドをここで簡単に紹介します。まず setParallel(float, float, float, float) を見てみましょう。このメソッドは、カメラの view メソッドをフラット ビューに設定することです。最初のパラメーターは、視野角の高さに注意してください。これは平面ビューなので、角度ではありません。2 番目のパラメータはカメラのアスペクト比です。たとえば、テレビは 4:3、ワイドスクリーン ムービーは 16:9 です。と最も遠いレンダリング範囲をそれぞれ示します。同じ setPerspective は、カメラを日常生活の観察角度に近いパース ビューに設定します。このメソッドの最後の 3 つのパラメーターは setParallel の最後の 3 つのパラメーターと同じで、最初のパラメーターは Angle です。ここでこの角度の問題を無視しないでください。この角度は遠近法の投影を計算するための重要なパラメータです。
すべてが準備できているように見えますが、実際はそうではありません。これまでのところ、必要な材料がすべて準備されています。 Mobile 3D の管理メカニズムを見てみましょう。3D グラフィックスに精通している人は、ほとんどの 3D ソフトウェアと 3D API が、各モデル、モデル グループ、カメラ、その他の要素をツリー構造で管理していることを知っています。ノードとして独自の回転軸やその他の属性を設定することができ、設定したアニメーション情報に従って移動することができます。 Mobile 3D では、ツリー構造のルート ノードは World クラスのインスタンス オブジェクトである必要があると規定されており、カメラとライトはこのツリーに配置する必要はなく、代わりに のオブジェクトを通じて設定されます。 Graphics3D クラス
【関連する推奨事項】
2. XML の技術マニュアル
3.
以上がJ2ME 3Dグラフィックス技術の事例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。