Не могу понять где ошибка Люди добрые подскажите почему когда я хочу поменять положение куба, он вообще не передвигается? В исходнике найдите строки перед которыми стоит "изменение куба".
kryndach Ну эта функция возвращает в одном из параметров (первом), преобразованную матрицу. Затем тебе нужно её использовать в SetTransform.
Блина Не получается отправить исходник - возьму маленикий кусочек: Код (Text): fld Cube1par.x fadd izmen3 fstp Cube1par.x fld Cube1par.y fadd izmen3 fstp Cube1par.y fld Cube1par.z fadd izmen3 fstp Cube1par.z invoke D3DXMatrixRotationAxis,ADDR MatrXXX, ADDR Cube1par.RIGHT,izmen2 invoke D3DXVec4Transform,ADDR Cube1par.UP,ADDR Cube1par.UP,ADDR MatrXXX invoke D3DXVec4Transform,ADDR Cube1par.GO,ADDR Cube1par.GO,ADDR MatrXXX invoke D3DXMatrixRotationAxis,ADDR MatrXXX, ADDR Cube1par.UP,izmen2 invoke D3DXVec4Transform,ADDR Cube1par.RIGHT,ADDR Cube1par.RIGHT,ADDR MatrXXX invoke D3DXVec4Transform,ADDR Cube1par.GO,ADDR Cube1par.GO,ADDR MatrXXX invoke D3DXMatrixLookAtLH, ADDR MatrixCube1, ADDR EyeVector, ADDR Cube1par.GO, ADDR Cube1par.UP invoke D3DXMatrixTranslation,ADDR MatrXXX,Cube1par.x,Cube1par.y,Cube1par.z invoke D3DXMatrixMultiply,ADDR MatrixCube1,ADDR MatrixCube1,ADDR MatrXXX ;------------------------------; mov AdrCube,offset Cube mov AdrCube1,offset Cube1 add AdrCube,36*4*4 add AdrCube1,36*4*4 mov ecx,36 loopCub: sub AdrCube1,16 sub AdrCube,16 invoke D3DXVec4Transform,AdrCube1,AdrCube,ADDR MatrixCube1 dec ecx cmp ecx,0 jne loopCub ;;;;;;Êîïèðîâàíèå â áóôåð;;;;;; d3dvb8 Lock1, pd3dVertexBuffer, NULL, NULL, ADDR pLockBuffer, NULL lea esi, Cube1 ; Êîïèðóåì â áóôåð 12 ïîëèãîíîâ ôîíà mov edi, pLockBuffer mov ecx, 12*12 ;add esi,12*12*4 rep movsd d3dvb8 Unlock, pd3dVertexBuffer
А как именно? Я SetTransform-ом преобразую только матрици проекции,вида и мировую. А преобразую объекты я повершинно.
kryndach Ну так и надо преобразовывать на каждом шаге D3DTS_WORLD, а не вершины. Вершины преобразовывать это жесть, тормозно.
Посмотри на исходник. Я нигде в инете не нашол про преобразования объектов в Асме и решил попробовать сам. Вообще по логике у меня правельный код (я так думаю) но он не работает как надо. Если есть другой способ преобразовывать объекты то ты напиши пример - я буду оооочень признателен.
kryndach Всё правильно она её заменяет, но обычно D3DTS_WORLD устанавливается в начале в единичную. Если объектов много можно перед рендерингом сохранить общую мировую матрицу, и потом умножать её на матрицы преобразований отделных объектов. В директе для этого есть удобный класс, стек матриц. Устанвливать D3DTS_WORLD, более правильно (эффективно), проще и следовательно менее багово. к тому же вершинную анимацию не делают с помощью матриц, координаты вершин локальны.
Ну так как я ужё писал, сохраня общую матрицу в начале рендеринга, а потом умножай её на матрицу преобразований объекта, или юзай класс стек матриц, что более удобно.
Начало рендеринга. 1) d3d->getTransform(D3DTS_WORLD, &world_matr); 2) D3DXMultiplyMatrix(&matr1, &matr1, &world_matr); 3) d3d->SetTransform(D3DTS_WORLD, &matr1); 4) Рисуем первый объект. 5) D3DXMultiplyMatrix(&matr2, &matr2, &world_matr); 6) d3d->SetTransform(D3DTS_WORLD, &matr2); 7) Рисуем второй объект. 8) d3d->SetTransform(D3DTS_WORLD, &world_matr); 9) Рисуем объекты которым не нужна нафик ни какая трансформация. Но советую глянуть на класс - "стек матриц", с ним это более удобно.
Кстати во втором параметре функции CreateVertexBuffer (тот который USAGE)лучше записывать WRITE_ONLY, это скажет видяхе хранить вершины в видеопамяти. С одной стороны это не даст читать вершины, но с другой сильно повысит скорость ренгдеринга. А читать их почти никогда не надо.