Конференция "Игры" » DirectX SetTransform
 
  • Ни понял... (18.05.08 10:53) [0]
    Никак не пойму что делает эта процедура.
    Она выставляет матрицу трансформации, или добавляет трансформацию к уже установленной???

    Тоесть есть у меня три матрицы:
    M1,M2,M3

    Я вызываю три раза SetTransform

    SetTransform(M1);
    SetTransform(M2);
    SetTransform(M3);

    На выходе что?
    Трансформация с учетом все трех матриц или только последней?
  • имя (18.05.08 13:22) [1]
    Удалено модератором
    Примечание: мат
  • Elec3C © (18.05.08 22:51) [2]
    Удалено модератором
    Примечание: и не цитируем
  • @!!ex © (19.05.08 07:25) [3]
    > [2] Elec3C ©   (18.05.08 22:51)

    Гхм. Смешно. :)
  • @!!ex © (19.05.08 07:29) [4]
    Знаешь, сколько нужно команд в OGL, чтобы повернуть мировую матрицу?
    ОДна?
    glRotate.

    Причем вращение идет не вокруг какой то из фиксированных осей, а вокруг указанной оси!
    Поэтому работа с кватернионами очень легко реализуется.

    Можешь привести DX код вращения на 15 градусов вокруг оси 0.75,0.4,1?
    На gl это так:
    glRotate(15,0.75,0.4,1);
  • МистерТ (19.05.08 12:25) [5]
    > glRotate(15,0.75,0.4,1);
    угу, вот только после этого надо не забыть вернуть все обратно
    glRotate(-15,0.75,0.4,1);
    а то получится забавный эффект :)

    > Поэтому работа с кватернионами очень легко реализуется.
    D3DXQUATERNION ?

    > Причем вращение идет не вокруг какой то из фиксированных
    > осей, а вокруг указанной оси!

    D3DXQuaternionRotationAxis или D3DXQuaternionRotationYawPitchRoll ?

    > Можешь привести DX код вращения на 15 градусов вокруг оси
    > 0.75,0.4,1?

    C++
    D3DXQUATERNION l_quat;
    D3DXMATRIX l_mat;
    D3DXVECTOR3 l_vec = (0.75, 0.4, 1);
    D3DXMatrixRotationQuaternion(&l_mat, D3DXQuaternionRotationAxis(&l_quat, &l_vec, 0.262 /* ~15 градусов */));
    pDevice9->SetTransform(D3DTS_WORLD, &l_mat);



    З.Ы. только холивара не разводите!
  • @!!ex © (19.05.08 12:33) [6]
    > > glRotate(15,0.75,0.4,1);
    > угу, вот только после этого надо не забыть вернуть все обратно
    > glRotate(-15,0.75,0.4,1);
    > а то получится забавный эффект :)

    Вот чтобы забавных эффектов не было, есть стэк матриц glPushMatrix/glPopMatrix.

    > D3DXQUATERNION l_quat;
    > D3DXMATRIX l_mat;
    > D3DXVECTOR3 l_vec = (0.75, 0.4, 1);
    > D3DXMatrixRotationQuaternion(&l_mat, D3DXQuaternionRotationAxis(&l_quat,
    > &l_vec, 0.262 /* ~15 градусов */));
    > pDevice9->SetTransform(D3DTS_WORLD, &l_mat);

    Ага. Только надо еще помнить, что до этого какие то трансформации проводились, и хорошо бы их не стирать.
    Поэтому добавится еще получение текущей матрицы, и умножение ее на нашу трансформацию.
    И все это против одной команды OGLя. :)

    Я ничего против DX не имею(на самом деле много чего имею, но это к данному случаю не относится).
    Некоторые вещи там сделаны действительно удобно. Матрицы к этим вещам не относятся.
  • МистерТ (19.05.08 12:53) [7]
    > Ага. Только надо еще помнить, что до этого какие то трансформации
    > проводились, и хорошо бы их не стирать.
    > Поэтому добавится еще получение текущей матрицы, и умножение
    > ее на нашу трансформацию.

    Вот поэтому обычно на DX так не делают.
    Там хранят для каждого объекта свою матрицу, включающую все преобразования "родителей". Речь ведь о скелетной анимации шла, я правильно понял?

    > Вот чтобы забавных эффектов не было, есть стэк матриц glPushMatrix/glPopMatrix.
    Вот именно. Что бы добиться одинаковых результатов на DX и OGL будет в любом случае не одна строка, как ты пытаешься показать.

    > Некоторые вещи там сделаны действительно удобно. Матрицы
    > к этим вещам не относятся.

    Матрицы просто вынесены из контекста "графического API". При желании вообще можно написать свою собственную библиотеку по работе с матрицами. Это не плюс и не минус, так просто есть.
  • @!!ex © (19.05.08 13:53) [8]
    > Вот поэтому обычно на DX так не делают.
    > Там хранят для каждого объекта свою матрицу, включающую
    > все преобразования "родителей". Речь ведь о скелетной анимации
    > шла, я правильно понял?

    Нет. Об анимации трансформации. Ну суть таже.


    > Вот именно. Что бы добиться одинаковых результатов на DX
    > и OGL будет в любом случае не одна строка, как ты пытаешься
    > показать.

    Вращение - ОДНА операция. Стэк - это уже совсем из другого села. Я о нем вообще о нем вспомнил только из за вашего "то получится забавный эффект "


    > Матрицы просто вынесены из контекста "графического API".
    > При желании вообще можно написать свою собственную библиотеку
    > по работе с матрицами.

    Собственно уже. :))


    > Это не плюс и не минус, так просто есть.

    В [1] высказывание что называется "в сердцах".
    Не заявляющее о том, что DX - отстой, как и не говорящее об обратном.
    Просто как факт: в GL более продуманные средства работы с матрицами.
    Да можно тоже самое сделать и на DX, просто надо писать свой интерфейс.
  • Илья © (08.09.08 11:57) [9]
    Чтобы получить результат комбинации трех матриц необходимо сначала их последовательно перемножить(перемножение матриц некоммутативная операция,поэтому последовательность операции влияет на конечный рез-т) при помощи функции D3DXMatrixMultiply:
    D3DXMatrixMultiply(mOut,M1,M2);
    D3DXMatrixMultiply(mOut,mOut,M3);

    В вашем случае устанавливается только последняя матрица.
  • @!!ex © (08.09.08 12:39) [10]
    > [9] Илья ©   (08.09.08 11:57)

    Некропосты - это модно? :))
  • Elec3C © (11.09.08 18:49) [11]

    > некоммутативная операция

    Вот так уже модно выражаться %))
 
Конференция "Игры" » DirectX SetTransform
Есть новые Нет новых   [134430   +4][b:0][p:0.001]