如何在OpenGL中更改枢轴?

Posted

技术标签:

【中文标题】如何在OpenGL中更改枢轴?【英文标题】:How to change pivot in OpenGL? 【发布时间】:2018-12-13 05:20:52 【问题描述】:

我开发了 3D 应用程序。我想改变模型中心和用户位置之间的枢轴。当我切换更改枢轴选项时,3D 模型移动到某个位置。我的部分来源如下。请帮帮我。

    glm::vec2 mouse_delta = mouse_move - mouse_click;
    key_yaw = rotate_sensitivity * mouse_delta.x; 
    key_pitch = rotate_sensitivity * mouse_delta.y; 
    UpdateRotateMatrix();

    if (rotate_mode == CCamera::ROT_CENTER)
        UpdateModelMatrix();        
    else if (rotate_mode == CCamera::ROT_CLICKED)
        UpdateModelMatrix(false);

/////////////////////////////////////// /////

void CCamera::UpdateModelMatrix(const bool& bCenter)

    glm::vec3 pivot(0.0f);
    if (bCenter)
        pivot = local_position; //50.0, 50.0, 50.0
    else
        pivot = click_position; //1000.0, 1000.0, 1000.0

    glm::mat4 rotate = glm::mat4(1.0f);
    rotate = glm::translate(glm::mat4(1.0f), pivot)*rotate_matrix;
    rotate = rotate * glm::translate(glm::mat4(1.0f), -pivot);

    model_matrix = translate_matrix * rotate;


void CCamera::UpdateRotateMatrix()

    glm::quat key_quat = glm::quat(glm::vec3(key_pitch, key_yaw, key_roll));
    key_pitch = key_yaw = key_roll = 0;

    camera_quat = key_quat * camera_quat;
    camera_quat = glm::normalize(camera_quat);
    rotate_matrix = glm::mat4_cast(camera_quat);

模型中心的旋转

某个点的旋转

【问题讨论】:

【参考方案1】:

你的矩阵顺序搞砸了。

如果你想绕轴旋转,那么你必须:

glm::mat4 trans_to_pivot   = glm::translate(glm::mat4(1.0f), -pivot);
glm::mat4 trans_from_pivot = glm::translate(glm::mat4(1.0f), pivot);

glm::mat4 rotate = trans_from_pivot * rotate_matrix * trans_to_pivot;

如果你想缩放模型,你必须先做:

glm::mat4 rotate = rotate * scale_matrix;

请注意,在您的示例中,scale_matrix 介于 trans_to_pivottrans_from_pivot 之间,因此第一个平移已缩放,但第二个平移未缩放。 当然pivot 必须是缩放模型空间中的坐标,而不是模型空间中的坐标。

【讨论】:

我试图删除缩放效果以删除“scale_matrix”作为编辑我的源。当我将选项从模型中心切换到某个点(如附加图像)后旋转时,会出现我的问题。那就是模型被转移了。请再次帮助我。

以上是关于如何在OpenGL中更改枢轴?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 围绕枢轴点旋转

现代Opengl:旋转一个长方体,在长方体的一端有枢轴

如何在 UWP 中的 Pivot 中使所选枢轴的标题变为粗体?

Swift - 如何更改SCNNode对象的Pivot

如何在 OpenGL 中更改视角?

如何在 OpenGL 中更改旋转中心