Beispiel #1
0
        public override void Init()
        {
            //El framework posee la clase TgcSceneLoader que permite cargar modelos 3D.
            //Estos modelos 3D están almacenados en un archivo XML llamado TgcScene.xml.
            //Este archivo es un formato a medida hecho para el framework. Y puede ser creado desde herramientas de
            //diseño como 3Ds MAX (exportando a traves de un plugin) o con el editor MeshCreator que viene con el framework.
            //El framework viene con varios modelos 3D incluidos en la carpeta: TgcViewer\Examples\Media\MeshCreator\Meshes.
            //El formato especifica una escena, representada por la clase TgcScene. Una escena puede estar compuesta por varios
            //modelos 3D. Cada modelo se representa con la clase TgcMesh.
            //En este ejemplo vamos a cargar una escena con un único modelo.
            var loader = new TgcSceneLoader();

            //De toda la escena solo nos interesa guardarnos el primer modelo (el único que hay en este caso).
            mesh = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\Hummer\\Hummer-TgcScene.xml").Meshes[0];
            mesh.AutoTransform = true;
            mesh.RotateY(FastMath.QUARTER_PI);
            mesh.Move(new TGCVector3(100, 40, -200));
            //mesh.Transform = TGCMatrix.RotationY(FastMath.QUARTER_PI) * TGCMatrix.Translation(100,40,-200);

            //En este ejemplo no cargamos un solo modelo 3D sino una escena completa, compuesta por varios modelos.
            //El framework posee varias escenas ya hechas en la carpeta TgcViewer\Examples\Media\MeshCreator\Scenes.
            scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Scenes\\Iglesia\\Iglesia-TgcScene.xml");

            //Hacemos que la cámara esté centrada sobre el mesh.
            Camara = new TgcRotationalCamera(mesh.BoundingBox.calculateBoxCenter(),
                                             mesh.BoundingBox.calculateBoxRadius() * 2, Input);
        }
Beispiel #2
0
        private void eliminarMesh()
        {
            TGCVector3 posicionDeBorrado = new TGCVector3(0, -4000, 0);

            mesh.Move(posicionDeBorrado);
            mesh.updateBoundingBox();
            mesh.UpdateMeshTransform();
        }
Beispiel #3
0
        internal void HuirDe(Personaje personaje, float elapsedTime)
        {
            var posicionDeBorrado = new TGCVector3(ghost.Position.X + 2000, ghost.Position.Y, ghost.Position.Z - 5000);

            ghost.Move(posicionDeBorrado);
            ghost.updateBoundingBox();
            ghost.UpdateMeshTransform();
        }
        private void eliminarMesh()
        {
            TGCVector3 posicionDeBorrado = new TGCVector3(0, -4000, 0);

            mesh.Move(posicionDeBorrado);
            mesh.updateBoundingBox();
            mesh.UpdateMeshTransform();
            //no hago el dispose aca porque sino lo tendria que sacar del TGCScene y no se si quiero hacer eso
        }
        public void ExecuteCollision(TgcMesh item, TgcMesh bandicoot, Core.Camara.TgcCamera camara, Core.Mathematica.TGCVector3 movimiento)
        {
            var anguloCamara = bandicoot.Position;

            bandicoot.Move(-movimiento);
            bandicoot.Transform = TGC.Core.Mathematica.TGCMatrix.Translation(-movimiento);

            //Bandicoot.Move(0, direccionSalto * MOVEMENT_SPEED * ElapsedTime, 0);
            camara.SetCamera((camara.Position - movimiento), anguloCamara);
        }
