Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - jmedina

#1
XNA / Re: Problema dibujando modelos 3D en XNA
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

#2
XNA / Problema dibujando modelos 3D en XNA
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/ y que no entiendo bien.

¿Alguna pista o sugerencia?





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.