Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C# XNA] creare infinitamente modelli 3D
Forum - C# / VB.NET - [C# XNA] creare infinitamente modelli 3D - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Linkinf22 (Normal User)
Rookie


Messaggi: 59
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 12:19
Mercoledì, 15/07/2009
Ok, ci sono riuscito, con il tuo modo mi dava un errore ma sono riuscito a risolverlo da solo. Ora... siccome il metodo Update viene eseguito per ogni frame... come posso fare a far si che alla pressione del tasto "A" non mi crei un sacco di modelli? Stavo pensando di utilizzare in qualche modo il gameTime.ElapsedGameTime.TotalSeconds ma non so se può andar bene.

PM
Avatar
Linkinf22 (Normal User)
Rookie


Messaggi: 59
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 13:57
Mercoledì, 15/07/2009
Sono riuscito utilizzando il thread.Sleep(), non è un metodo molto professionale ma comunque ha risolto la cosa...

Ok, grazie... ora sono a posto, se avrò altre domande (sicuramente, visto che ho iniziato da pochi giorni con XNA) non esiterò a chiedere!

PM
Avatar
Linkinf22 (Normal User)
Rookie


Messaggi: 59
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 14:39
Mercoledì, 15/07/2009
Scusate il triplo post, ma ho impostato la telecamera per far si che si muova ed ora mi succede di nuovo che mi appare il modello solo una volta!

namespace Domino
{
    public class Principale : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        KeyboardState StatoDellaTastiera;
        MouseState StatoDelMouse;
        List<ListDomino> NDomino = new List<ListDomino>();
        Model Modello;
        Vector3 Incrementatore = new Vector3(0, 0, 0);
        Vector3 PosizioneCamera;
        float RotazioneCamera;
        float BeccheggioCamera;
        float rollioCamera;
        Vector3 camUp;
        Vector3 camLook;
        Vector3 camLeft;

        public Principale()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            Window.Title = "Domino";
        }

        protected override void Initialize()
        {
            graphics.PreferredBackBufferWidth = Convert.ToInt32("1024");
            graphics.PreferredBackBufferHeight = Convert.ToInt32("768");
            graphics.ToggleFullScreen();
            PosizioneCamera = new Vector3(0f, 100f, 0f);
            RotazioneCamera = 0f;
            BeccheggioCamera = 0f;
            rollioCamera = 0.0f;
            PosizioneCamera = new Vector3(50, 50, -100f);
            Cursor.Show();
            base.Initialize();
        }

        protected override void LoadContent()
        {
            Modello = Content.Load<Model>("Modelli/ModelloDomino");
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            StatoDellaTastiera = Keyboard.GetState();
            StatoDelMouse = Mouse.GetState();
            float secondiDpFrame = (float)gameTime.ElapsedGameTime.TotalSeconds;

            RotazioneCamera -= (float)(StatoDelMouse.X - graphics.PreferredBackBufferWidth / 2) * secondiDpFrame;
            BeccheggioCamera += (float)(StatoDelMouse.Y - graphics.PreferredBackBufferHeight / 2) * secondiDpFrame;
            Mouse.SetPosition(graphics.PreferredBackBufferWidth / 2, graphics.PreferredBackBufferHeight / 2);
            Matrix rot = Matrix.CreateFromYawPitchRoll(RotazioneCamera, BeccheggioCamera, rollioCamera);
            camUp = Vector3.Transform(Vector3.UnitY, rot);
            camLook = Vector3.Transform(Vector3.UnitZ, rot);
            camLeft = Vector3.Cross(camUp, camLook);
            float speed = 100.0f;

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Escape))
            {
                Exit();
            }

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A))
            {
                ListDomino DMN = new ListDomino();
                DMN.ModelloDomino = Modello;
                DMN.Posizione = new Vector3(Incrementatore.X, Incrementatore.Y, Incrementatore.Z);
                NDomino.Add(DMN);
                Incrementatore = new Vector3(Incrementatore.X + 50f, 0, 0);
                Thread.Sleep(100);
            }

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Left))
            {
                PosizioneCamera += speed * secondiDpFrame * camLeft;
            }

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Right))
            {
                PosizioneCamera -= speed * secondiDpFrame * camLeft;
            }

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Up))
            {
                PosizioneCamera += speed * secondiDpFrame * camLook;
            }

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Down))
            {
                PosizioneCamera -= speed * secondiDpFrame * camLook;
            }

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.PageUp))
            {
                PosizioneCamera += speed * secondiDpFrame * camUp;
            }

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.PageDown))
            {
                PosizioneCamera -= speed * secondiDpFrame * camUp;
            }

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
            int i = 0;

            for (i = 0; i < NDomino.Count; i++)
            {
                Matrix[] boneTrasforms = new Matrix[NDomino.ModelloDomino.Bones.Count];
                Modello.CopyAbsoluteBoneTransformsTo(boneTrasforms);

                foreach (ModelMesh mesh in NDomino.ModelloDomino.Meshes)
                {
                    Matrix World = boneTrasforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(NDomino.Posizione);

                    foreach (BasicEffect effect in mesh.Effects)
                    {
                        effect.TextureEnabled = true;
                        effect.EnableDefaultLighting();
                        effect.Projection = Matrix.CreatePerspectiveFieldOfView(1, 1.33f, 10, 10000);
                        effect.View = Matrix.CreateLookAt(PosizioneCamera, PosizioneCamera + camLook, camUp);
                    }
                    mesh.Draw(SaveStateMode.SaveState);
                }
            }
            base.Draw(gameTime);
        }

        public struct ListDomino
        {
            public Vector3 Posizione;
            public Model ModelloDomino;
        }
    }
}

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:34
Giovedì, 16/07/2009
Testo quotato

Postato originariamente da Thejuster:

( Andando un secondo OT ovviamente una semplice discussione tra programmatori
senza disguidi. )

bhe si, però la cosa cambia
quando si tenta di gestire uno dei tanti modelli disegnati.

prendi esempio 300 palline.
se serve solo un semplice Draw va benissimo così.

ma penso che se stia facendo un domino abbia la necessità di controllare ogni oggetto della scena e questo e possibile farlo solo tramide una lista e un indice per identificarli. non credi?

per le risorse non sò quale sia la differenza tra una lista e una varabile
questo esempio e un mio progetto basato sul TEngine.


http://www.youtube.com/watch?v=LXammFSCUK0


l'engine e strutturato tutto sulle liste.
ed in una scena come quella esempio arrivo a 74fps
un dispendio di risorse minimo gestito tutto tra liste.



Mi sono adeguato alla situazione. Non specificando nient'altro, quello era il metodo migliore.

PM
Avatar
Linkinf22 (Normal User)
Rookie


Messaggi: 59
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 17:42
Sabato, 18/07/2009
Ok ho risolto da solo il problema della telecamera... avevo dimenticato l' effect.World. Ora si può impostare il topic su Risolto.

PM
Pagine: [ 1 2 ] Precedente | Prossimo