Не работает функция D3DXMatrixTranslation

Тема в разделе "WASM.DirectX", создана пользователем kryndach, 28 май 2007.

  1. kryndach

    kryndach New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    55
    Не могу понять где ошибка
    Люди добрые подскажите почему когда я хочу поменять положение куба, он вообще не передвигается?
    В исходнике найдите строки перед которыми стоит "изменение куба".
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    kryndach

    Ну эта функция возвращает в одном из параметров (первом), преобразованную матрицу.
    Затем тебе нужно её использовать в SetTransform.
     
  3. kryndach

    kryndach New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    55
  4. kryndach

    kryndach New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    55
    Блина :dntknw:
    Не получается отправить исходник - возьму маленикий кусочек:
    Код (Text):
    1. fld  Cube1par.x
    2.    fadd izmen3
    3.    fstp Cube1par.x
    4.    
    5.    fld  Cube1par.y
    6.    fadd izmen3
    7.    fstp Cube1par.y
    8.    
    9.    fld  Cube1par.z
    10.    fadd izmen3
    11.    fstp Cube1par.z
    12.    
    13.      
    14.    invoke  D3DXMatrixRotationAxis,ADDR MatrXXX, ADDR Cube1par.RIGHT,izmen2
    15.    invoke  D3DXVec4Transform,ADDR Cube1par.UP,ADDR Cube1par.UP,ADDR MatrXXX
    16.    invoke  D3DXVec4Transform,ADDR Cube1par.GO,ADDR Cube1par.GO,ADDR MatrXXX    
    17.      
    18.    invoke  D3DXMatrixRotationAxis,ADDR MatrXXX, ADDR Cube1par.UP,izmen2
    19.    invoke  D3DXVec4Transform,ADDR Cube1par.RIGHT,ADDR Cube1par.RIGHT,ADDR MatrXXX
    20.    invoke  D3DXVec4Transform,ADDR Cube1par.GO,ADDR Cube1par.GO,ADDR MatrXXX
    21.    
    22.    
    23.    invoke  D3DXMatrixLookAtLH, ADDR MatrixCube1, ADDR EyeVector, ADDR Cube1par.GO, ADDR Cube1par.UP
    24.    
    25.    
    26.    invoke  D3DXMatrixTranslation,ADDR MatrXXX,Cube1par.x,Cube1par.y,Cube1par.z  
    27.    invoke  D3DXMatrixMultiply,ADDR MatrixCube1,ADDR MatrixCube1,ADDR MatrXXX
    28.    
    29.    ;------------------------------;
    30.    
    31.    mov     AdrCube,offset Cube
    32.    mov     AdrCube1,offset Cube1
    33.    add     AdrCube,36*4*4
    34.    add     AdrCube1,36*4*4
    35.    mov     ecx,36
    36.    loopCub:      
    37.    sub     AdrCube1,16
    38.    sub     AdrCube,16  
    39.    invoke  D3DXVec4Transform,AdrCube1,AdrCube,ADDR MatrixCube1  
    40.    dec     ecx
    41.    cmp     ecx,0
    42.    jne     loopCub
    43.    
    44.    ;;;;;;Êîïèðîâàíèå â áóôåð;;;;;;
    45.    
    46.    d3dvb8  Lock1, pd3dVertexBuffer, NULL, NULL, ADDR pLockBuffer, NULL
    47.    
    48.    lea     esi, Cube1                             ; Êîïèðóåì â áóôåð 12 ïîëèãîíîâ ôîíà
    49.    mov     edi, pLockBuffer          
    50.    mov     ecx, 12*12
    51.    ;add     esi,12*12*4
    52.    rep     movsd
    53.    
    54.    d3dvb8  Unlock, pd3dVertexBuffer
     
  5. kryndach

    kryndach New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    55
    А как именно? Я SetTransform-ом преобразую только матрици проекции,вида и мировую. А преобразую объекты я повершинно.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    kryndach
    Не понял. SetTransform делаешь?
     
  7. kryndach

    kryndach New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    55
    Мне казалось что SetTransform заменяет матрицу а не умножает. Поправь если не прав
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    kryndach

    Ну так и надо преобразовывать на каждом шаге D3DTS_WORLD, а не вершины.
    Вершины преобразовывать это жесть, тормозно.
     
  9. kryndach

    kryndach New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    55
    Посмотри на исходник.
    Я нигде в инете не нашол про преобразования объектов в Асме и решил попробовать сам.
    Вообще по логике у меня правельный код (я так думаю) но он не работает как надо.
    Если есть другой способ преобразовывать объекты то ты напиши пример - я буду оооочень признателен.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    kryndach
    Всё правильно она её заменяет, но обычно D3DTS_WORLD устанавливается в начале в единичную.

    Если объектов много можно перед рендерингом сохранить общую мировую матрицу, и потом умножать её на матрицы преобразований отделных объектов. В директе для этого есть удобный класс, стек матриц.

    Устанвливать D3DTS_WORLD, более правильно (эффективно), проще и следовательно менее багово. к тому же вершинную анимацию не делают с помощью матриц, координаты вершин локальны.
     
  11. kryndach

    kryndach New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    55
    Я вообще затупил :dntknw:

    Можно мааааленький кусочек кода для примера?
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ну так как я ужё писал, сохраня общую матрицу в начале рендеринга, а потом умножай её на матрицу преобразований объекта, или юзай класс стек матриц, что более удобно.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Начало рендеринга.
    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) Рисуем объекты которым не нужна нафик ни какая трансформация.

    Но советую глянуть на класс - "стек матриц", с ним это более удобно.
     
  14. kryndach

    kryndach New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    55
    Спасибо БОЛЬШОЕ что открыл мне глаза!
    Пока ниче не понял но идея понятна.
    Еще раз спасибо!
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Кстати во втором параметре функции CreateVertexBuffer (тот который USAGE)лучше записывать WRITE_ONLY, это скажет видяхе хранить вершины в видеопамяти. С одной стороны это не даст читать вершины, но с другой сильно повысит скорость ренгдеринга.
    А читать их почти никогда не надо.