орбита по оси Y падает сверху вниз при изменении mouseY в Обрабатывающей IDE - PullRequest
1 голос
/ 13 сентября 2011

ПРИМЕЧАНИЕ: это в 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 вращается сверху вниз, а затем снова и снова поднимается назад при изменении мыши, мне нужно, чтобы оно продолжало вращаться в одном направлении до тех пор, пока мышь перемещается вверх и назад в другом направлении, когда мышь перемещается вниз. Может кто-нибудь помочь мне разобраться в этом?

1 Ответ

1 голос
/ 06 декабря 2011

Проблема связана с вектором up для камеры.Если вы представляете себе, как держать камеру и подносить ее все ближе и ближе к полюсу сферы, как вы держите камеру, когда проходите мимо полюса?Обработка знает, что делать из-за аргумента 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();
}

Примечательные вещи:

  1. Я добавил код, чтобы сохранить cameraTheta в диапазоне [0, 2 * PI) и cameraPhi в диапазоне [0,01, PI - 0,01).Математически cameraPhi должно находиться в диапазоне [0, PI), но это вызывает мерцание полюсов.Для математики, стоящей за этим, проверьте здесь .
  2. cameraPhi увеличивается обратно, когда flip истинно.
...