Post date: Feb 11, 2013 3:56:41 AM
カメラ座標系とスクリーン座標系にはどのような関係があるのか調べてみた。
camera(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ)という関数があるのだが、Processingではこれでカメラの位置設定をするらしい。
さて、P3Dモードではカメラの裏に物体が回った時の例外処理をしていないらしい。(この処理をクリッピングという)これを利用してカメラの原点がどこにあるのかを調べてみた。
次のプログラムは方向キーとSHIFT Spaceキーで箱をxyz方向に自由に動かすプログラムである。
int x,y,z;
void setup(){
size(640,480,P3D);
camera(width/2.0, height/2.0, (height/2.0) / tan(PI*60.0 / 360.0), width/2.0, height/2.0, 0, 0, 1, 0);
noFill();
}
void draw(){
background(255,255,255);
translate(x,y,z);
box(10);
if(keyPressed){
switch(keyCode){
case UP:y--;break;
case DOWN:y++;break;
case LEFT:x--;break;
case RIGHT:x++;break;
case SHIFT:z--;break;
}
if(key==' ')z++;
}
println("(x,y,z)=("+x+","+y+","+z+")");
println((height/2.0) / tan(PI*60.0 / 360.0));
}
このプログラムによると、(x,y,z)=(320,240,415)程度の時に表示がおかしくなることがわかった。
これはカメラの裏に物体がまたがったからである。
また、camera関数で与えられているeyeZの初期値は415.6922程度なので、camera関数の引数eyeX eyeY eyeZがカメラの位置だとわかる。