![]() |
передвижение с помощью матриц
Вот столкнулся с проблемой (т.к недавно перешел на С++):
Осуществляю передвижение объектом с помощью функции: Код:
void MoveEntity(D3DXMATRIX& m,float dx,float dy,float dz) Чет мозги не варят как можно сделать передвижение разных объектов с помощью одной функции? |
Ответ: передвижение с помощью матриц
Каково причина обьявления x,y,z статиками?
|
Ответ: передвижение с помощью матриц
Цитата:
Я так понял когда объявляешь их статиками то каждый вызов функции не происходит перезапись участков памяти для переменных, а это экономия ресурсов. |
Ответ: передвижение с помощью матриц
Написал чуть модифицированную функцию но тут проблем еще больше:
Код:
void MoveEntity(D3DXMATRIX& m,float dx,float dy,float dz) |
Ответ: передвижение с помощью матриц
зачем такие извращения с внутренностями матрицы?
чем D3DXMatrixTranslation(...) не угодил? |
Ответ: передвижение с помощью матриц
были проблемы со стандартными матрицами и с углами... да и к тому же хочется понять саму матрицу научится с ней работать ..
|
Ответ: передвижение с помощью матриц
>>static
это не экономия ресурсов, компилятор умнее тебя и умеет экономить их эффективней. бегло взглянул на вторую ф-цию, вроде всё норм (ток -z вроде не надо). возможно порядок умножения где-то нарушен при установке матриц. (под "без переменных" подразумиваются нулевые значения?) |
Ответ: передвижение с помощью матриц
Цитата:
2) вторая функция не пашит именно из-за того что я проделываю операцию x = m._41 + dx; y ... ; z... ; Я даже не могу понять что происходит с камерой толи она отдаляеться далеко и поэтому я не вижу предмета, толи каким-то образом нарушаються матрици вида хз? |
Ответ: передвижение с помощью матриц
Цитата:
|
Ответ: передвижение с помощью матриц
Все разобрался оказалось даже проще:
Код:
void MoveEntity(D3DXMATRIX& m,float dx,float dy,float dz) нужно обьявлять явно матрици которые инициализированы и токо тогда все будет как надо перемещаться: НАПРИМЕР: D3DXMATRIX matWorldPos; matWorldPos._11 = 1; matWorldPos._12 = 0; matWorldPos._13 = 0; matWorldPos._14 = 0; matWorldPos._21 = 0; matWorldPos._22 = 1; matWorldPos._23 = 0; matWorldPos._24 = 0; matWorldPos._31 = 0; matWorldPos._32 = 0; matWorldPos._33 = 1; matWorldPos._34 = 0; matWorldPos._41 = 0; matWorldPos._42 = 0; matWorldPos._43 = 10; matWorldPos._44 = 1; dev->SetTransform(D3DTS_WORLD,&matWorldPos); |
Ответ: передвижение с помощью матриц
об этом тебе mr_f и сказал.
к тому же можно воспользоваться D3DXMatrixIdentity() |
Ответ: передвижение с помощью матриц
Доки не читай @ сразу пиши код.
|
Ответ: передвижение с помощью матриц
А как сделать передвижение объекта с помощью матриц в локальных координатах?
|
Ответ: передвижение с помощью матриц
может книжки почитаешь а? учебник там, по линейной математике? ну или Луну того же (там в общем-то доступно всё написано)
или доки хотя б какие-нибудь? как-то не гоже спрашивать такие вещи.. кури матрицы перехода, и, подскажу с твоими локальными преобразованиями, произвдение матриц перехода составляет комбинацию преобразований. (вроде ж математически коректно выразился xD ) Отсюда и пляши, чо на чо умножить, что бы перемещать тела в локальных СК.. а лучше книжки почитать) |
Ответ: передвижение с помощью матриц
Цитата:
|
Ответ: передвижение с помощью матриц
хранить трансформацию объекта в матрице - имхо неправильно. ИМХО, матриц нужна лишь для родительских отношений и чтобы скормить ее ГАПИ. А так - 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, время: 06:45. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot