Как вертеть в D3d не весь мир?
Я недавно начал использовать D3D, и поэтому до сих пор не понимаю, как повернуть обьект, не поворачивая весь мир. Я так понял, что матрицы действуют сразу на все вектора, так что не ясно, как, например создать два вращающихся в разные стороны треугольника.
Я думаю, может нарисовать сначала один обьект, потом мир повернуть, а потом нарисовать второй. Я прав?
//Device - 3D-устройство, интерфейс //IDirect3DDevice8 или 9
//Процедура в которой будем рисовать треугольники
var
//Угол (радианы)
angle:single=0;
procedure DrawTriangles(Device:IDirect3DDevice9);
var
//Матрицы
Rotation,Translation,mat,save:TD3DMatrix;
begin
//Берем текущую матрицу мира
Device.GetTransform(save);
//Вращаем матрицу по оси Y
angle:=angle+0.05;
if angle>2*pi then angle:=0;
D3DXMatrixRotationY(Rotation,angle);
//... и чуть справа от начала координат
D3DXMatrixTranslation(Translation,3,0,0);
//Складываем матрицы
D3DXMatrixMultiply(mat,Translation,Matrix);
//Устанавливаем матрицу
Device.SetTransform(mat);
//Рисуем трегольник
Device.DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
//Вращаем матрицу по оси Y, но уже в обратную
//сторону и слева от начала координат
D3DXMatrixRotationY(Rotation,-angle);
D3DXMatrixTranslation(Translation,-3,0,0);
//Складываем матрицы
D3DXMatrixMultiply(mat,Translation,Matrix);
//Устанавливаем матрицу
Device.SetTransform(mat);
//Рисуем трегольник
Device.DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
//Устанавливаем матрицу мира
device.SetTransform(save);
end;
За счет вызова функций GetTransform(save) и
SetTransform(save) и происходит вращение двух треугольников в разные стороны, не поворачивая мир.
Ага, спасибо. Сейчас попробую использовать. Но всё-таки, что же делает SetTransform? Оно действует на все вектора или нет? Если да, то это наверное, весьма тормознуто, если надо повернуть маленький кубик на огромном поле. Есть ли встроенные функции для поворота объекта до его отображения, то есть изменения коородинат самих векторов объекта в памяти?