Матрица поворота в заданый вектор. OpenGL

Тема в разделе "WASM.OpenGL", создана пользователем AlexBond, 16 июн 2008.

  1. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Задача следующая, имеется заданый вектор A, в определенном пространстве M,
    нужно повернуть объект так, чтобы начальный вектор B этого объекта совпадал с заданым.

    Чем можно это реализовать и каким образом?

    Для примера приведу следующий код:
    Код (Text):
    1. glMatrixMode(GL_MODELVIEW);
    2. glLoadIdentity();
    3. ...
    4.  glLoadMatrixf(@SimpleMatrix); // определенное пространство М
    5. // берем вектор A из центра, текущей матрици в заданую точку.
    6. ...
    7.   glPushMatrix;
    8. // Тут надо реализовать поворот текущей матрици так,
    9. // чтобы ось круга (текущая ось Z) проходила через заданый вектор А.
    10.  oglCircle(100);
    11.   glPopMatrix;
    Все что я смог придумать это использовать glRotate, а именно надо повернуть текущую матрицу на угол между векторами A и B через вектор оси угла между векторами, а вот как найти этот вектор, я не знаю...
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Координаты вектора для поворота вокруг него: y1*z2-y2*z1, x2*z1-x1*z2, x1*y2-x2*y1
    Находится из векторного произведения двух исходных векторов.
    Соответственно угол, на который нужно повернуть находится из скалярного произведения векторов:
    a*b=|a|*|b|*cos(theta)
    theta=arccos((x1*x2+y1*y2+z1*z2)/(sqrt(x1^2+y1^2+z1^2)*sqrt(x2^2+y2^2+z2^2)))
     
  3. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Вот тут выдвигают пару идей.
    http://www.devmaster.net/forums/showthread.php?t=10085
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Задача имеет бесконечное количество решений. После совмещения векторов остается еще одна степень свободы - векторы можно вертеть вокруг своей оси.
     
  5. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    KeSqueer Спасибо! Способ заработал, только почему-то угол theta должен быть отрицательный.

    _DEN_ т.к. в моем случаи окружность, степень свободы не влияет на отображение, и вращение вектора вокруг своей оси, для окружности, не заметно.
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    glRotate вращает против часовой стрелки. Возможно, нужно поменять знак у вектора, вокруг которого идет поворот.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    По сути нужно найти матрицу перехода от вектора A к B. Строим матрицы M_A и M_B, в которых компоненты dir соотвественно векторы A и B.
    M_A * M_T = M_B.
    M_B * (обратная(M_A)) = M_T.

    Или строим кватернион, а из него получаем матрицу.