P3Dは得意じゃありませんが。
box(100,150,150)の中心をカメラの視点として固定したいのですが、box(10,15,10)の中心に注視点が固定されているようです。
なんか日本語としてよくわからないのですが。固定したいのは視点で、なぜそこで注視点の話になるのでしょう? しかも、プログラムのカメラ設定camera(camX, camY, 200, 0, 0, 0, 0, 1, 0);
からはその意図が読み取れないのですが...どの辺が「固定したい」の指定?
それはともかく。
box(10,15,10)をbox(100,150,150)内の左下奥に配置し、その隣にbox(30,50,10)を配置するにはどうするとよいのでしょうか
の方が話が先な気がします。だって、これが出来ないとbox(10,15,10)の場所が特定出来ないのですから。ところで「隣」っていろいろ考えられるけど。
boxは常に座標原点の周りに描画されるわけで、だから位置指定がなくてサイズ情報だけなんですよね。だとすればtranslateで適切な位置に原点を移動して、その位置を中心にboxを描画することになるのでは。
cameraのデフォルトがY軸正方向が上なので、「左下奥」ってどっちよ? となってしまうのですがカメラをZ軸正方向を"上"に設定してx軸は右が正、y軸は手前が正とするように見るなら、box(X,Y,Z)の-X/2,-Y/2,-Z/2が左下奥ということになるはずです。
とにかく描いてみると、こんな感じ?
Processing
1void setup(){
2 size(960,540,P3D);
3 noFill();
4}
5
6boolean once=false;
7void draw(){
8 background(255);
9 translate(width/2,height/2,0);
10//ここを基準座標としてカメラを設定後pushして保存、popして回復しながら描いていく
11 camera(
12 100/2,150/2,150/2,//カメラ位置(視点)=box(100,150,150)の中心
13 10/2,15/2,10/2,//カメラ注視点=box(100,150,150)の左下隅のbox(10,15,10)の中心
14 0,0,-1);//Z軸正方向が上
15
16 pushMatrix();
17 translate(100/2,150/2,150/2); //左下奥隅が保存した原点になるように配置
18 box(100,150,150);
19 popMatrix();
20
21 pushMatrix();
22 translate(10/2,15/2,10/2); //左下奥隅にbox(10,15,10)を配置
23 box(10,15,10);
24 popMatrix();
25
26 pushMatrix();
27 translate(10+30/2,50/2,10/2); //隣(適当に決めた)にbox(30,50,10)を配置
28 box(30,50,10);
29 popMatrix();
30}
camera()をいじるとなにか内部状態も変わっちゃうみたいで、Processingで3Dグラフィックスを扱う上での注意点 "camera()の挙動"あたりを見てみるもいろいろ難しそう...
注視点を移動してみました。
Processing
1void setup() {
2 size(960, 540, P3D);
3 textSize(8);
4 textAlign(CENTER, CENTER);
5}
6float x=10./2;
7float y=15./2;
8float z=10./2;
9
10float vx=1;
11float vy=1.3;
12float vz=0.7;
13
14boolean once=false;
15void draw() {
16 background(255);
17 translate(width/2, height/2, 0);
18 //ここを基準座標としてカメラを設定後pushして保存、popして回復しながら描いていく
19 camera(
20 100./2, 150./2, 150./2, //カメラ位置(視点)=box(100,150,150)の中心
21 x, y, z, //カメラ注視点=box(100,150,150)の左下隅のbox(10,15,10)の中心
22 0, 0, -1);//Z軸正方向が上
23
24 pushMatrix();
25 //注視点移動
26 x=x+vx;
27 y=y+vy;
28 z=z+vz;
29 if (x<0 || x>100) {
30 vx*=-1;
31 }
32 x=constrain(x, 0, 100);
33 if (y<0 || y>150) {
34 vy*=-1;
35 }
36 y=constrain(y, 0, 150);
37 if (z<0 || z>150) {
38 vz*=-1;
39 }
40 z=constrain(z, 0, 150);
41
42 translate(x, y, z); //注視点
43 noStroke();
44 fill(192);
45 sphere(3);
46 text(String.format("%.1f, %.1f, %.1f", x, y, z), 0, 5, -5);
47 popMatrix();
48
49 pushMatrix();
50 translate(100./2, 150./2, 150./2); //左下奥隅が保存した原点になるように配置
51 noFill();
52 stroke(0);
53 box(100, 150, 150);
54 popMatrix();
55
56 pushMatrix();
57 translate(10./2, 15./2, 10./2); //左下奥隅にbox(10,15,10)を配置
58 noFill();
59 stroke(0, 255, 0);
60 box(10, 15, 10);
61 popMatrix();
62
63 pushMatrix();
64 translate(10+30./2, 50./2, 10./2); //隣(適当に決めた)にbox(30,50,10)を配置
65 noFill();
66 stroke(0, 0, 255);
67 box(30, 50, 10);
68 popMatrix();
69}