6. カメラ(processing 3D入門)

このページではカメラを設置して、空間の見え方を設定します。
技術的な用語では、透視法射影といいます。

標準のカメラ

標準のカメラはcamera()を使います。
視点と中心点、天地がどの方向か(通常はYが天)、を指定します。

camera(視点X, 視点Y, 視点Z, 中心点X, 中心点Y, 中心点Z, 天地X, 天地Y, 天地Z);

10_6_15__3_24_AM

コードは以下の通りになります。いろいろcamera関数の中の値を変えて、試してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void setup() {
  size(400, 300, P3D);
  noFill();
  stroke(0);
}
 
void draw() {
  background(255);
 
  pushMatrix(); 
  translate(width/2, height/2, 0);  //基準点を画面中央。z軸方向には-100
 
  camera(90.0, -100.0, 300.0, // 視点X, 視点Y, 視点Z
         0.0, 0.0, 0.0, // 中心点X, 中心点Y, 中心点Z
         0.0, 1.0, 0.0); // 天地X, 天地Y, 天地Z
 
  box(150);
  popMatrix();
}

ortho()

パースペクティブ(遠近)がつかない立体になります。

10_6_15__3_38_AM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void setup() {
  size(400, 300, P3D);
  noFill();
  stroke(0);
 
  //orthofrustum(左、右、下、上、近い面までの距離、遠い面までの距離);
  ortho(0, width, 0, height);
}
 
void draw() {
  background(255);
 
  pushMatrix(); 
  translate(width/2, height/2, 0);  //基準点を画面中央。z軸方向には-100
  rotateX(radians(-20));
  rotateY(radians(-20));
  box(150);
  popMatrix();
}

frustum()

以下のサンプルのように、パースペクティブが付いた空間になります。

10_6_15__3_28_AM

ここでは、frustum()を使います。この関数は、

1
frustum(左、右、下、上、近い面までの距離、遠い面までの距離)

という形で使います。図解すると以下の通りになります。

image61
OpenGL Programming Guideより引用
http://www.glprogramming.com/red/chapter03.html#name3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void setup() {
  size(400, 300, P3D);
  noFill();
  stroke(0);
 
  float fov = radians(45);  //視野角
 
  //perspective(視野角、縦横の比率、近い面までの距離、遠い面までの距離) 
  perspective(fov, float(width)/float(height), 1.0, 600.0);
}
 
void draw() {
  background(255);
 
  pushMatrix(); 
  translate(width/2, height/2, -100);  //基準点を画面中央。z軸方向には-100
  rotateX(radians(-20));
  box(150);
  popMatrix();
}

perspective()

perspective()は、frustum()とほぼ同じ機能と考えていいのですが、視野角(fov)を設定できるのが特徴です。下図ではfovyとなっていますが、processingではfov(x座標の視野角)になります。

image62
OpenGL Programming Guideより引用
http://www.glprogramming.com/red/chapter03.html#name3

10_6_15__3_17_AM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void setup() {
  size(400, 300, P3D);
  noFill();
  stroke(0);
 
  float fov = radians(45);  //視野角
 
  //perspective(視野角、縦横の比率、近い面までの距離、遠い面までの距離) 
  perspective(fov, float(width)/float(height), 1.0, 600.0);
}
 
void draw() {
  background(255);
 
  pushMatrix(); 
  translate(width/2, height/2, -100);  //基準点を画面中央。z軸方向には-100
  rotateX(radians(-20));
  box(150);
  popMatrix();
}