DirectX9矩阵转换不适用

时间:2014-02-03 20:31:40

标签: c++ graphics matrix transform directx-9

我有一个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();

-----------绘制功能-------------- 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);

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

1 个答案:

答案 0 :(得分:0)

好的,你对矩阵的乘法做错了。矩阵乘法不是可交换的,即A * B!= B * A.更改将它们与旋转相乘的顺序* scale * translate to scale * rotation * translate。

希望有所帮助。