3d 随着鼠标在IDE中的变化,y形轨道从上到下翻滚

3d 随着鼠标在IDE中的变化,y形轨道从上到下翻滚,3d,camera,geometry,orbital-mechanics,processing-ide,3d,Camera,Geometry,Orbital Mechanics,Processing Ide,注意:这是在处理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; cameraThe

注意:这是在处理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旋转有点像是从上到下翻滚,然后随着鼠标的变化一次又一次地向上翻滚,我需要的是,只要鼠标在向下移动时上下移动,它就会继续朝一个方向翻滚。有人能帮我解决这个问题吗?

这个问题与相机的上方向向量有关。如果你想象拿着相机,让它越来越靠近球体的极点,当你经过极点时,你是如何拿着相机的?由于的upY参数,处理知道要做什么

在当前代码中,upY始终为-1,这意味着当相机自身定向时,它将始终使用向量作为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();
}
boolean flip=false;
...
作废提款(){
...
摄像头(camx、camy、camz、0、0、0、flip?1.0:-1.0、0);
...
}
虚空情绪()
{
如果(鼠标按下){
cameraTheta+=(mouseX-pmouseX)*0.05;
如果(cameraTheta<0)cameraTheta+=2*PI;
如果(cameraTheta>=2*PI)cameraTheta-=2*PI;
如果(翻转)
cameraPhi+=(mouseY-pmouseY)*0.05;
其他的
cameraPhi-=(mouseY-pmouseY)*0.05;
如果(cameraPhi>=PI){
cameraPhi=PI-0.01;
cameraTheta+=PI;
翻转=!翻转;
}

else if(cameraPhi问题与相机的上方向向量有关。如果您想象握住相机并使其越来越靠近球体的极点,当您经过极点时如何握住相机?处理知道该做什么,因为

在您当前的代码中,upY始终为-1,这意味着当相机自身定向时,它将始终使用向量作为向上的参考。您需要更改此设置,以便当它到达球体的极点时,它会上下翻转

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();
}
boolean flip=false;
...
作废提款(){
...
摄像头(camx、camy、camz、0、0、0、flip?1.0:-1.0、0);
...
}
虚空情绪()
{
如果(鼠标按下){
cameraTheta+=(mouseX-pmouseX)*0.05;
如果(cameraTheta<0)cameraTheta+=2*PI;
如果(cameraTheta>=2*PI)cameraTheta-=2*PI;
如果(翻转)
cameraPhi+=(mouseY-pmouseY)*0.05;
其他的
cameraPhi-=(mouseY-pmouseY)*0.05;
如果(cameraPhi>=PI){
cameraPhi=PI-0.01;
cameraTheta+=PI;
翻转=!翻转;
}
否则,如果(卡梅拉菲)