2014-02-03 6 views
0

У меня есть класс Object, который отслеживает масштаб объектов, перевод и все остальное, и я хочу, чтобы он задал эти матрицы преобразования, когда он рисовал (очевидно), но по какой-то причине, несмотря на то, что я установите преобразование и все, это не сработает.Матрица DirectX9 Не применяется

---------- В ОБЪЕКТ ------------------

vertices = new Vertex[vertexCount]; 
    scaleX = 100.0f; 
    scaleY = 100.0f; 
    scaleZ = 100.0f; 
    vertices[0] = { 100.0f, 0.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0, }; 
    vertices[1] = { 100.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1, }; 
    vertices[2] = { 0.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1, }; 
    vertices[3] = { 0.0f, 0.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0, }; 

    v_buffer = NULL; 
    i_buffer = NULL; 

    texture = 0; 

    d3ddev->CreateVertexBuffer(vertexCount * sizeof(Vertex), 
    0, 
    CUSTOMFVF, 
    D3DPOOL_MANAGED, 
    &v_buffer, 
    NULL); 

    short indices[] = 
    { 
    0, 1, 2, // side 1 
    2, 3, 0, 
    }; 


    // create an index buffer interface called i_buffer 
    d3ddev->CreateIndexBuffer(6 * sizeof(short), 
    0, 
    D3DFMT_INDEX16, 
    D3DPOOL_MANAGED, 
    &i_buffer, 
    NULL); 

    // lock i_buffer and load the indices into it 
    i_buffer->Lock(0, 0, (void**)&pVoid, 0); 
    memcpy(pVoid, indices, sizeof(indices)); 
    i_buffer->Unlock(); 

    // lock v_buffer and load the vertices into it 
    v_buffer->Lock(0, 0, (void**)&pVoid, 0); 
    memcpy(pVoid, vertices, sizeof(Vertex)* vertexCount); 
    v_buffer->Unlock(); 

--------- --DRAW FUNCTION -------------- D3DXVECTOR3 pos = { obj.GetX(), obj.GetY(), obj.GetZ() };

d3ddev->SetFVF(CUSTOMFVF); 
    // select the vertex buffer to display 
    d3ddev->SetStreamSource(0, obj.GetVBuffer(), 0, sizeof(Vertex)); 
    d3ddev->SetIndices(obj.GetIBuffer()); 

    D3DXMatrixRotationYawPitchRoll(&obj.rotationTransform, obj.GetRotationX(), obj.GetRotationY(), obj.GetRotationZ()); 
    D3DXMatrixTranslation(&obj.translationTransform, obj.GetX(), obj.GetY(), obj.GetZ()); 
    D3DXMatrixScaling(&obj.scalingTransform, obj.GetScaleX(), obj.GetScaleY(), obj.GetScaleZ()); 
    D3DXMatrixMultiply(&obj.worldTransform, &obj.scalingTransform, &obj.translationTransform); 
    D3DXMatrixMultiply(&obj.worldTransform, &obj.rotationTransform, &obj.worldTransform); 
    //obj.worldTransform = obj.rotationTransform * obj.scalingTransform * obj.translationTransform; 
    d3ddev->SetTransform(D3DTS_WORLD, &obj.worldTransform); 

    D3DXMatrixLookAtRH(&obj.viewTransform, &D3DXVECTOR3(0, 0, 10), &D3DXVECTOR3(0, 0, 0), &D3DXVECTOR3(0, 0, 0)); 
    d3ddev->SetTransform(D3DTS_VIEW, &obj.viewTransform); 

    D3DXMatrixPerspectiveFovRH(&obj.projectionTransform, D3DXToRadian(90), (float)SCREEN_WIDTH/(float)SCREEN_HEIGHT, 1.0f, 10.0f); 
    d3ddev->SetTransform(D3DTS_PROJECTION, &obj.projectionTransform); 

    // copy the vertex buffer to the back buffer 
    d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2); 

ответ

0

Хорошо, вы ошибаетесь при умножении матриц. Матричное умножение не является коммутативным, то есть A * B! = B * A. Измените порядок, в котором вы их умножаете, от поворота * масштаб * перевести на масштаб * вращение * перевести.

Надеюсь, что это поможет.