P3D 相机方向
P3D camera orientation
我有一个大球体。有一个红点在球体周围移动。我想跟随那个红点移动到球体。所以我的相机必须随着红点移动。但有一个问题。现在,我正在经历的是展览 B 中显示的内容。我希望我的动画能够实现展览 A 中显示的观点。
这是我目前的代码。我认为这很简单。我有 3 个变量控制我的眼睛位置,我有 3 个变量控制目标位置。红点也位于目标位置。我在 x-y 中添加了 2 个平面,这有助于我在旋转时不会太困惑。
这是一个fiddle:
https://jsfiddle.net/da8nza6y/
float radius = 1000;
float view_elevation = 1500;
float target_elevation = 300;
float x_eye;
float y_eye;
float z_eye;
float x_aim;
float y_aim;
float z_aim;
float h;
float theta;
void setup() {
size(600, 600, P3D);
theta = 0;
h = 30;
}
void draw() {
theta += 0.5;
theta = theta%360;
x_eye = (radius+view_elevation)*cos(theta*PI/180);
y_eye = 0;
z_eye = (radius+view_elevation)*sin(theta*PI/180);
x_aim = (radius+target_elevation)*cos((theta+h)*PI/180);
y_aim = 0;
z_aim = (radius+target_elevation)*sin((theta+h)*PI/180);
camera(x_eye, y_eye, z_eye, x_aim, y_aim, z_aim, 0, 0, -1);
background(255);
// the red dot
pushMatrix();
translate(x_aim, y_aim, z_aim);
fill(255, 0, 0, 120);
noStroke();
sphere(10);
popMatrix();
// the big sphere
noStroke();
fill(205, 230, 255);
lights();
sphere(radius);
// the orange plane
pushMatrix();
translate(0, 0, 10);
fill(255, 180, 0, 120);
rect(-2000, -2000, 4000, 4000);
popMatrix();
// the green plane
pushMatrix();
translate(0, 0, -10);
fill(0, 180, 0, 120);
rect(-2000, -2000, 4000, 4000);
popMatrix();
}
所以问题在于,红点(其在 x-z 平面中的位置由距原点的角度 (theta+h) 和距离 (radius+target_elevation) 给出)穿过 x-y 平面,所有东西都会颠倒和倒转。
现在,我试图控制 camera()
函数中的最后 3 个变量,但我感到很困惑。该函数的文档在这里:
https://processing.org/reference/camera_.html
谁能看到这个问题的解决方案?
此外,我确定我可以旋转球体(我可以这样做)并且不会遇到这些问题,但我确定我要处理这个动画,我觉得会有一些东西使用这种方法会更容易。虽然我可能会弄错。
我相信我已经解决了我自己的问题。
在调用 camera()
函数之前,我在 draw 中添加了以下行:
if ((x_eye- x_aim) < 0) {
z_orientation = 1;
} else {
z_orientation = -1;
}
我注意到触发翻转的不是(theta+h)
,而是视图和目标的相对位置。
这是更新后的 fiddle:
我有一个大球体。有一个红点在球体周围移动。我想跟随那个红点移动到球体。所以我的相机必须随着红点移动。但有一个问题。现在,我正在经历的是展览 B 中显示的内容。我希望我的动画能够实现展览 A 中显示的观点。
这是我目前的代码。我认为这很简单。我有 3 个变量控制我的眼睛位置,我有 3 个变量控制目标位置。红点也位于目标位置。我在 x-y 中添加了 2 个平面,这有助于我在旋转时不会太困惑。
这是一个fiddle:
https://jsfiddle.net/da8nza6y/
float radius = 1000;
float view_elevation = 1500;
float target_elevation = 300;
float x_eye;
float y_eye;
float z_eye;
float x_aim;
float y_aim;
float z_aim;
float h;
float theta;
void setup() {
size(600, 600, P3D);
theta = 0;
h = 30;
}
void draw() {
theta += 0.5;
theta = theta%360;
x_eye = (radius+view_elevation)*cos(theta*PI/180);
y_eye = 0;
z_eye = (radius+view_elevation)*sin(theta*PI/180);
x_aim = (radius+target_elevation)*cos((theta+h)*PI/180);
y_aim = 0;
z_aim = (radius+target_elevation)*sin((theta+h)*PI/180);
camera(x_eye, y_eye, z_eye, x_aim, y_aim, z_aim, 0, 0, -1);
background(255);
// the red dot
pushMatrix();
translate(x_aim, y_aim, z_aim);
fill(255, 0, 0, 120);
noStroke();
sphere(10);
popMatrix();
// the big sphere
noStroke();
fill(205, 230, 255);
lights();
sphere(radius);
// the orange plane
pushMatrix();
translate(0, 0, 10);
fill(255, 180, 0, 120);
rect(-2000, -2000, 4000, 4000);
popMatrix();
// the green plane
pushMatrix();
translate(0, 0, -10);
fill(0, 180, 0, 120);
rect(-2000, -2000, 4000, 4000);
popMatrix();
}
所以问题在于,红点(其在 x-z 平面中的位置由距原点的角度 (theta+h) 和距离 (radius+target_elevation) 给出)穿过 x-y 平面,所有东西都会颠倒和倒转。
现在,我试图控制 camera()
函数中的最后 3 个变量,但我感到很困惑。该函数的文档在这里:
https://processing.org/reference/camera_.html
谁能看到这个问题的解决方案?
此外,我确定我可以旋转球体(我可以这样做)并且不会遇到这些问题,但我确定我要处理这个动画,我觉得会有一些东西使用这种方法会更容易。虽然我可能会弄错。
我相信我已经解决了我自己的问题。
在调用 camera()
函数之前,我在 draw 中添加了以下行:
if ((x_eye- x_aim) < 0) {
z_orientation = 1;
} else {
z_orientation = -1;
}
我注意到触发翻转的不是(theta+h)
,而是视图和目标的相对位置。
这是更新后的 fiddle: