Processing サンプルプログラム 5

Processing サンプルプログラム 5
2015.7.3
立方体の 3D CG
W,A,S,D,H,L のキーをそれぞれ押すと画面に描かれた立方体が回転する。
float X, Y, Z;
実数型変数 X,Y,Z を宣言する
void setup() {
size(400, 400, P3D);
noStroke();
}
実行画面のサイズを 400×400、3D モードにする
図形の線を描かないようにする
void draw() {
background(80);
translate(200, 200, -80);
rotateX(X);
rotateY(Y);
rotateZ(Z);
scale(100);
beginShape(QUADS);
fill(255, 0, 0);
vertex(-1,-1, 1); vertex(-1, 1, 1);
vertex( 1, 1, 1); vertex( 1,-1, 1);
fill(0, 255, 0);
vertex(-1,-1,-1); vertex(-1, 1,-1);
vertex( 1, 1,-1); vertex( 1,-1,-1);
fill(0, 0, 255);
vertex(-1,-1, 1); vertex( 1,-1, 1);
vertex( 1,-1,-1); vertex(-1,-1,-1);
fill(255, 255, 0);
vertex(-1, 1, 1); vertex( 1, 1, 1);
vertex( 1, 1,-1); vertex(-1, 1,-1);
fill(255, 0, 255);
vertex(-1,-1, 1); vertex(-1, 1, 1);
vertex(-1, 1,-1); vertex(-1,-1,-1);
fill(0, 255, 255);
vertex( 1,-1, 1); vertex( 1, 1, 1);
vertex( 1, 1,-1); vertex( 1,-1,-1);
endShape();
}
void keyPressed() {
if(key == 'w') X +=
if(key == 's') X -=
if(key == 'a') Y -=
if(key == 'd') Y +=
if(key == 'h') Z -=
if(key == 'l') Z +=
}
0.05;
0.05;
0.05;
0.05;
0.05;
0.05;
背景を画素値 80 で塗りつぶす
座標(200,200,-80)に原点を移動する
x 軸回りに X ラジアン回転する
y 軸回りに Y ラジアン回転する
z 軸回りに Z ラジアン回転する
80 倍に拡大する
図形の定義開始:プリミティブを四角形に設定する
塗り潰しの色を赤色(R=255,G=0,B=0)にする
4 つの頂点座標を指定して立方体の前面を定義する
塗り潰しの色を緑色(R=0,G=255,B=0)にする
4 つの頂点座標を指定して立方体の背面を定義する
塗り潰しの色を青色(R=0,G=0,B=255)にする
4 つの頂点座標を指定して立方体の上面を定義する
塗り潰しの色を黄色(R=255,G=255,B=0)にする
4 つの頂点座標を指定して立方体の底面を定義する
塗り潰しの色をマゼンダ(R=255,G=0,B=255)にする
4 つの頂点座標を指定して立方体の左面を定義する
塗り潰しの色をシアン(R=0,G=255,B=255)にする
4 つの頂点座標を指定して立方体の右面を定義する
図形の定義終了
W キーが押されたら X に 0.05 を足す
S キーが押されたら X から 0.05 を引く
A キーが押されたら Y から 0.05 を引く
D キーが押されたら Y に 0.05 を足す
H キーが押されたら Z から 0.05 を引く
L キーが押されたら Z に 0.05 を足す
光源の設定
void setup() {
size(400, 400, P3D);
noStroke();
}
void draw() {
background(0);
translate(200, 200, 0);
ambientLight(120, 120, 120);
directionalLight(255, 255, 255, -1, 1, -1);
//pointLight(255, 255, 255, 50, -50, 150);
fill(0, 180, 0);
sphere(120);
}
実行画面のサイズを 400×400、3D モードにする
図形の線を描かないようにする
背景を黒色で塗りつぶす
座標(200,200,0)に原点を移動する
環境光(R=120,G=120,B=120)を設定する
① 拡散光(平行光源:方向(-1,1,-1))を設定する
② 拡散光(点光源:座標(50,-50,150))を設定する
①と②はどちらか一方を設定すること
塗り潰しの色を緑色(R=0,G=180,B=0)にする
原点を中心に半径 120 の球を描く
鏡面反射の設定
void setup() {
size(400, 400, P3D);
noStroke();
}
実行画面のサイズを 400×400、3D モードにする
図形の線を描かないようにする
void draw() {
background(0);
translate(200, 200, 0);
ambientLight(120, 120, 120);
lightSpecular(255, 255, 255);
directionalLight(255, 255, 255, -1, 1, -1);
specular(250, 250, 250);
shininess(10.0);
fill(0, 180, 0);
sphere(120);
背景を黒色で塗りつぶす
座標(200,200,0)に原点を移動する
環境光(R=120,G=120,B=120)を設定する
光の鏡面反射の強度(R=255,G=255,B=255)を設定する
拡散光(平行光源:方向(-1,1,-1))を設定する
図形の鏡面反射の強度(R=250,G=250,B=250)を設定する
数値が大きいほど光沢が強くなる
光沢の量の設定する
数値が大きいほど光沢の面積が小さくなる
塗り潰しの色を緑色(R=0,G=180,B=0)にする
原点を中心に半径 120 の球を描く
}
テクスチャマッピング
PImage t1, t2, t3;
float X, Y, Z;
テクスチャ用の画像オブジェクト t1, t2, t3 を宣言する
実数型変数 X,Y,Z を宣言する
void setup() {
size(400, 400, P3D);
noStroke();
t1 = loadImage("texture1.jpg");
t2 = loadImage("texture2.jpg");
t3 = loadImage("texture3.jpg");
textureMode(NORMAL);
}
実行画面のサイズを 400×400、3D モードにする
図形の線を描かないようにする
画像 t1 へ画像ファイル texture1.jpg のデータを読み込む
画像 t2 へ画像ファイル texture2.jpg のデータを読み込む
画像 t3 へ画像ファイル texture3.jpg のデータを読み込む
テクスチャマッピングを正規化した座標(0~1)で指定する
void draw() {
background(0);
translate(200, 200, 0);
rotateX(X);
rotateY(Y);
rotateZ(Z);
scale(80);
背景を黒色で塗りつぶす
座標(200,200,0)に原点を移動する
x 軸回りに X ラジアン回転する
y 軸回りに Y ラジアン回転する
z 軸回りに Z ラジアン回転する
80 倍に拡大する
beginShape(QUADS);
texture(t1);
vertex(-1,-1, 1, 0,
vertex( 1, 1, 1, 1,
vertex(-1,-1,-1, 0,
vertex( 1, 1,-1, 1,
endShape();
beginShape(QUADS);
texture(t2);
vertex(-1,-1, 1, 0,
vertex( 1,-1,-1, 1,
vertex(-1, 1, 1, 0,
vertex( 1, 1,-1, 1,
endShape();
beginShape(QUADS);
texture(t3);
vertex(-1,-1, 1, 1,
vertex(-1, 1,-1, 0,
vertex( 1,-1, 1, 0,
vertex( 1, 1,-1, 1,
endShape();
0);
1);
1);
0);
1);
0);
0);
1);
0);
1);
0);
1);
vertex(-1, 1, 1,
vertex( 1,-1, 1,
vertex(-1, 1,-1,
vertex( 1,-1,-1,
vertex( 1,-1, 1,
vertex(-1,-1,-1,
vertex( 1, 1, 1,
vertex(-1, 1,-1,
vertex(-1, 1, 1,
vertex(-1,-1,-1,
vertex( 1, 1, 1,
vertex( 1,-1,-1,
0,
1,
1,
0,
1,
0,
1,
0,
1,
0,
0,
1,
1);
0);
1);
0);
1);
0);
0);
1);
1);
0);
1);
0);
図形の定義開始:プリミティブを四角形に設定する
テクスチャを画像 t1 に設定する
立方体の前面を定義する
立方体の背面を定義する
図形の定義終了
図形の定義開始
テクスチャを画像 t2 に設定する
立方体の上面を定義する
立方体の底面を定義する
図形の定義終了
図形の定義開始
テクスチャを画像 t3 に設定する
立方体の左面を定義する
立方体の右面を定義する
図形の定義終了
}
void keyPressed() {
(以下は立方体の 3D CG と同じであるため省略)