Beispiel #6
0
 private void MoverObjetos(TgcMesh mesh, TGCVector3 movementRay)
 {
     if (mesh.Name == "CajaMadera" && mesh.BoundingBox.PMax.Y >= personajePrincipal.BoundingBox.PMax.Y)
     {
         var lastCajaPos = mesh.Position;
         if (FastMath.Abs(movementRay.X) > FastMath.Abs(movementRay.Z))
         {
             //personajePrincipal.playAnimation("Empujar", true);
             mesh.Move(5 * Math.Sign(movementRay.X) * -1, 0, 0);
             DetectarColisionesMovibles(lastCajaPos, mesh);
         }
         else
         if (!(FastMath.Abs(movementRay.X) > FastMath.Abs(movementRay.Z)))
         {
             //personajePrincipal.playAnimation("Empujar", true);
             mesh.Move(0, 0, 5 * Math.Sign(movementRay.Z) * -1);
             DetectarColisionesMovibles(lastCajaPos, mesh);
         }
     }
 }
        public override void Update(float tiempo)
        {
            TGCVector3 posicionSiguiente = plataformaMesh.Position + vectorMovimiento;

            //Si la plataforma colisiona con una pared, cambiamos el sentido de movimiento.
            if (escenario.colisionaCon(plataformaMesh))
            {
                vectorMovimiento.Multiply(-1);
            }

            //Desplazamos la plataforma en el sentido correcto.
            plataformaMesh.Move(vectorMovimiento);
        }
        public TgcBoundingAxisAlignBox ColisionY(Character pj, float ElapsedTime)
        {
            var aabb = Mesh.BoundingBox;

            if (Caida)
            {
                if (Mesh.Position.Y > PosInicial.Y - LongitudCaida)
                {
                    Mesh.Move(new TGCVector3(0f, -ElapsedTime * VelocidadCaida, 0f));
                }
                return(Escenario.EscenarioManual.testAABBAABB(pj.Mesh.BoundingBox, aabb) ? aabb : null);
            }
            if (Escenario.EscenarioManual.testAABBAABB(pj.Mesh.BoundingBox, aabb))
            {
                if (pj.Mesh.BoundingBox.PMin.Y > aabb.PMax.Y - MargenError)
                {
                    pj.SetTipoColisionActual(TiposColision.SinColision);
                    return(aabb);
                }
            }
            return(null);
        }
Beispiel #9
0
        private void animarPlataformas(float deltaTime)
        {
            plataforma1.Move(0, velocidadDesplazamientoPlataformas * direccionDeMovimientoActualPlataforma1 * deltaTime, 0);
            if (FastMath.Abs(plataforma1.Position.Y) > 300f)
            {
                direccionDeMovimientoActualPlataforma1 *= -1;
            }

            plataforma2.Move(0, velocidadDesplazamientoPlataformas * (-direccionDeMovimientoActualPlataforma2) * deltaTime, 0);
            if (FastMath.Abs(plataforma2.Position.Y) > 300f)
            {
                direccionDeMovimientoActualPlataforma2 *= -1;
            }
        }
Beispiel #10
0
        public override void Update(float tiempo)
        {
            TGCVector3 posicionSiguiente = plataformaMesh.Position + vectorMovimiento;

            //Si la plataforma colisiona con el piso, cambiamos el sentido de movimiento.
            if (escenario.colisionaConPiso(plataformaMesh) || escenario.colisionaConLava(plataformaMesh))
            {
                cambiarDirMovimiento();
            }

            //Si la plataforma supera en una cierta cantidad de veces a su altura inicial, cambiamos el sentido de movimiento.
            if (posicionSiguiente.Y >= toleranciaLimiteSuperior * posicionInicial.Y)
            {
                cambiarDirMovimiento();
            }

            //Desplazamos la plataforma en el sentido correcto.
            plataformaMesh.Move(vectorMovimiento);
        }
Beispiel #11
0
        public override void Init()
        {
            //En este ejemplo primero cargamos una escena 3D entera.
            var loader = new TgcSceneLoader();

            scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Scenes\\Ciudad\\Ciudad-TgcScene.xml");

            //Luego cargamos otro modelo aparte que va a hacer el objeto que controlamos con el teclado
            var scene2 = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\Hummer\\Hummer-TgcScene.xml");

            //Solo nos interesa el primer modelo de esta escena (tiene solo uno)
            mainMesh = scene2.Meshes[0];
            mainMesh.AutoTransformEnable = true;
            //Movemos el mesh un poco para arriba. Porque sino choca con el piso todo el tiempo y no se puede mover.
            mainMesh.Move(0, 5, 0);

            //Vamos a utilizar la camara en 3ra persona para que siga al objeto principal a medida que se mueve
            camaraInterna = new TgcThirdPersonCamera(mainMesh.Position, 200, 300);
            Camara        = camaraInterna;
        }
