Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema dibujando modelos 3D en XNA

Iniciado por jmedina, 30 de Enero de 2011, 09:22:58 PM

« anterior - próximo »

jmedina

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/ y que no entiendo bien.

¿Alguna pista o sugerencia?


WaaghMan

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...
Milkstone Studios - Autores de Avatar Ninja!, Little Racers, MotorHEAT y Wool en Xbox Live Indie Games

jmedina

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







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.