2009-06-10 251 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) 
} 

除此之外,訥河的函數被調用在正確的地方(點擊並拖動期間)......所以真的,我沒有想法從哪裏去。我希望有人能夠幫助我,如果你想看到整個代碼庫(用C++編寫並推入QTPanel),只需發一封電子郵件給我。

感謝,

卡爾·斯維爾(卡爾在carlsverre點com)

+0

camera :: update中的「transform」矩陣究竟代表什麼? – 2009-06-10 19:31:46

+0

據我所知,變換矩陣應該代表根據arcball類所需的球體旋轉。因此,如果用戶點擊球體上的x,y,z上的一個點並將鼠標移動到x2,y2,z2,則矩陣將表示球體將x,y,z移動到x2,y2,z2所需的旋轉。 希望是有道理的。 – 2009-06-10 19:44:21

回答

2

好吧,也許我錯了,但我認爲這是發生在你的是,你是在和座標的中心旋轉和不在地球周圍(這是你想要做的)。要糾正你必須做的是:

  • 翻譯要繞(地球的中心)中心座標點,將其位置的否定的翻譯
  • 旋轉正如你所做的那樣
  • 撤銷之前完成的翻譯。

需要理解的是,旋轉是在座標中心附近完成的,如果要在某個地方旋轉,必須先將該點移動到座標中心。

希望它有幫助。