2015-02-08 60 views
0

基元以世界空間爲中心。我想通過滑塊來旋轉它們,如下圖所示。基本元素通過滑塊圍繞世界空間中的x,y,z軸旋轉

Program interface

到目前爲止,我正在使用此代碼:

這是腐對象定義:

struct rotation 
{ 
    float x = 180; 
    float y = 180; 
    float z = 180; 
} 

當用戶改變滑塊的位置執行這東西

void MyFrame::OnSliderChanged(wxScrollEvent &event) 
{ 
    //cur_sel is currently selected primitive and scene 
    switch(event.GetId()) 
    { 
    case ID_SLIDER0: //slider X 
     GLCanvas->rot[GLCanvas->cur_sel].x = event.GetPosition(); 
     break; 
    case ID_SLIDER1: //slider Y 
     GLCanvas->rot[GLCanvas->cur_sel].y = event.GetPosition(); 
     break; 
    case ID_SLIDER2: //slider Z 
     GLCanvas->rot[GLCanvas->cur_sel].z = event.GetPosition(); 
     break; 
    } 
} 

這個東西是所有的時間執行(在幀改變) :

glRotatef(rot[cur_sel].x,rot[cur_sel].x, 0.0f, 0.0f); 
glRotatef(rot[cur_sel].y,0.0f, rot[cur_sel].y, 0.0f); 
glRotatef(rot[cur_sel].z,0.0f, 0.0f, rot[cur_sel].z); 

我知道這是不好的方法,因爲有時(當我混合x,y,z位置)旋轉不正確執行。例如,當我圍繞x軸旋轉時,它看起來像繞y軸轉動。

我正在尋找適當的方法。

回答

1

你想發送你的代碼在cpp文件中,我可以看看你嗎? 小心你如何使用glRotatef。通常,您需要將角度設置爲第一個參數,然後決定旋轉軸。

所以:

glRotatef(45.f,1,0,0); //x 
glRotatef(20.f,0,1,0); //y 
glRotatef(64.f,0,0,1); //z 

您可以隨時更改旋轉的順序,或者它符合自己的需要。所以如果你想代表圍繞Y軸的旋轉爲X,那麼你需要:

glRotatef(m_y,1,0,0); //x but named y 
glRotatef(m_x,0,1,0); //y but named x 
glRotatef(m_z,0,0,1); //z