Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ориентация объектов при импорте 3ds-файла, как умножить единичный вектор на марицу 
:(
    Опции темы
gorby
Дата 24.4.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Для импорта 3ds-файлов я использую библиотеку 3DSFTK

3DSFTK.H - 3D Studio File Toolkit for Release 3 library header 

в структуре mesh3ds есть
float3ds locmatrix[12]; /* Object orientation matrix */

Внимание вопрос.
Как мне применить эту матрицу для точки(вертекса) меша?
Я так понимаю, что мне нужно умножить единичный вектор на прямоугольную матрицу.
PM MAIL WWW Skype   Вверх
gorby
Дата 1.5.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



На одном сайте   http://www.gamedev.ru/articles/?id=40113&page=4

нашел пример кода

Код


//Совершим необходимые преобразования над вершинами объекта
        float Local[12]={0.0f};
        float x0,x1,x2;
        ifs.read((char*)&Local,sizeof(float)*12);
for(int i=0;i<nVertexs;i++)//y и z поменяны местами
        {
            //Надо сначала сдвинуть его назад, то есть на вектор
            //-offset (НЕ на offset),
            Vertexs[i].r0-=Local[9];
            Vertexs[i].r2-=Local[10];
            Vertexs[i].r1-=Local[11];
            //а потом применить матрицу поворота rotmatr
            //Матрица записана построчно
            //Не забудьте - в ней y и z тоже везде обменены местами!
            x0=Vertexs[i].r0;
            x1=Vertexs[i].r1;
            x2=Vertexs[i].r2;
            Vertexs[i].r0=Local[0]*x0+Local[2]*x1+Local[1]*x2;
            Vertexs[i].r2=Local[3]*x0+Local[5]*x1+Local[4]*x2;
            Vertexs[i].r1=Local[6]*x0+Local[8]*x1+Local[7]*x2;
        }



Применил этот фрагмент у себя в программе, но меши мои перемещаются совсем не так, как нужно.
Неужели никто не использовал эту матрицу?


PM MAIL WWW Skype   Вверх
Rickert
Дата 1.10.2009, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



gorby, что-то вы не понимаете.
Смысл таков. Есть матрица трансофрмации, которая как правило является матрицой 4х4, но один столбец фактически не нужен, поэтому там 12 необходимых реально элементов.
Итак у нас матрица 4Х3 = всего 12 элементов.
1 0 0 - i
0 1 0 - j
0 0 1 - k
0 0 0 - pos
Разбираем её геометрический смысл. i - абсцисса, j - ордината, k - аппликата, pos - позиция в системе родителя. Если не помните что такое абсцисса, ордината и аппликата, то расскажу: это три вектора, которые указывают направление осей координат x (i), y (j), z (k). Т.е. если вы нарисуете эти вектора, то увидите что это класическая xyz система (в нашем примере). pos - это положение точки отсчёта данной системы в системе координат родителя. Теперь если вы умножете свой вектор на эту матрицу, то с геометрической точки зрения вы переведёте его из глобальной системы координат в соответствующую этой матрице. Теперь посмотрите на свой код. Вы используете значения массива Local в интервале от 0 до 8. А как же оставшиеся 3 значения, которые отвечают за позицию? + у вас написано что там идёт смена координат местами - есть вероятность что вы там что-нибудь напутали. Я советую делать так: нарисовать на бумаге простой пример для самого себя, просчитать и получить верный ответ, а потом смоделировать его используя написанные вами функции - таким образом вы сможете отловить ошибку.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
gorby
Дата 19.10.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Rickert, спасибо за подсказку.
Я сейчас же проверю как это работает.
PM MAIL WWW Skype   Вверх
gorby
Дата 19.10.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Перепробовал кучу вариантов. Пока не получилось.

Код

    CVector cx(mesh->locmatrix[0], mesh->locmatrix[1], mesh->locmatrix[2]);
    CVector cy(mesh->locmatrix[3], mesh->locmatrix[4], mesh->locmatrix[5]);
    CVector cz(mesh->locmatrix[6], mesh->locmatrix[7], mesh->locmatrix[8]);

    CPoint3d p0(mesh->locmatrix[9], mesh->locmatrix[10], mesh->locmatrix[11]);

        mod_coord_ma(&p0, &cx, &cy, &cz);


Это функция преобразования координат точки

Код

void CPoint3d::mod_coord_ma(CPoint3d* p0, CVector* cx, CVector* cy, CVector* cz)
{

   double xa=cx->l*x+cy->l*y+cz->l*z+p0->x;
   double ya=cx->m*x+cy->m*y+cz->m*z+p0->y;
   double za=cx->n*x+cy->n*y+cz->n*z+p0->z;
    x=xa;
    y=ya;
    z=za;    
}


PM MAIL WWW Skype   Вверх
Rickert
Дата 20.10.2009, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



gorby, малова-то кода как-то у вас. Что за параметры "l, m, n"? Объясните логику этого умножения: что здесь происходит?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
gorby
Дата 20.10.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Rickert, спасибо Вам за внимание.
l,m,n -это направляющие косинусы вектора. Они нормализованы и определяют ориентацию вектора в пространстве.
Это Углы наклона между вектором и соответственно осью X,Y,Z.

А преобразование координат CPoint3d::mod_coord_ma я использую уже более 15 лет. Взял из справочника по высшей математике.
СК-Ситема Координат.
Логика  CPoint3d::mod_coord_ma такая. задана точка в местной СК CPoint3d 3-мя координатами X,Y,Z в местной системе координат. На вход ф-ци подается местная система координат.
Эта местная система координат задана в абсолютной СК началом координат и 3-мя векторами (CPoint3d* p0, CVector* cx, CVector* cy, CVector* cz). Вычисляются координаты точки уже в абсолютной СК.

Rickert, я буду очень благодарен, если Вы дадите Ваш код умножения ветора (точки x,y,z) на матрицу.
Итак у нас матрица 4Х3 = всего 12 элементов.
1 0 0 - i
0 1 0 - j
0 0 1 - k
0 0 0 - pos

Я перебрал уже разные варианты. Мне кажется, что у фирмы  Autodesk своя логика непонятная мне пока. 
1. менял местами оси y,z
2. менял знак для pos - позиция в системе родителя
3. и пробовал делать преобразование координат точки вместо приведеной CPoint3d::mod_coord_ma так

Код

void CPoint3d::mod_coord_am(CPoint3d* p0, CVector* cx, CVector* cy, CVector* cz)
{
 
double xm=cx->l*(x-p0->x)+cx->m*(y-p0->y)+cx->n*(z-p0->z);
double ym=cy->l*(x-p0->x)+cy->m*(y-p0->y)+cy->n*(z-p0->z);
double zm=cz->l*(x-p0->x)+cz->m*(y-p0->y)+cz->n*(z-p0->z);
    x=xm;
    y=ym;
    z=zm;   
}

PM MAIL WWW Skype   Вверх
gorby
Дата 20.10.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Нашел описание файла 3ds - http://algolist.manual.ru/graphics/3dfaq/articles/75.php
Блок:
CHUNK_TRMATRIX
Данные:

содержит матрицу перевода объекта в некое абстрактное начальное состояние; в то, что было первоначально смоделировано. Требуется для корректного отображения анимации: дело в том, что все объекты в файле хранятся по состоянию на нулевой кадр, а анимация записана по отношению к "начальным" моделям. Т.е. при отображений нулевого кадра эта матрица не нужна, а при отображении всего набора кадров надо будет сначала перевести объекты в "начальное" состояние с помощью этой самой матрицы перевода и применять все преобразования (перемещения, повороты, etc) именно к "начальным" объектам.
Формат:

float rotmatrix[3][3]; // матрица поворота
vector offset;         // смещение начального объекта
Для перевода объекта в "начальное" состояние надо сначала сдвинуть его назад, то есть на вектор -offset (НЕ на offset), а потом применить матрицу поворота rotmatr. Матрица записана построчно. Не забудьте - в ней y и z тоже везде обменены местами!

Еще раз спрашиваю.
Как применить матрицу поворота rotmatr к точке(x,y,z)?

PM MAIL WWW Skype   Вверх
Rickert
Дата 20.10.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



gorby, я не хочу вас сейчас запутать ещё больше и поэтому не стану спорить: почему y и z переставлены местами - для меня остаётся загадкой. Лучше приведу вам статью с gamedev.ru - http://www.gamedev.ru/code/articles/?id=4273
Отмечу сразу: в этой статье есть ВСЯ информация которая нужна для реализации скелетной анимации, в ней каждая строчка не просто так, там нельзя пропускать предложений и читать невдумчиво.
Говорю так, потому что сам перечитывал её по невнимательности smile 
В частности, отвечая на ваш вопрос
Цитата(gorby @  20.10.2009,  13:11 Найти цитируемый пост)
Как применить матрицу поворота rotmatr к точке(x,y,z)?

Цитирую:
Цитата
Rt=Pr-1*(Ct-Pt)
где Cr - текущая матрица поворота, Pr - "родительская" матрица поворота, Rr - матрица относительного поворота Pt - "родительский" вектор перемещения Pr-1 - обратная "родительская" матрица поворота, Rt - вектор относительного перемещения


P.S.
Сказать честно сейчас у меня все реализовано без матриц. Т.е. они у меня есть как входные данные, но я их преобразовываю в необходимые мне вектора и по ним совершаю все сдвиги вершин, потом их суммирую чтобы получить результат. Если хотите могу привести код и разъяснить. В ближайшее время буду делать рефакторинг кода и переходить на матрицы, потому что мой текущий самопальный метод затратнее по времени исполнения примерно в 16 раз. Зато свой велосЫпед, как же я их люблю smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
gorby
Дата 22.10.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Rickert, спасибо за ссылку.
Rickert, если Вы использовали в своих программах файл 3ds и матрицу mesh->locmatrix, то я буду очень благодарен, если Вы приведете свой код, преобразования координат точки(Как применить матрицу поворота rotmatr к точке).
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1679 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.