2014-10-20 125 views
0

我正在製作粒子運動的三維模擬,我想在某些位置繪製表示電場的箭頭。 我在Blender中製作了一個箭頭網格,並將其導出爲.obj,因此我可以在我的代碼中使用它(我製作了一個.obj加載程序),但似乎無法正確旋轉它,以便它指向正確的方向,儘管我檢查了電場矢量的計算是否正確。 我也收到了一些奇怪的結果。例如,如果向量應該向上指向,它向下指向,但是當我註釋掉在x軸上旋轉的代碼時,箭頭會像預期的那樣向下指向。那麼如果它指向右側,它會向內指向(朝着負z軸),但是當我註釋掉y軸上的旋轉時,它指向右側。如何在OpenGL中繪製3D矢量?

這裏是我的代碼爲箭頭的旋轉和渲染:

void Render(Vector3 cameraPos) 
{ 
    glScalef(field.length() * ArrowLength,1.0,1.0); 
    glTranslatef(0,0,_zdefault); 
    glRotatef(Entity::yangle,0,1,0); 
    glTranslatef(pos.getX() + cameraPos.getX(), pos.getY() + cameraPos.getY(), pos.getZ() + cameraPos.getZ() - _zdefault); 

    glRotatef(atan2(field.getZ(),field.getY()) * 180/M_PI, 1.0,0.0,0.0); 
    glRotatef(atan2(field.getX(),field.getZ()) * 180/M_PI, 0.0,1.0,0.0); 
    glRotatef(atan2(field.getY(),field.getX()) * 180/M_PI, 0.0,0.0,1.0); 

    glBindTexture(GL_TEXTURE_2D,arrowTexture); 

    glCallList(arrow); 
    glLoadIdentity(); 
}; 

場是代表電場矢量。 線條

glTranslatef(0,0,_zdefault); 
glRotatef(Entity::yangle,0,1,0); 

是否有這樣我可以旋轉整個場景,有點像在攪拌機周圍的軌道。 另外,Vector3只是一個簡單的Vector類,我用非常基本的功能編寫。就像我說的,矢量計算沒有問題,我檢查了一下,我只是不能使用矢量來正確地旋轉東西。

我有一種感覺,我的角度有點搞砸了glRotatef的地方,我使用atan2,但我仍然無法理解這將如何影響旋轉,如前所述。

有沒有什麼辦法只基於矢量組件旋轉某些東西?

+0

而不是處理旋轉角度,它更容易直接構建旋轉矩陣。看到我的答案在這裏,這是同一種問題:http://stackoverflow.com/questions/24705225/opengl-rotation-from-velocity-vector/24709587#24709587。 – 2014-10-20 03:03:34

+0

你未轉換的箭頭指向什麼方向?上面的答案是原始矢量指向正z方向。應該很容易地調整它的原始箭頭,例如指向x方向。但是如果有必要,我可以寫一個新版本的答案。 – 2014-10-20 03:06:44

回答

1

首先,您應該不要使用glRotatefglTranslatef等遺留管道,並使用着色器並管理自己的矩陣。

除此之外,最好使用field作爲你的方向方向,有的可達作爲up矢量

對於旋轉整個場面你剛纔定義中心和繞所有矢量具有相同使用lookAt轉型轉換之後的轉換