转换Direct3D网格

时间:2008-12-01 12:58:45

标签: graphics directx direct3d mesh

我试着写一个TransformMesh函数。该函数接受Mesh对象和Matrix对象。我们的想法是使用矩阵转换网格。为此,我锁定了顶点缓冲区,并在每个顶点上调用了Vector3 :: TransformCoordinate。它产生了预期的结果。生成的网格无法识别。

我做错了什么?

// C++/CLI code. My apologies.
int n = verts->Length;
for(int i = 0; i < n; i++){
        verts[i].Position = DX::Vector3::TransformCoordinate(verts[i].Position, matrix);
}

3 个答案:

答案 0 :(得分:2)

如果没有关于你正在做的事情的上下文代码,可能很难知道确切的问题。如何创建网格?如何读取verts [],它是如何写的?您是否尝试从只写顶点缓冲区读取?

我的建议是先尝试一个非常简单的翻译矩阵,然后调试代码并查看顶点输入和输出。看看你是否收到了良好的数据,以及它是否正确转换。如果是这样,问题在于顶点跨度,流声明或DirectX管道中更深层次的东西。

正如我所说,需要更多代码来确定问题的根源。

答案 1 :(得分:1)

我完全同意Coincoin,上下文代码会有所帮助 如果您只想将变换后的网格绘制到屏幕上,则无需以这种方式变换网格。您只需更改世界,视图和投影矩阵中的一个即可。这产生了预期的结果。如下面的示例代码所示。

      // Clear the backbuffer to a Blue color.
  device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue,   
     1.0f, 0);

  // Begin the scene.
  device.BeginScene();

  device.Lights[0].Enabled = true;

  // Setup the world, view, and projection matrices.
  Matrix m = new Matrix();

  if( destination.Y != 0 )
     y += DXUtil.Timer(DirectXTimer.GetElapsedTime) * (destination.Y 
          * 25);

  if( destination.X != 0 )
     x += DXUtil.Timer(DirectXTimer.GetElapsedTime) * (destination.X 
          * 25);

  m = Matrix.RotationY(y);
  m *= Matrix.RotationX(x);

  device.Transform.World = m;
  device.Transform.View = Matrix.LookAtLH(
      new Vector3( 0.0f, 3.0f,-5.0f ),
      new Vector3( 0.0f, 0.0f, 0.0f ),
      new Vector3( 0.0f, 1.0f, 0.0f ) );   
  device.Transform.Projection = Matrix.PerspectiveFovLH(
      (float)Math.PI / 4, 1.0f, 1.0f, 100.0f );

  // Render the teapot.
  teapot.DrawSubset(0);

  // End the scene.
  device.EndScene();

此样本取自here

答案 2 :(得分:0)

我建议使用D3DXConcatenateMeshes函数。传递一个网格和一个矩阵。结果将被转换为网格。这很容易。