![]() |
Ответ: передвижение с помощью матриц
хранить трансформацию объекта в матрице - имхо неправильно. ИМХО, матриц нужна лишь для родительских отношений и чтобы скормить ее ГАПИ. А так - vec3 позиция, vec3 scale и кватернион на ориентацию. Если что то менялось пересчитываем локальную матрицу и матрицы всех потомков.
|
Ответ: передвижение с помощью матриц
Как я понял матрицы нужны для конечного результата, а двигать объекты надо через вектора...
Объясните простой пример: 1)загружаю модель шара("shar.x") 2)создаю матрици мира,вида,проэкции. 3)теперь чтобы передвинуть шар нужно каждую вершину передвинуть на общее/определенное значение. ДА? Так вот: Код:
|
Ответ: передвижение с помощью матриц
Вершины двигать не нужно. Важно понимать, что происходит во время рендера. Каждая вершина, которая поступает на графический конвеер, умножается на матрицу World, View и Projection. В итоге получаются экранные координаты вершины.
Чтобы переместить объект в мире тебе надо изменить матрицу World перед рендером этого объекта. Чтобы перемещать независимо несколько объектов, надо сохранять матрицу World до трансформации и восстанавливать после. Для примера, продемонстрирую процесс в OpenGL коде. В OpenGL вместо отдельных матриц World и View используется одна modelview матрица. Сути это не меняет, т.к. эта матрица является произведением world на view. Код:
// все функции трансформации работают с текущей матрицей Аналогичным образом можно независимо двигать, вращать и масштабировать несколько объектов, надо просто каждого из них обернуть в вызовы push/pop: Код:
for (int i = 0; i < OBJECT_COUNT; ++i) { |
Ответ: передвижение с помощью матриц
alcoSHoLiK Спасибо большое без тебя бы долго разбирался :)
|
Ответ: передвижение с помощью матриц
Появился еще вопрос:
Как мне сделать сдиг тела а потом поворот в локальных координатах? Делаю вот так: Код:
RotateEntity(matWorldRY,mx); Функция поворота такая: Код:
void RotateEntity(D3DXMATRIX& m,double angle) Код:
void MoveEntity(D3DXMATRIX& m,float dx,float dy,float dz) |
Ответ: передвижение с помощью матриц
Попробуй поменять местами функции MoveEntity и RotateEntity. Должно получиться
Код:
MoveEntity(matWorldPos,UP1,0,UP2); Пардон, не внимательно глянул. Вызовы MoveEntity и RotateEntity пусть остаются как есть, а вот в вызове D3DXMatrixMultiply надо поменять местами matWorldPos и matWorldRY. --- Наблюдаемый тобой эффект (поворот объект вокруг другой оси после перемещения) можно объяснить таким образом. Матрица поворота в действительности всегда поворачивает вокруг начала координат. Если объект находится в начале координат, то будет казаться, что он поворачивается вокруг своей оси. На самом деле он поворачивается вокруг оси, которая проходит через начало координат, это сразу становится заметным при смещении объекта. Как же повернуть объект вокруг своей оси? В общем случае это делается за три шага: 1) построить вектор из начала координат в центр объекта и переместить объект вдоль этого вектора так, чтобы его центр оказался в начале координат 2) повернуть объект (или систему координат -- все относительно) 3) вернуть объект на прежнее место, переместив его вдоль построенного ранее вектора в обратную сторону В твоем частном случае должно быть достаточно поменять местами порядок умножения матрицы смещения и матрицы поворота, чтобы достичь желаемого эффекта. |
Ответ: передвижение с помощью матриц
Хм... пулучилось. А раньше чето пробывал и не получалось(правда там все почти было по другму написано).Спасибо.
Цитата:
т.к у меня все получилось благодаря этому: Цитата:
|
Ответ: передвижение с помощью матриц
Цитата:
|
Часовой пояс GMT +4, время: 10:23. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot