[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);
}