2

我试图写一个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);
}
4

3 回答 3

2

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

我的建议是首先尝试使用非常简单的转换矩阵并调试代码并查看顶点输入和输出。看看您是否收到了良好的数据以及是否正确转换。如果是这样,则问题出在顶点步幅、流声明或 DirectX 管道中更深层次的其他东西上。

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

于 2009-02-04T18:42:48.627 回答
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();

这个样本取自这里

于 2009-04-24T07:55:32.213 回答
0

我推荐使用函数 D3DXConcatenateMeshes。通过一个网格和一个矩阵。结果将转换为网格。这很容易。

于 2010-09-11T14:47:14.880 回答