Rotate(alpha,beta,gama) -> Rotate(v.alpha,v.x,v.y,v.z)

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

  1. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Делаю конвертер объекта в формат 3DS.

    Имеются данные о повороте Rot:
    glRotatef(Rot.Z, 0, 0, 1);//Z
    glRotatef(Rot.Y, 0, 1, 0);//y
    glRotatef(Rot.X, 1, 0, 0);//X

    Необходимо из них получить вектор и угол поворота, чтобы получилось:
    glRotatef(v.Alpha,v.X,v.Y,v.Z);

    Преобразования должны быть идентичными.

    Данные для поворота с 3DS формате задаются в виде одного угла и единичного вектора вокруг которого происходит поворот.

    Как сделать это преобразование, с чего начать и в какой области копаться?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Имхо в общем случае не получится - вращение вокруг единичного вектора (направления) это одна вращательная степень свободы. Твёрдое тело в трёхмерном пространстве имеет три поступательных и две вращательных степени свободы, потому в сферических координатах два взаимоперпендикулярных направляющих вектора и два отсчитываемых от них угла ;)
    Т.е. три поворота - это конечно расточительная избыточность и их можно свести к двум - вокруг Y (угол Тетта) и вокруг Z (угол Фи), но к одному - уже маловато будет ;))

    так и в glRotate тоже самое ;) или в 3DS есть какое-то ограничение на количество таких поворотов?
     
  3. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Просто очень мало информации по 3DS структуре файла нашел, попробую дабавить может прокатит =)

    -----спустя 30 минут-----
    ((( Не прокатило... Как я посмотрел сам 3DSMAX выходит из ситуции тем, что вычесляет какой-то вектор поворота, и умножает еще на матрицу поворота...
    Что именно он делает я не понял...
    Буду рыть инфу...
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    AlexBond
    Нафик тебе сдался 3DS, устаревшая проприетарщина. Autodesk на него сама давно забила, и из-за его неполной документированности косяки обеспечены. Если нужен формат сцены, то обрати взор на FBX.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Я так понял речь идёт о статической картинке, а не об анимации?
    Тогда зачем вообще писать в файл вращение? можно же сразу сделать все преобразования и сохранить уже повёрнутый массив вершин.
     
  6. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Нужен, потому как мой редактор формата *.xom имеет свое собственное представление (не мной предуманое), я же делаю для него экспорт в 3D модель, формат 3ds выбрал потому как он ХОТЬ и старый, но популярный, и почти все конвертеры его поддерживают. Да и не такой уж он сложных.

    Речь идет о Сцене(Карте из игры) в которой имеется дерево объектов, каждый объект имеет положение(пространство,матрицу, позицию) зависящую от своего предка. Для построения иерархии и понадобился фрагмент анимации.

    Так же 3ds нужен для дальшейшего экспорта в другие фортамы, те конвертеры, поддерживают только 3ds формат.

    3DS формат полностью удовлетворяет моим требованиям, тока вот проблема с углом ((((.

    И вообще вопрос не про формат, а про преобразование углов. Невозможным быть это не может, т.к. 3dsmax делает это без проблем.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Дык естественно задать некую ось вращения и повернуть вокруг неё объект не только возможно, но и при определённом выборе оси это будет эффектно выглядеть, но это частный случай не охватавающий всех возможных поворотов... (в отличие от двухуглового случая а-ля сферические координаты), а посему невозможен не сам поворот, а взаимнооднозначное соотвествие между 2х поворотным случаем и этим.
    Хотя обратное возможно - одиночный поворот можно запросто разложить хоть на 2, хоть на 3 вращения вокруг оргтогональных осей, да ещё и не одним способом.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    AlexBond
    Ну если для тебя проблема только с углом, тогда дерзай. Хочешь кривое - пользуй, твоё дело, только потом не удивляйся. Для FBX есть нормальное сдк, открытый, современный и поддерживается хорошо.

    Погугли углы эйлера в кватернион.

    Или можно так: Перемножаешь матрицы отдельных вращений, извлекаешь из результирующей матрицы вектор направления, находишь угол между ним и первоначальным, с помощью скалярного произведения, а ось вращения векторным.
     
  9. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    AlexBond
    obj формат попроще и его тоже понимают все. Конвертеры туда и обратно в ряд форматов (3ds включительно) на питоне входят в поставку блендера. Где то у меня были две либы. Читают 3ds они точно (вроде даже где-то тут ссылку давал), а вот пишут-ли - не помню. Щас попробую поискать. Нашел. http://wasm.ru/forum/viewtopic.php?pid=237490#p237490
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Да точно - это как ни странно сработает ;)
    Или что тоже самое взять одну из вершин до и после серии вращений и рассмотреть треугольник ОAA', где О - центр вращения, А и А' вершина до и после серии разных вращений.
     
  11. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    _basmp_
    Конечно obj проще, формат текстовый, да и материалы там идут отдельно. Иерархия не поддерживается, вот это меня и не устраивает. Если делать на obj то придется все матричные преобразования произвести перед записью в файл, а если так делать, то я и простым 3ds могу воспользоваться. Я же хочу иерархию сделать, чтобы каждый объект находился относительно своего предка.

    Booster
    Мне нравится эта идея! Я уже гуглил, но неосилил =). Ну ничего еще чуток помедицирую над этим делом, может че и выйдет.
    Сейчас проанализирую как в 3ds сохраняет 3dsmax, должно что-то выйти, логика она везде есть =)
     
  12. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Проанализировал... Оказывается 3dsMax поступает умным делом, она умножает все вертексы на матрицу преобразования перед сохранением, сохраняет обратную матрицу трансформации, и трансформацию кадра %). Таким образом файл экспортируемый от 3dsMax одинаково читается везде, поддерживается ли там анимация или нет.
    Если я правильно проанализировал, то:
    Если вывод без информации о кадре, то выводятся все объекты в мировых координатах.
    Если же считывается информация о кадрах, то объект умножается на матрицу преобразований(получаются оригинальные координаты, т.к. объект уже умножен на обратную матрицу преобразований), и на трансформацию.

    Нашел три способа решения проблемы:
    1. Создать виртуальные объекты (Dummy) AxisX, AxisY, AxisZ. Которые добавлять в дерево и c каждым производить необходимые повороты.
    AxisZ = (Rot.Z, 0, 0, 1);//Z
    AxisY = (Rot.Y, 0, 1, 0);//y
    AxisX = (Rot.X, 1, 0, 0);//X
    2. Пойти простым путем (отказаться от иерархии) и перед сохранением вертексов, умнажать их на матрицу преобразования, чтобы результат был в мировых координатах.

    3. Решить задачу Rotate(alpha,beta,gama) -> Rotate(v.alpha,v.x,v.y,v.z) , которая не имеет решений =)

    Для первого метода, размер 3ds будет меньше, чем для второго, т.к. хранить нужно лишь данные(вертексы) для объекта, а при открытии файла, объекты будут копироваться и перемещаться в нужное место (в дереве хранится лишь ссылка на объект). Удобен для редактирования, позволяет выделять объект.

    При втором методе. Нужно будет сохранять все объекты, т.к. в силу умножения вертексов на матрицу они будут различными. Этот формат будет одинакого открываться везде, где поддерживается 3ds, в отличии от первого, но нельзя будет выделять отдельный объект.

    Все же попытаюсь решить нерешимую задачу (...пока хватит сил) =)
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Дык как уже выше выяснилось решение не только есть но оно ещё и элементарно реализуемое ;)
    Всего навсего и нужно взять два вектора от центра вращения объекта до одной из вершин до и после серии вращений (их может быть сколько угодно не только 3), тогда векторное произведение этих векторов даст искомый вектор вокруг которого вращать (v.x,v.y,v.z), а из скалярного произведения легко найдётся угол между ними (v.alpha). И всё. Вращать можно перемножением матриц, (как советует Booster), а можно поручить это glRotate, и взять готовый результат.
     
  14. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Y_Mur
    Ну да, только получается в итоге не то, что требовалось =)
    После наглядных попыток сделать это, я понял что все-таки это нериально. Даже сделал анимацию по этому поводу:
    [​IMG]

    Как видно такой поворот хорош для вектора, но никак не для объектво, т.к. объект будет состоять из множество таких векторов, у каждого из которых будет свой поворот....

    Окончательный ответ на Rotate(alpha,beta,gama) -> Rotate(v.alpha,v.x,v.y,v.z) - Нельзя!!!!
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Понятненько - а то я уже было почти усомнился в современной физике, утверждающей что вращательных степеней свободы две, а не одна...