Domanda

Nota: questo è nell'IDE di elaborazione

Sto cercando di ottenere l'orbita sferica e l'ho quasi preso. Questo è quello che ho finora:

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();
}

La rotazione X funziona alla grande, tuttavia la rotazione y si tuffa dall'alto verso il basso e poi torna più e più volte quando il mousey cambia, ciò di cui ho bisogno è che continui a crollare in una direzione fintanto che il mouse si muove Su e indietro nell'altra direzione mentre il mouse si muove verso il basso. Qualcuno può aiutarmi a capirlo?

È stato utile?

Soluzione

Il problema ha a che fare con il vettore per la fotocamera. Se immagini di tenere la fotocamera e avvicinarla sempre più al palo della sfera, come si tiene la fotocamera quando supera il palo? L'elaborazione sa cosa fare a causa del alzato argomento del funzione della fotocamera.

Nel tuo codice attuale, il alzato è sempre -1, il che significa che quando la fotocamera si oriente stessa, userà sempre il vettore <0, -1, 0> come riferimento per su. Devi cambiarlo in modo che quando arriva al palo della sfera, si capovolge.

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();
}

Cose notevoli:

  1. Ho aggiunto il codice da conservare Cameratheta nell'intervallo [0, 2 * pi) e Cameraphi nell'intervallo [0,01, PI - 0,01). Matematicamente, Cameraphi Dovrebbe essere nell'intervallo [0, pi), ma questo provoca uno sfarfallio ai poli. Per la matematica dietro questo, controlla qui.
  2. Cameraphi è incrementato inversamente quando Flip è vero.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top