а векторы будут поворачиваться вокруг произвольного вектора или вокруг стандартной системы координат? Мне надо что-бы вокруг произвольного.
kroonk
Векторы будут поворачиваться самих себя, точнее два вкруг третьего, это то что тебе нужно
Только-что проверил на практике эту функцию. Всё нормально работает только если я поворачиваю X или Z вокруг Y во всех других случаях значения векторов либо переглючивает либо вообще не меняется.
kroonk
Поправил ошибки, вставил функции DirectX
// Вращает два вектора в проходящей через них плоскости D3DXVec3Rotate(D3DXVECTOR3* v1, D3DXVECTOR3* v2, float angle) { float cosa = cosa; float sina = sina; D3DXVECTOR3 w = *v1 * cosa - *v2 * sina; *v2 = *v1 * sina + *v2 * cosa; *v1 = w; } // Вращает тройку векторов вокруг выбранной оси void a::Rotate( int axis, float angle) { // почему сразу в радианах не передаешь? float ar = angle * M_PI / 180; if( axis==0) // Вращ YZ вокруг X D3DXVec3Rotate( &VecY,&VecZ,ar); else if( axis==1) // Вращ ZX вокруг Y D3DXVec3Rotate( &VecZ,&VecX,ar); else if( axis==2) // Вращ XY вокруг Z D3DXVec3Rotate( &VecX,&VecY,ar); Normalize( ); } // Нормализует тройку векторов, т.е. делает их единичной длины и взаимно перпендикулярными void a::Normalize( ) { D3DXVec3Normalize( &VecX); VecY-=VecX*D3DXVec3Dot( &VecY,&VecX); D3DXVec3Normalize( &VecY); VecZ-=( VecX*D3DXVec3Dot( &VecZ,&VecX)+VecY*D3DXVec3Dot( &VecZ,&VecY)); D3DXVec3Normalize( &VecZ); }
Aslan
> if(axis==0) // Вращ YZ вокруг X
> D3DXVec3Rotate(&VecY,&VecZ,ar);
ну херь же
Suslik
и что тебе непонятно?
D3DXVec3Rotate - моя функция, читай внимательно
Suslik
> ну херь же
зато работает.
Теперь всё поворачивается. А как по этим 3 векторам передвинуть объект? У меня 2 варианта: первый это просто прибавить к координатам объекта координаты этих трёх векторов, а второй это как-то добыть одну точку из координат трёх векторов и притянуть к ней объект только как получить эту точку?
kroonk
эти три вектора - ориентация объекта, можно двигать вдоль одного из них, например VecZ - вперед-назад (обычно так ориентируют), VecX - вправо-влево, VecY - вверх-вниз
Почему бы тебе не пользоваться движком, где все готовое уже есть?
Aslan
> и что тебе непонятно?
> D3DXVec3Rotate - моя функция, читай внимательно
понял, извиняюсь
А как правильно эти векторы в матрицу записать? я вот так делаю:
float m[9] = {Ph.VecX.x, Ph.VecY.x, Ph.VecZ.x, Ph.VecX.y, Ph.VecY.y, Ph.VecZ.y, Ph.VecX.z, Ph.VecY.z, Ph.VecZ.z}; Rot = D3DXMATRIX(m);
но когда я умножаю эту матрицу поворота на матрицу перемещения и трансформирую мир то при отрисовке объект пропадает.
kroonk
матрица нужна 4х4
векторы можно записать по строкам и по столбцам матрицы, надо знать как принято в DX
и порядок перемножения матриц тоже важен
вобщем читай руководство
Aslan
> матрица нужна 4х4
Но у меня только три трёхмерных вектора получается 3 на 3. Кстати Suslik тоже сказал что надо матрицу 3x3.
Aslan
> и порядок перемножения матриц тоже важен
я точно уверен что правильно перемножаю матрицы: умножаю матрицу поворота на матрицу перемещения, всегда работало.
Aslan
> вобщем читай руководство
оно на английском а гугл так переводит что получается набор абсолютно бессмысленных слов, сидеть 3 часа со словарём тоже как-то не охота.
Лучше сидеть 3 часа пока не помогут.
kroonk
> я точно уверен что правильно перемножаю матрицы: умножаю матрицу поворота на
> матрицу перемещения, всегда работало.
А справа или слева?
kroonk
В DX как и в OpenGL используют матрицы 4х4, почитай. Матрица 3х3 задает только ориентацию, а 4х4 - ориентацию и перенос. Получается из 3х3 припиской строки и столбца, состоящих из нулей, только угловой элемент m44=1. Ненулевые элементы в этих позициях и задают перенос и параметры перспективного преобразования (последнее тебе не нужно пока)
Вообще возьми движок какой-нить, так ты далеко не уедешь
Тема в архиве.