基元在“世界空间”中通过滑块围绕轴x,y,z旋转

时间:2015-02-08 16:15:43

标签: c++ opengl rotation slider

原始人以世界空间为中心。我想通过滑块旋转它们,如下图所示。

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 个答案:

答案 0 :(得分:0)

您是否希望将代码发送到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