Матричные преобразования DirectX9 не применяются

0

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

---------- В OBJECT------------------

  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);

Теги:
graphics
matrix
transform
directx-9

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню