2016-11-12 69 views
1

我想用OpenGL在可編程管道中模擬一個行星系統。假設現在我有一個行星A,其質心爲planet_A_FixedPoint,行星C的質心爲planet_C_FixedPoint。我想讓行星C繞着行星A旋轉,旋轉軸= normalize(planet_A_FixedPoint),同時繞着自己的中心旋轉,旋轉軸= (0,1,0)。我想出了下面的代碼,但它似乎沒有工作。在做自我旋轉的同時圍繞一個對象旋轉的OpenGL

glm::mat4 rotateAroundPlanetA = glm::translate(glm::mat4(), planet_A_FixedPoint) * glm::rotate(glm::mat4(), degree, normalize(planet_A_FixedPoint)) \ 
    * glm::translate(glm::mat4(), -planet_A_FixedPoint); 
planet_C_M_Matrix = rotateAroundPlanetA * planet_C_M_Matrix; 
glm::vec4 tempFixedPoint = rotateAroundPlanetA * glm::vec4(planet_C_FixedPoint, 1.0f); 
planet_C_FixedPoint = vec3(tempFixedPoint.x, tempFixedPoint.y, tempFixedPoint.z); 
glm::mat4 rotateAroundPlanetC = glm::translate(glm::mat4(), planet_C_FixedPoint) * glm::rotate(glm::mat4(), degree, vec3(0, 1, 0)) \ 
    * glm::translate(glm::mat4(), -planet_C_FixedPoint); 
planet_C_M_Matrix = rotateAroundPlanetC * planet_C_M_Matrix; 

上述碼的獲得的效果是,行星c轉動本身圍着正常化(XA,YA,ZA)軸旋轉,但它不與行星A的原點對準(XA,YA ,ZA)。

誰能告訴我我錯在哪?

+0

請發表你的真實代碼,上面的代碼片段甚至不會編譯。 – ybungalobill

+0

嗨〜我發佈了我的真實代碼。 –

回答

1

首先,如果你使用範圍運算符(:)在其他地方使用它。其次,你的代碼有預期的行爲。如果你想讓行星C與行星A的原點對齊,那麼你的旋轉軸需要是垂直平面,它包含原點C和原點A.

+0

垂直飛機是什麼意思? –

+0

對不起,我的意思是「旋轉軸需要與平面正交......」 – quazeeee

+0

但現在問題在於行星C圍繞預期軸旋轉,但以原點(0,0,0)爲中心旋轉。不是planetA(XA,YA,ZA) –