Делаю конвертер объекта в формат 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 формате задаются в виде одного угла и единичного вектора вокруг которого происходит поворот. Как сделать это преобразование, с чего начать и в какой области копаться?
Имхо в общем случае не получится - вращение вокруг единичного вектора (направления) это одна вращательная степень свободы. Твёрдое тело в трёхмерном пространстве имеет три поступательных и две вращательных степени свободы, потому в сферических координатах два взаимоперпендикулярных направляющих вектора и два отсчитываемых от них угла Т.е. три поворота - это конечно расточительная избыточность и их можно свести к двум - вокруг Y (угол Тетта) и вокруг Z (угол Фи), но к одному - уже маловато будет ) так и в glRotate тоже самое или в 3DS есть какое-то ограничение на количество таких поворотов?
Просто очень мало информации по 3DS структуре файла нашел, попробую дабавить может прокатит =) -----спустя 30 минут----- ((( Не прокатило... Как я посмотрел сам 3DSMAX выходит из ситуции тем, что вычесляет какой-то вектор поворота, и умножает еще на матрицу поворота... Что именно он делает я не понял... Буду рыть инфу...
AlexBond Нафик тебе сдался 3DS, устаревшая проприетарщина. Autodesk на него сама давно забила, и из-за его неполной документированности косяки обеспечены. Если нужен формат сцены, то обрати взор на FBX.
Я так понял речь идёт о статической картинке, а не об анимации? Тогда зачем вообще писать в файл вращение? можно же сразу сделать все преобразования и сохранить уже повёрнутый массив вершин.
Нужен, потому как мой редактор формата *.xom имеет свое собственное представление (не мной предуманое), я же делаю для него экспорт в 3D модель, формат 3ds выбрал потому как он ХОТЬ и старый, но популярный, и почти все конвертеры его поддерживают. Да и не такой уж он сложных. Речь идет о Сцене(Карте из игры) в которой имеется дерево объектов, каждый объект имеет положение(пространство,матрицу, позицию) зависящую от своего предка. Для построения иерархии и понадобился фрагмент анимации. Так же 3ds нужен для дальшейшего экспорта в другие фортамы, те конвертеры, поддерживают только 3ds формат. 3DS формат полностью удовлетворяет моим требованиям, тока вот проблема с углом ((((. И вообще вопрос не про формат, а про преобразование углов. Невозможным быть это не может, т.к. 3dsmax делает это без проблем.
Дык естественно задать некую ось вращения и повернуть вокруг неё объект не только возможно, но и при определённом выборе оси это будет эффектно выглядеть, но это частный случай не охватавающий всех возможных поворотов... (в отличие от двухуглового случая а-ля сферические координаты), а посему невозможен не сам поворот, а взаимнооднозначное соотвествие между 2х поворотным случаем и этим. Хотя обратное возможно - одиночный поворот можно запросто разложить хоть на 2, хоть на 3 вращения вокруг оргтогональных осей, да ещё и не одним способом.
AlexBond Ну если для тебя проблема только с углом, тогда дерзай. Хочешь кривое - пользуй, твоё дело, только потом не удивляйся. Для FBX есть нормальное сдк, открытый, современный и поддерживается хорошо. Погугли углы эйлера в кватернион. Или можно так: Перемножаешь матрицы отдельных вращений, извлекаешь из результирующей матрицы вектор направления, находишь угол между ним и первоначальным, с помощью скалярного произведения, а ось вращения векторным.
AlexBond obj формат попроще и его тоже понимают все. Конвертеры туда и обратно в ряд форматов (3ds включительно) на питоне входят в поставку блендера. Где то у меня были две либы. Читают 3ds они точно (вроде даже где-то тут ссылку давал), а вот пишут-ли - не помню. Щас попробую поискать. Нашел. http://wasm.ru/forum/viewtopic.php?pid=237490#p237490
Да точно - это как ни странно сработает Или что тоже самое взять одну из вершин до и после серии вращений и рассмотреть треугольник ОAA', где О - центр вращения, А и А' вершина до и после серии разных вращений.
_basmp_ Конечно obj проще, формат текстовый, да и материалы там идут отдельно. Иерархия не поддерживается, вот это меня и не устраивает. Если делать на obj то придется все матричные преобразования произвести перед записью в файл, а если так делать, то я и простым 3ds могу воспользоваться. Я же хочу иерархию сделать, чтобы каждый объект находился относительно своего предка. Booster Мне нравится эта идея! Я уже гуглил, но неосилил =). Ну ничего еще чуток помедицирую над этим делом, может че и выйдет. Сейчас проанализирую как в 3ds сохраняет 3dsmax, должно что-то выйти, логика она везде есть =)
Проанализировал... Оказывается 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, в отличии от первого, но нельзя будет выделять отдельный объект. Все же попытаюсь решить нерешимую задачу (...пока хватит сил) =)
Дык как уже выше выяснилось решение не только есть но оно ещё и элементарно реализуемое Всего навсего и нужно взять два вектора от центра вращения объекта до одной из вершин до и после серии вращений (их может быть сколько угодно не только 3), тогда векторное произведение этих векторов даст искомый вектор вокруг которого вращать (v.x,v.y,v.z), а из скалярного произведения легко найдётся угол между ними (v.alpha). И всё. Вращать можно перемножением матриц, (как советует Booster), а можно поручить это glRotate, и взять готовый результат.
Y_Mur Ну да, только получается в итоге не то, что требовалось =) После наглядных попыток сделать это, я понял что все-таки это нериально. Даже сделал анимацию по этому поводу: Как видно такой поворот хорош для вектора, но никак не для объектво, т.к. объект будет состоять из множество таких векторов, у каждого из которых будет свой поворот.... Окончательный ответ на Rotate(alpha,beta,gama) -> Rotate(v.alpha,v.x,v.y,v.z) - Нельзя!!!!
Понятненько - а то я уже было почти усомнился в современной физике, утверждающей что вращательных степеней свободы две, а не одна...