Transformar una malla Direct3D
Pregunta
Intenté escribir una función TransformMesh
. La función acepta un objeto Mesh
y un objeto Matrix
. La idea es transformar la malla usando la matriz. Para hacer esto, bloqueé el búfer de vértices y llamé a Vector3 :: TransformCoordinate en cada vértice. no produjo los resultados esperados. La malla resultante era irreconocible.
¿Qué estoy haciendo mal?
// 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);
}
Solución
Estoy totalmente de acuerdo con Coincoin, el código contextual ayudaría.
Y si solo desea dibujar una malla transformada en la pantalla, no necesita transformar la malla de esta manera. Simplemente puede cambiar una de las matrices de mundo, vista y proyección. Esto produce el resultado esperado. Como en el siguiente código de muestra.
// 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();
Esta muestra se toma de aquí .
Otros consejos
Sin un código contextual sobre lo que está haciendo, puede ser difícil saber el problema exacto. ¿Cómo se crea la malla? ¿Cómo se lee verts [], cómo se escribe? ¿Estás intentando leer desde un búfer de vértices de solo escritura?
Mi recomendación sería probar primero con una matriz de traducción muy simple y depurar el código y ver la entrada y salida del vértice. Vea si recibe buenos datos y si se transforman correctamente. Si es así, el problema está en el paso de vértices, la declaración de flujo o algo más profundo en la tubería de DirectX.
Como dije, se necesitaría más código para determinar el origen del problema.
Recomiendo usar la función D3DXConcatenateMeshes. Pase una malla y una matriz. El resultado será una malla transformada. Es bastante fácil.