2009-06-10 4 views
2

저는 간단한 동작과 Arcball 인터페이스와 같은 아이디어를 구현하는 OpenGL 씬을 생성해야했습니다. 내가 가지고있는 문제는 NeHe의 Arcball 클래스 (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=48)가 계산하는 회전 행렬을 다루는 것입니다.OpenGL 회전 행렬과 ArcBall

내가 지금까지 가지고있는 것은 매우 멋진 태양계 (지구, 달, 태양)입니다. 내가 원하는 것은 카메라가 사용자가 원하는 행성을 클릭 (원하는 곳을 클릭)하고 마우스 드래그 (arcball)를 사용하여 고정 된 거리에서 행성을 중심으로 회전 할 수 있도록하는 것입니다. 앞서 말한 것처럼 NeHe의 클래스는 마우스 클릭 및 드래그를 기반으로 회전 행렬을 생성합니다. 행렬을 적용 할 카메라 위치입니다. 그러나, 내가 할 때 내 카메라는 행성 주위를 돌지 않고 단지 흔들 리기 만합니다. 그래서 저는 제가 한 걸음도 놓치고 있거나 내가하려고하는 것을 끔찍하게 이해하고 있다고 생각합니다. 여기

내 카메라 클래스의 일부 코드에 위기입니다 : 그 외
// transform is the matrix from NeHe's arcball interface 
void camera::update(Matrix4fT transform) { 
    glm::mat4 transform_m = glm::mat4(0.0f); 

    // convert nehe's matrices to GLM matrix 
    for(int i=0; i < 4; i++) 
     for(int j=0; j < 4; j++) 
      transform_m[i][j] = transform.M[i*4+j]; 

    // apply matrix to the position 
    glm::vec4 pos4 = glm::vec4(this->pos, 1.0f); 
    pos4 = transform_m * pos4; 

    this->pos = glm::vec3(pos4); 
} 

void camera::apply(planet *target) { 
    // called at the beginning of GLPaint 
    gluLookAt(this->pos.x,this->pos.y,this->pos.z,  // cam->position 
       target->pos.x,target->pos.y,target->pos.z, // moving 
       this->up.x,this->up.y,this->up.z);   // (0,1,0) 
} 

은 NeHe의 기능은 (클릭 및 드래그 동안) 적절한 장소에서라고

... 그래서 정말, 나는 어떤이 없습니다 아이디어는 여기에서 어디로 가야하는지. 나는 누군가가 이것으로 나를 도울 수 있기를 바랄 뿐이다. 전체 코드베이스 (C++로 프로그래밍되고 QTPanel에 푸시 된)를보고 싶다면 나에게 이메일을 보낸다.

감사합니다,

칼 Sverre (carlsverre 닷컴에서 칼)

+0

camera :: update의 "변환"행렬은 정확히 무엇을 나타내는가? –

+0

제가 이해하는 한, 변환 행렬은 arcball 클래스에 따라 구의 필요한 회전을 나타내야합니다. 따라서 사용자가 구의 x, y, z에서 한 점을 클릭하고 마우스를 x2, y2, z2로 이동하면 행렬은 x, y, z를 x2, y2, z2로 이동시키는 데 필요한 구의 회전을 나타냅니다. 희망이 있습니다. –

답변

2

글쎄, 어쩌면 내가 잘못,하지만 난 그 당신에게 무슨 일이 일어나고 생각하는 것은 당신이 좌표의 중심 주위를 회전하고 있다는 것입니다 및 행성 주위가 아닙니다 (그것이 당신이하고 싶은 것입니다). 당신이해야 할 일이 문제를 해결하려면 것은 :

  • , 당신은 좌표의 중심 (행성의 중심) 주위를 회전 할 지점을 번역 위치의 부정의 번역을 적용
  • 회전 당신이하고있는 것처럼
  • 이전에 수행 한 번역을 취소하십시오.

좌표의 중심을 중심으로 회전이 이루어지며, 다른 곳에서 회전하려는 경우 먼저 해당 점을 좌표의 중심으로 이동해야합니다.

도움이 되길 바랍니다.

+0

답변 해 주셔서 감사합니다. 당신이 이렇게 말한 것을 구현하려고했습니다 : http://2dsquid.pastebin.com/m510b0130 불행히도 그것은 작동하지 않았고, 내 카메라가 내 행성에서 날아가서 전체 장면이 절정에 다다를 때까지 결과를 얻지 못했습니다. 곱셈에서 순서가 잘못되었을 수도 있습니다 ... 어떤 제안이 있습니까? –

+0

그래서 줌아웃 문제를 알아 냈습니다 (회전 행렬은 구가 0,0,0으로 계산되어 1을 여러 번 변환했습니다) ... 이제 카메라가 회전하는 것 외에는 행성 주위를 회전합니다 그리고 내가 왼쪽으로 잠시 회전 한 다음 오른쪽으로 회전하려고하면 "정상화"된 다음 오른쪽으로 회전하기 시작할 때까지 왼쪽으로 회전을 계속합니다.그리고 어떤 위/아래 움직임은 그것을 모두 엉망으로 만듭니다. 어떤 아이디어? –

+0

회전 속도가 너무 빠르면 곱셈 매개 변수를 구성하여 속도가 느려지도록 구성해야합니다. 매개 변수를 얻는 방법을 정확히 모르지만 원하는 효과를 얻으려면 값을 "사용"해야합니다 . –