2011-09-12 3 views
1

참고 :이 내가 내려 궤도 구형 얻으려고 노력하고있는 처리 IDEY-궤도 처리 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 인수가 camera function이므로 수행 할 작업을 알고 있습니다. 현재 코드에서

upY 카메라 자체의 방향을 때, 항상 최대 에 대한 참조로 벡터 < 0, -1, 0>을 사용합니다 즉, 항상 -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(); 
} 

주목할만한 것들 - 0.01)

  1. 에서는 I의 범위는 [0, 2 * PI) 및 범위 [0.01 cameraPhi, PI를 cameraTheta를 유지하기위한 코드를 말했다. 수학적으로 cameraPhi은 [0, PI] 범위에 있어야하지만이 경우 극점이 깜박입니다. 이것의 뒤에 수학을 위해, here를 검사하십시오.
  2. 플립이 참일 때 cameraPhi이 반대로 증가합니다.