[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:01444] TraingleStripArray について



┌--------------------------------------------------┐・
│ 太郎   「こんなことってあるんだ。」       └┐・
│ 花子   「・・・・なに??」              └┐・
│ 太郎   「だって、ずっと“無料”でいいんだよ。」   └┐・OTD・
└---------------------------------- http://www.easyml.com/495.php3
 

はじめまして、荒井です。


質問なのですが、TriangleStripArrayで物体を表示しようとしたのですが、
うまくいきません。
物体を作っているメソッドのコードを下のほうに載せています。

200×200(プログラム中ではxNum×yNum)の配列(プログラム中ではmatrix)
にPoint3Dオブジェクトが入っていて、それをもとに三角形をたくさん描いて、
物体を表示するプログラムです。真上から見ると正方形になる物体です。
わかりにくいかもしれませんが、真上から見るとこんな感じに描いています。

---------     -----
|/|/|/|/|.....|/|/|
--------      -----
|/|/|/|/|.....|/|/|
---------     -----
...................
---------     -----
|/|/|/|/|.....|/|/|
--------      -----

どのように、うまくいかないのかというと
Shape3Dオブジェクトに、MaterialをセットしたAppearanceをセットすると
最初の一行だけしか表示されません。(配列を200行と考えて)
上のことをしないと、もちろん光源の影響は受けませんが、表示はされます。

また、これをTriangleArrayで書くとMaterialをセットしようがしまいが、
きちんと表示されます。

いくら考えても何が悪くて、何が原因なのかわかりません。
助けてください。

  public void create(){

  /*このへんは物体を原点付近に表示させるための処理*/
    Transform3D translate=new Transform3D();
    float centerX=gapX*xNum/2.0f;
    float centerY=(minAltitude+maxAltitude)*magnification/2.0f;
    float centerZ=gapY*yNum/2.0f;
    translate.setTranslation(new Vector3f(-centerX,-centerY,-centerZ));
    this.setTransform(translate);

    lut=new SColorLUT(minAltitude,maxAltitude);




    /*ここからTriangleStripArrayで書いたコード

    int vertexCount=xNum*2*(yNum-1);
    int[] stripCounts=new int[yNum-1];
    for(int i=0;i<stripCounts.length;i++){
      stripCounts[i]=xNum*2;
    }

    Point3f[]  coordinates=new Point3f[vertexCount];
    Color3f[]  colors     =new Color3f[vertexCount];
    Vector3f[] normals    =new Vector3f[vertexCount];

    int index=0;
    for(int i=0;i<yNum-1;i++){
      for(int j=0;j<xNum-1;j++){

normals[index]=calcNormal(matrix[j][i],matrix[j][i+1],matrix[j+1][i]);
        colors[index]=lut.searchColor(matrix[j][i].y/magnification);
        coordinates[index]=matrix[j][i];index++;


normals[index]=calcNormal(matrix[j][i+1],matrix[j+1][i+1],matrix[j+1][i]);
        colors[index]=lut.searchColor(matrix[j][i+1].y/magnification);
        coordinates[index]=matrix[j][i+1];index++;
      }

normals[index]=calcNormal(matrix[xNum-1][i],matrix[xNum-2][i],matrix[xNum-2]
[i+1]);
      colors[index]=lut.searchColor(matrix[xNum-1][i].y/magnification);
      coordinates[index]=matrix[xNum-1][i];index++;


normals[index]=calcNormal(matrix[xNum-1][i+1],matrix[xNum-2][i+1],matrix[xNu
m-1][i]);
      colors[index]=lut.searchColor(matrix[xNum-1][i+1].y/magnification);
      coordinates[index]=matrix[xNum-1][i+1];index++;
    }

    TriangleStripArray tsa=new TriangleStripArray(vertexCount,
      TriangleStripArray.COORDINATES|TriangleStripArray.COLOR_3|
      TriangleStripArray.NORMALS,stripCounts);

    tsa.setCoordinates(0,coordinates);
    tsa.setColors(0,colors);
    tsa.setNormals(0,normals);

    shape3d.setGeometry(tsa);

    ここまでがTriangleStripArrayで書いたコード*/



    /*ここからTriangleArrayで書いたコード*/
    int vertexCount=(xNum-1)*(yNum-1)*6;
    int index=0;

    Point3f[] coords=new Point3f[vertexCount];
    Color3f[] colors=new Color3f[vertexCount];
    Vector3f[] normals=new Vector3f[vertexCount];
    TriangleArray ta=new TriangleArray(vertexCount,

TriangleArray.COORDINATES|TriangleArray.COLOR_3|TriangleArray.NORMALS);

    for(int i=0;i<yNum-1;i++){
      for(int j=0;j<xNum-1;j++){
        coords[index]=matrix[j][i];
        colors[index]=lut.searchColor(matrix[j][i].y,magnification);

normals[index]=calcNormal(matrix[j][i],matrix[j][i+1],matrix[j+1][i]);
        index++;

        coords[index]=matrix[j][i+1];
        colors[index]=lut.searchColor(matrix[j][i+1].y,magnification);
        normals[index]=normals[index-1];
        index++;

        coords[index]=matrix[j+1][i];
        colors[index]=lut.searchColor(matrix[j+1][i].y,magnification);
        normals[index]=normals[index-1];
        index++;

        coords[index]=matrix[j+1][i+1];
        colors[index]=lut.searchColor(matrix[j+1][i+1].y,magnification);

normals[index]=calcNormal(matrix[j+1][i+1],matrix[j+1][i],matrix[j][i+1]);
        index++;

        coords[index]=coords[index-2];
        colors[index]=colors[index-2];
        normals[index]=normals[index-1];
        index++;

        coords[index]=coords[index-4];
        colors[index]=colors[index-4];
        normals[index]=normals[index-1];
        index++;
      }
    }

    ta.setCoordinates(0,coords);
    ta.setColors(0,colors);
    ta.setNormals(0,normals);

    shape3d.setGeometry(ta);
    /*ここまでがTriangleArrayで書いたコード*/


    /*TriangleStripArrayで書くと次の3行のせいで表示されなくなります*/
    Appearance appearance=new Appearance();
    appearance.setMaterial(new Material());
    shape3d.setAppearance(appearance);
  }