Как изменить пивот в OpenGL? - PullRequest
       49

Как изменить пивот в OpenGL?

0 голосов
/ 13 декабря 2018

Я разработал 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 Ответ

0 голосов
/ 13 декабря 2018

Порядок ваших матриц испорчен.

Если вы хотите вращаться вокруг оси, вам нужно:

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_pivot и trans_from_pivot, поэтому первый перевод масштабируется, а второй перевод не масштабируется.
Конечно, pivot должна быть координатой в масштабном модельном пространстве, а не в модельном пространстве.

...