Vale, guay, no se si reir o llorar.
Problema solucionado. Como suele pasar, la solución estaba justo delante de mis ojos.
Pongo el código y una explicación por si a alguien le ocurre lo mismo.
El metodo Draw
Y el método Update.
Y el bucle donde llamaba a Draw()...y donde está la metedura de pata.
Mi problema era muy simple, las transformaciones se actualizan en el método Update(), pero yo estaba cambiando las posiciones al llamar al metodo Draw().
Es decir, al no llamar a Update, no estaba actualizando las posiciones de los huesos.
Corrección rápida:
Ains, que torpe soy.
Bueno, gracias a los dos, por las pistas. Después de darle mil vueltas, ha sido cuando me he puesto a comentar el código para ponerlo aquí cuando me he dado cuenta del fallo.
:D
Problema solucionado. Como suele pasar, la solución estaba justo delante de mis ojos.
Pongo el código y una explicación por si a alguien le ocurre lo mismo.
El metodo Draw
Código [Seleccionar]
public void Draw(GraphicsDevice graphicsDevice, ICamera camera, Effect renderEffect, String technique)
{
//Tengo varias tecnicas de dibujado en el HLSL por eso aqui le digo cual usar
renderEffect.CurrentTechnique = renderEffect.Techniques[technique];
//Paso los parametros comunes al HLSL
renderEffect.Parameters["View"].SetValue(camera.View);
renderEffect.Parameters["Projection"].SetValue(camera.Projection);
renderEffect.Parameters["Texture"].SetValue(colorTex);
renderEffect.Parameters["SpecularMap"].SetValue(specularTex);
renderEffect.Parameters["NormalMap"].SetValue(normalTex);
renderEffect.Parameters["Animate"].SetValue(0); //Esta variable la uso en el pixel shader para animar texturas.
foreach (ModelMesh mesh in model.Meshes)
{
//Paso diferentes matrices, para cada parte del modelo (las transformaciones de cada hueso)
renderEffect.Parameters["World"].SetValue(boneTransforms[mesh.ParentBone.Index]);
renderEffect.Begin();
renderEffect.CurrentTechnique.Passes[0].Begin();
// Lineas que no entiendo. :(
foreach (ModelMeshPart meshPart in mesh.MeshParts)
{
graphicsDevice.VertexDeclaration = meshPart.VertexDeclaration;
graphicsDevice.Vertices[0].SetSource(mesh.VertexBuffer, meshPart.StreamOffset, meshPart.VertexStride);
graphicsDevice.Indices = mesh.IndexBuffer;
graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, meshPart.BaseVertex, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
}
renderEffect.CurrentTechnique.Passes[0].End();
renderEffect.End();
}
}
Y el método Update.
Código [Seleccionar]
public void Update(GameTime gameTime)
{
//Actualizo las transformaciones de los huesos.
model.Root.Transform = Matrix.CreateTranslation(position) * Matrix.CreateFromYawPitchRoll(rotation.X,rotation.Y,rotation.Z) * Matrix.CreateScale(scale);
model.CopyAbsoluteBoneTransformsTo(boneTransforms);
}
Y el bucle donde llamaba a Draw()...y donde está la metedura de pata.
Código [Seleccionar]
for(int i=0; i< 1000; i+=30)
{
m3dObjeto.Position = new Vector3(0, i, 0);
m3dObjeto.Draw(graphicsDevice, camera, gbufferEffect, "Solid");
}
Mi problema era muy simple, las transformaciones se actualizan en el método Update(), pero yo estaba cambiando las posiciones al llamar al metodo Draw().
Es decir, al no llamar a Update, no estaba actualizando las posiciones de los huesos.
Corrección rápida:
Código [Seleccionar]
for(int i=0; i< 1000; i+=30)
{
m3dObjeto.Position = new Vector3(0, i, 0);
m3dObjeto.Update(null); //Con esto ya dibuja XD
m3dObjeto.Draw(graphicsDevice, camera, gbufferEffect, "Solid");
}
Ains, que torpe soy.
Bueno, gracias a los dos, por las pistas. Después de darle mil vueltas, ha sido cuando me he puesto a comentar el código para ponerlo aquí cuando me he dado cuenta del fallo.
:D