![]() |
![]() |
![]() |
ワイヤフレーム表示 | 隠面処理表示 | 隠面処理+陰影付け |
public void normal(){
normal=new double[faces.length][3];
double[] v1=new double[3];
double[] v2=new double[3];
for(int i=0;i<faces.length;i++) {
for(int j=0;j<3;j++) {
v1[j]=vertices[faces[i][0]][j]-vertices[faces[i][1]][j];
v2[j]=vertices[faces[i][0]][j]-vertices[faces[i][2]][j];
}
//外積の計算
normal[i][0]=v1[2]*v2[1]-v2[2]*v1[1];
normal[i][1]=v1[0]*v2[2]-v2[0]*v1[2];
normal[i][2]=v1[1]*v2[0]-v2[1]*v1[0];
//ノルムの計算(法線ベクトルの大きさ)
double norm=Math.sqrt(
normal[i][0]*normal[i][0]+
normal[i][1]*normal[i][1]+
normal[i][2]*normal[i][2]
);
//単位法線ベクトルの計算
for(int j=0;j<3;j++)
normal[i][j]/=norm;
}
}
public void backFaceCulling(Graphics g,Cube cube) {
g.setColor(Color.white);
g.fillRect(0, 0, screenW, screenH);
double[] p=new double[3];
for(int i=0;i<cube.faces.length;i++) {
int[] px=new int[cube.faces[i].length];
int[] py=new int[cube.faces[i].length];
for(int j=0;j<cube.faces[i].length;j++) {
p=cube.vertices[cube.faces[i][j]];
px[j]=(int)p[0];
py[j]=(int)p[1];
}
double[] n=new double[3];
//法線ベクトルの取得
n=cube.normal[i];
//視点方向ベクトルの導出
double[] vv= {
p[0]-vp[0],
p[1]-vp[1],
p[2]-vp[2],
};
//法線ベクトルと視点方向ベクトルの内積の計算
double dot=n[0]*vv[0]+n[1]*vv[1]+n[2]*vv[2];
//法線ベクトルと視点方向ベクトルの内積を使って色(明るさ)を決定
Color c=new Color(
(int)clip(dot/vp[2]*255,0,255),
(int)clip(dot/vp[2]*64,0,255),
(int)clip(dot/vp[2]*168,0,255)
);
//面が表なら描画
if(dot>0) {
g.setColor(c);
g.fillPolygon(px, py, cube.faces[i].length );
g.setColor(Color.black);
g.drawPolygon(px, py, cube.faces[i].length);
}
}
}