注意:这位于Processing IDE中
我正在试着让球面轨道向下运行,我几乎已经成功了。这就是我到目前为止所知道的:
float cameraTheta, cameraPhi, cameraRadius; //camera position in spherical coordinates
float camx, camy, camz;
void setup() {
size(500, 500, P3D);
background(255);
cameraRadius = 200.0f;
cameraTheta = 2.80;
cameraPhi = 2.0;
recomputeOrientation();
}
void draw() {
background(255);
lights();
mouseMotion();
camera(camx, camy, camz, 0, 0, 0, 0, -1, 0);
sphereDetail(10);
sphere(25);
}
void mouseMotion()
{
if (mousePressed) {
cameraTheta += (mouseX - pmouseX)*0.05;
cameraPhi += (mouseY - pmouseY)*0.05;
}
recomputeOrientation(); //update camera (x,y,z) based on (radius,theta,phi)
}
void recomputeOrientation()
{
camx = cameraRadius * sin(cameraTheta)*sin(cameraPhi);
camz = cameraRadius * -cos(cameraTheta)*sin(cameraPhi);
camy = cameraRadius * -cos(cameraPhi);
redraw();
}X旋转效果很好,但是y旋转是从顶部到底部翻滚,然后随着mouseY的变化一次又一次地回滚,我需要的是,只要鼠标上下移动,它就会继续在一个方向上翻滚。有人能帮我解决这个问题吗?
发布于 2011-12-06 06:10:39
该问题与摄影机的up向量有关。如果你想象拿着相机,让它越来越接近球体的极点,当你经过极点时,你如何握住相机?由于camera function的upY参数,处理知道要做什么。
在当前代码中,upY始终为-1,这意味着当摄影机确定自身方向时,它将始终使用向量<0,-1,0>作为其up的参考。您需要更改这一点,以便当它到达球体的极点时,它会颠倒过来。
boolean flip = false;
...
void draw() {
...
camera(camx, camy, camz, 0, 0, 0, 0, flip ? 1.0 : -1.0, 0);
...
}
void mouseMotion()
{
if (mousePressed) {
cameraTheta += (mouseX - pmouseX) * 0.05;
if (cameraTheta < 0) cameraTheta += 2 * PI;
else if (cameraTheta >= 2 * PI) cameraTheta -= 2 * PI;
if (flip)
cameraPhi += (mouseY - pmouseY) * 0.05;
else
cameraPhi -= (mouseY - pmouseY) * 0.05;
if (cameraPhi >= PI) {
cameraPhi = PI - 0.01;
cameraTheta += PI;
flip = !flip;
}
else if (cameraPhi <= 0) {
cameraPhi = 0.01;
cameraTheta -= PI;
flip = !flip;
}
}
recomputeOrientation();
}值得注意的事情:
https://stackoverflow.com/questions/7394600
复制相似问题