通过滑块在世界空间中围绕轴 x、y、z 旋转图元

Posted

技术标签:

【中文标题】通过滑块在世界空间中围绕轴 x、y、z 旋转图元【英文标题】:primitives rotation around the axis x, y, z in World Space by slider 【发布时间】:2015-02-08 16:15:42 【问题描述】:

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

到目前为止,我正在使用此代码:

这是腐烂的对象定义:

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

【讨论】:

以上是关于通过滑块在世界空间中围绕轴 x、y、z 旋转图元的主要内容,如果未能解决你的问题,请参考以下文章

将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转

使用OpenGL在C ++中同时围绕其(x,y&z)轴旋转对象

检测旋转 CAShapeLayer 上的触摸

opengl 围绕固定轴旋转对象

如何围绕任意轴旋转一个点?

仅在绘图中围绕 z 轴旋转