我试着写一个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);
}
答案 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函数。传递一个网格和一个矩阵。结果将被转换为网格。这很容易。