Орбита y падает сверху вниз при изменении mouseY в 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;
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 ответ
Проблема связана с вектором вверх для камеры. Если вы представляете себе, как держать камеру и подносить ее все ближе и ближе к полюсу сферы, как вы держите камеру, когда проходите мимо полюса? Обработка знает, что делать из-за аргумента upY функции камеры.
В вашем текущем коде upY всегда равен -1, что означает, что, когда камера ориентируется, она всегда будет использовать вектор <0, -1, 0>в качестве ориентира для повышения. Вы должны изменить это так, чтобы, когда он достигает полюса сферы, он переворачивался вверх ногами.
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();
}
Известные вещи:
- Я добавил код, чтобы держать cameraTheta в диапазоне [0, 2 * PI) и cameraPhi в диапазоне [0,01, PI - 0,01). Математически, cameraPhi должен быть в диапазоне [0, PI), но это вызывает мерцание полюсов. Для математики позади этого, проверьте здесь.
- cameraPhi увеличивается обратно пропорционально, когда flip имеет значение true.