Beispiel #12
0
        private void animarBolasDeCanionYEmisoresDeParticulas(float deltaTime)
        {
            incrementoBola1 = velocidadDesplazamientoBolasDeCanion * deltaTime * (-1);
            incrementoBola2 = velocidadDesplazamientoBolasDeCanion * deltaTime * (-1.5f);
            incrementoBola3 = velocidadDesplazamientoBolasDeCanion * deltaTime * (-2);

            bolaDeCanion1.Move(0, 0, incrementoBola1);
            emisorDeParticulas1.Position = new TGCVector3(emisorDeParticulas1.Position.X, emisorDeParticulas1.Position.Y, emisorDeParticulas1.Position.Z + incrementoBola1);
            distanciaRecorridaBola1      = distanciaRecorridaBola1 + incrementoBola1;
            if (Math.Abs(distanciaRecorridaBola1) > 3000f)
            {
                bolaDeCanion1.Position       = posicionInicialBolaDeCanion1;
                emisorDeParticulas1.Position = posicionInicialEmisorDeParticulas1;
                distanciaRecorridaBola1      = 0f;
            }

            bolaDeCanion2.Move(0, 0, incrementoBola2);
            emisorDeParticulas2.Position = new TGCVector3(emisorDeParticulas2.Position.X, emisorDeParticulas2.Position.Y, emisorDeParticulas2.Position.Z + incrementoBola2);
            distanciaRecorridaBola2      = distanciaRecorridaBola2 + incrementoBola2;
            if (Math.Abs(distanciaRecorridaBola2) > 3000f)
            {
                bolaDeCanion2.Position       = posicionInicialBolaDeCanion2;
                emisorDeParticulas2.Position = posicionInicialEmisorDeParticulas2;
                distanciaRecorridaBola2      = 0f;
            }

            bolaDeCanion3.Move(0, 0, incrementoBola3);
            emisorDeParticulas3.Position = new TGCVector3(emisorDeParticulas3.Position.X, emisorDeParticulas3.Position.Y, emisorDeParticulas3.Position.Z + incrementoBola3);
            distanciaRecorridaBola3      = distanciaRecorridaBola3 + incrementoBola3;
            if (Math.Abs(distanciaRecorridaBola3) > 3000f)
            {
                bolaDeCanion3.Position       = posicionInicialBolaDeCanion3;
                emisorDeParticulas3.Position = posicionInicialEmisorDeParticulas3;
                distanciaRecorridaBola3      = 0f;
            }
        }
Beispiel #13
0
        public override void Update()
        {
            PreUpdate();

            //Obtenemos acceso al objeto que maneja input de mouse y teclado del framework
            var input = Input;

            //Declaramos un vector de movimiento inicializado en cero.
            //El movimiento sobre el suelo es sobre el plano XZ.
            //Sobre XZ nos movemos con las flechas del teclado o con las letas WASD.
            var movement = TGCVector3.Empty;

            //Movernos de izquierda a derecha, sobre el eje X.
            if (input.keyDown(Key.Left) || input.keyDown(Key.A))
            {
                movement.X = 1;
            }
            else if (input.keyDown(Key.Right) || input.keyDown(Key.D))
            {
                movement.X = -1;
            }

            //Movernos adelante y atras, sobre el eje Z.
            if (input.keyDown(Key.Up) || input.keyDown(Key.W))
            {
                movement.Z = -1;
            }
            else if (input.keyDown(Key.Down) || input.keyDown(Key.S))
            {
                movement.Z = 1;
            }

            //Guardar posicion original antes de cambiarla
            var originalPos = mainMesh.Position;

            //Multiplicar movimiento por velocidad y elapsedTime
            movement *= MOVEMENT_SPEED * ElapsedTime;
            mainMesh.Move(movement);

            //Chequear si el objeto principal en su nueva posición choca con alguno de los objetos de la escena.
            //Si es así, entonces volvemos a la posición original.
            //Cada TgcMesh tiene un objeto llamado BoundingBox. El BoundingBox es una caja 3D que representa al objeto
            //de forma simplificada (sin tener en cuenta toda la complejidad interna del modelo).
            //Este BoundingBox se utiliza para chequear si dos objetos colisionan entre sí.
            //El framework posee la clase TgcCollisionUtils con muchos algoritmos de colisión de distintos tipos de objetos.
            //Por ejemplo chequear si dos cajas colisionan entre sí, o dos esferas, o esfera con caja, etc.
            var collisionFound = false;

            foreach (var mesh in scene.Meshes)
            {
                //Los dos BoundingBox que vamos a testear
                var mainMeshBoundingBox  = mainMesh.BoundingBox;
                var sceneMeshBoundingBox = mesh.BoundingBox;

                //Ejecutar algoritmo de detección de colisiones
                var collisionResult = TgcCollisionUtils.classifyBoxBox(mainMeshBoundingBox, sceneMeshBoundingBox);

                //Hubo colisión con un objeto. Guardar resultado y abortar loop.
                if (collisionResult != TgcCollisionUtils.BoxBoxResult.Afuera)
                {
                    collisionFound = true;
                    break;
                }
            }

            //Si hubo alguna colisión, entonces restaurar la posición original del mesh
            if (collisionFound)
            {
                mainMesh.Position = originalPos;
            }

            //Hacer que la camara en 3ra persona se ajuste a la nueva posicion del objeto
            camaraInterna.Target = mainMesh.Position;

            PostUpdate();
        }
