Foros - Stratos

Stratos => XNA => Mensaje iniciado por: jmedina en 30 de Enero de 2011, 09:22:58 PM

Título: Problema dibujando modelos 3D en XNA
Publicado por: jmedina en 30 de Enero de 2011, 09:22:58 PM
Hola, no se si este es el sitio adecuado para poner dudas sobre código, pero como es de XNA me pareció más relacionado.

Mi problema es el siguiente. Quiero dibujar en la pantalla varias veces el mismo modelo, con diferentes posiciones. Sin embargo, al ejecutar, solo se dibuja 1 modelo (en la ultima posición).
Creo que el problema esta en estas lineas:


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);
}


Las cuales copie de un tutorial de http://www.catalinzima.com/ (http://www.catalinzima.com/) y que no entiendo bien.

¿Alguna pista o sugerencia?
Título: Re: Problema dibujando modelos 3D en XNA
Publicado por: Vicente en 30 de Enero de 2011, 10:16:16 PM
Pon todo el método Draw anda.
Título: Re: Problema dibujando modelos 3D en XNA
Publicado por: WaaghMan en 30 de Enero de 2011, 10:42:09 PM
Necesitas asignar la matriz de transformación en cada dibujado. En el código que pones no se ve si lo estás haciendo o no...
Título: Re: Problema dibujando modelos 3D en XNA
Publicado por: jmedina en 31 de Enero de 2011, 07:32:09 PM
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

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.

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.

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:

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