Beispiel #14
0
 public void Move(TGCVector3 desplazamiento) => cajaMesh.Move(desplazamiento);
        public override void Update()
        {
            PreUpdate();
            var velocidadCaminar = VELOCIDAD_DESPLAZAMIENTO * ElapsedTime;

            //Calcular proxima posicion de personaje segun Input
            var moving   = false;
            var movement = TGCVector3.Empty;

            //Adelante
            if (Input.keyDown(Key.W))
            {
                movement.Z = velocidadCaminar;
                moving     = true;
            }

            //Atras
            if (Input.keyDown(Key.S))
            {
                movement.Z = -velocidadCaminar;
                moving     = true;
            }

            //Derecha
            if (Input.keyDown(Key.D))
            {
                movement.X = velocidadCaminar;
                moving     = true;
            }

            //Izquierda
            if (Input.keyDown(Key.A))
            {
                movement.X = -velocidadCaminar;
                moving     = true;
            }
            //Salto
            if (Input.keyDown(Key.Space))
            {
                movement.Y = velocidadCaminar;
                moving     = true;
            }
            //Agachar
            if (Input.keyDown(Key.LeftControl))
            {
                movement.Y = -velocidadCaminar;
                moving     = true;
            }
            //Si hubo desplazamiento
            if (moving)
            {
                //Aplicar movimiento, internamente suma valores a la posicion actual del mesh.
                mesh.Move(movement);
            }
            //Hacer que la camara siga al personaje en su nueva posicion
            camaraInterna.Target = mesh.Position;

            //Detectar colision con triangulo
            if (TgcCollisionUtils.testTriangleAABB(TGCVector3.FromVector3(triangle[0].Position), TGCVector3.FromVector3(triangle[1].Position), TGCVector3.FromVector3(triangle[2].Position),
                                                   mesh.BoundingBox))
            {
                triangle[0].Color = Color.Red.ToArgb();
                triangle[1].Color = Color.Red.ToArgb();
                triangle[2].Color = Color.Red.ToArgb();
            }
            else
            {
                triangle[0].Color = Color.Green.ToArgb();
                triangle[1].Color = Color.Green.ToArgb();
                triangle[2].Color = Color.Green.ToArgb();
            }
            //Detectar colision con el otro AABB
            if (TgcCollisionUtils.testAABBAABB(mesh.BoundingBox, box2.BoundingBox))
            {
                box2.Color = Color.Red;
                box2.updateValues();
            }
            else
            {
                box2.Color = Color.Violet;
                box2.updateValues();
            }
            //Detectar colision con la esfera
            if (TgcCollisionUtils.testSphereAABB(boundingSphere, mesh.BoundingBox))
            {
                boundingSphere.setRenderColor(Color.Red);
            }
            else
            {
                boundingSphere.setRenderColor(Color.Yellow);
            }

            //Detectar colision con la obb
            if (TgcCollisionUtils.testObbAABB(obb, mesh.BoundingBox))
            {
                obb.setRenderColor(Color.Red);
            }
            else
            {
                obb.setRenderColor(Color.Yellow);
            }
            PostUpdate();
        }
Beispiel #16
0
 public override void move(TGCVector3 move)
 {
     mesh.Move(move);
 }