public void ajustarCamaraSegunColision(Auto auto, List <ObstaculoRigido> obstaculos) { TgcThirdPersonCamera camera = GuiController.Instance.ThirdPersonCamera; Vector3 segmentA; Vector3 segmentB; camera.generateViewMatrix(out segmentA, out segmentB); //Detectar colisiones entre el segmento de recta camara-personaje y todos los objetos del escenario Vector3 q; float minDistSq = FastMath.Pow2(camera.OffsetForward); foreach (ObstaculoRigido obstaculo in obstaculos) { //Hay colision del segmento camara-personaje y el objeto if (TgcCollisionUtils.intersectSegmentAABB(segmentB, segmentA, obstaculo.mesh.BoundingBox, out q)) { //Si hay colision, guardar la que tenga menor distancia float distSq = (Vector3.Subtract(q, segmentB)).LengthSq(); if (distSq < minDistSq) { minDistSq = distSq; //Le restamos un poco para que no se acerque tanto minDistSq /= 2; } } } //Acercar la camara hasta la minima distancia de colision encontrada (pero ponemos un umbral maximo de cercania) float newOffsetForward = FastMath.Sqrt(minDistSq); camera.OffsetForward = newOffsetForward; }
/// <summary> /// Atender mensaje InformacionInicial /// </summary> private void clienteAtenderInformacionInicial(TgcSocketRecvMsg msg) { //Recibir data var vehiculoData = (VehiculoData)msg.readNext(); //Cargar mesh var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(vehiculoData.meshPath); meshPrincipal = scene.Meshes[0]; //Ubicarlo en escenario meshPrincipal.Position = vehiculoData.initialPos; //Camara en 3ra persona camaraInterna = new TgcThirdPersonCamera(meshPrincipal.Position, 100, 400); camaraInterna.resetValues(); Camera = camaraInterna; //Ver si ya habia mas clientes para cuando nosotros nos conectamos var otrosVehiculosCant = (int)msg.readNext(); for (var i = 0; i < otrosVehiculosCant; i++) { var vData = (VehiculoData)msg.readNext(); crearMeshOtroCliente(vData); } }
public void render(float elapsedTime) { bool showQuadtree = (bool)GuiController.Instance.Modifiers["showQuadtree"]; TgcThirdPersonCamera camera = GuiController.Instance.ThirdPersonCamera; quadtree.render(GuiController.Instance.Frustum, showQuadtree); if (Shared.debugMode) { foreach (TgcMesh objeto in objetos) { objeto.BoundingBox.render(); } } foreach (TgcSimpleTerrain terreno in this.terrenos) { terreno.render(); } foreach (TgcBox caja in this.cajas) { caja.render(); } checkpointActual.render(elapsedTime); checkpointActual.obb.rotate(new Vector3(0, 5f * elapsedTime, 0)); if (Shared.debugMode) { checkpointActual.obb.render(); } cielo.render(); }
public EjemploAlumno() { this.escenario = new Escenario(); this.camara = new TgcThirdPersonCamera(); this.llegada = new Vector3(1800, 0, 1700); this.explosion = new Explosion(); this.personaje = new Personaje(this.camara, this.explosion); this.patrulla = new PatrullaPhong(); this.fin = new Fin(); distanceTargetText = new TgcText2d(); distanceTargetText.Position = new Point(0, 40); distanceTargetText.Color = Color.White; onTargetPosition = new TgcText2d(); onTargetPosition.Position = new Point(0, 60); onTargetPosition.Color = Color.Red; onTargetPosition.Text = "Presione la tecla K"; lifeText = new TgcText2d(); lifeText.Position = new Point(-400, 400); try { lifeText.changeFont(new System.Drawing.Font(new FontFamily("Asrock7Segment"), 25)); } catch { lifeText.changeFont(new System.Drawing.Font(lifeText.D3dFont.Description.FaceName, 25)); } lifeText.Color = Color.Yellow; }
public MotionBlur(TgcThirdPersonCamera cam, GameModel gm) { camara = cam; gameModel = gm; meshes = gm.MapScene.Meshes; Init(); }
public CamaraTerceraPersona(TgcThirdPersonCamera camaraTgc, Vector3 posicion, TgcFrustum frustum, Device d3dDevice) { //this.camaraTgc = camaraTgc; //this.camaraTgc.Enable = true; //this.camaraTgc.setCamera(posicion, 0, -300); //this.frustum = frustum; //this.d3dDevice = d3dDevice; }
public TgcCamera camaraSeguirEsteAuto(GameModel model) { Vector3 v = Mesh.Position; CamaraAuto = new TgcThirdPersonCamera(v, 150, 300f); //motionBlur = new MotionBlur(CamaraAuto, model); GameModel.Niebla.CargarCamara(CamaraAuto); return(CamaraAuto); }
/// <summary> /// Crea todos los modulos necesarios de la aplicacion /// </summary> internal void initGraphics(MainForm mainForm, Control panel3d) { this.mainForm = mainForm; this.panel3d = panel3d; this.fullScreenPanel = new FullScreenPanel(); panel3d.Focus(); //Iniciar graficos this.tgcD3dDevice = new TgcD3dDevice(panel3d); this.texturesManager = new TgcTexture.Manager(); this.tgcD3dDevice.OnResetDevice(tgcD3dDevice.D3dDevice, null); //Iniciar otras herramientas this.texturesPool = new TgcTexture.Pool(); this.logger = new Logger(mainForm.LogConsole); this.text3d = new TgcDrawText(tgcD3dDevice.D3dDevice); this.tgcD3dInput = new TgcD3dInput(mainForm, panel3d); this.fpsCamera = new TgcFpsCamera(); this.rotCamera = new TgcRotationalCamera(); this.thirdPersonCamera = new TgcThirdPersonCamera(); this.axisLines = new TgcAxisLines(tgcD3dDevice.D3dDevice); this.userVars = new TgcUserVars(mainForm.getDataGridUserVars()); this.modifiers = new TgcModifiers(mainForm.getModifiersPanel()); this.elapsedTime = -1; this.frustum = new TgcFrustum(); this.mp3Player = new TgcMp3Player(); this.directSound = new TgcDirectSound(); this.fog = new TgcFog(); this.currentCamera = this.rotCamera; this.customRenderEnabled = false; this.drawer2D = new TgcDrawer2D(); this.shaders = new TgcShaders(); //toogles this.rotCamera.Enable = true; this.fpsCamera.Enable = false; this.thirdPersonCamera.Enable = false; this.fpsCounterEnable = true; this.axisLines.Enable = true; //Cargar algoritmos exampleLoader = new ExampleLoader(); examplesDir = System.Environment.CurrentDirectory + "\\" + ExampleLoader.EXAMPLES_DIR + "\\"; examplesMediaDir = examplesDir + "Media" + "\\"; alumnoEjemplosDir = System.Environment.CurrentDirectory + "\\" + "AlumnoEjemplos" + "\\"; alumnoEjemplosMediaDir = alumnoEjemplosDir + "AlumnoMedia" + "\\"; exampleLoader.loadExamplesInGui(mainForm.TreeViewExamples, new string[] { examplesDir, alumnoEjemplosDir }); //Cargar shaders del framework this.shaders.loadCommonShaders(); //Cargar ejemplo default TgcExample defaultExample = exampleLoader.getExampleByName(mainForm.Config.defaultExampleName, mainForm.Config.defaultExampleCategory); executeExample(defaultExample); }
public override void Init() { //Objetos en movimiento. colliderCylinder = new TgcBoundingCylinder(new Vector3(0, 0, 0), 2, 4); colliderCylinder.setRenderColor(Color.LimeGreen); colliderCylinderFixedY = new TgcBoundingCylinderFixedY(new Vector3(0, 0, 0), 2, 4); colliderCylinderFixedY.setRenderColor(Color.LimeGreen); //Cargar personaje con animaciones var skeletalLoader = new TgcSkeletalLoader(); personaje = skeletalLoader.loadMeshAndAnimationsFromFile( MediaDir + "SkeletalAnimations\\Robot\\Robot-TgcSkeletalMesh.xml", MediaDir + "SkeletalAnimations\\Robot\\", new[] { MediaDir + "SkeletalAnimations\\Robot\\Caminando-TgcSkeletalAnim.xml", MediaDir + "SkeletalAnimations\\Robot\\Parado-TgcSkeletalAnim.xml" }); //Configurar animacion inicial personaje.playAnimation("Parado", true); //Escalarlo porque es muy grande personaje.Scale = new Vector3(0.04f, 0.04f, 0.04f); //El personaje esta en el 0,0,0 hay que bajarlo var size = personaje.BoundingBox.PMax.Y - personaje.BoundingBox.PMin.Y; personaje.Position = new Vector3(0, -3f, 0); //Rotarlo 180° porque esta mirando para el otro lado personaje.rotateY(FastMath.PI); //Objetos estaticos, pueden ser mesh o objetos simplificados. var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\Patrullero\\Patrullero-TgcScene.xml"); collisionableMeshAABB = scene.Meshes[0]; collisionableMeshAABB.Scale = new Vector3(0.1f, 0.1f, 0.1f); collisionableMeshAABB.Position = new Vector3(6, 0, -2); collisionableCylinder = new TgcBoundingCylinderFixedY(new Vector3(-6, 0, 0), 2, 2); collisionableSphere = new TgcBoundingSphere(new Vector3(-3, 0, 10), 3); Modifiers.addBoolean("fixedY", "use fixed Y", true); //Modifier para ver BoundingBox del personaje Modifiers.addBoolean("showBoundingBox", "Personaje Bouding Box", false); Modifiers.addVertex2f("size", new Vector2(1, 1), new Vector2(5, 10), new Vector2(2, 5)); var angle = FastMath.TWO_PI; Modifiers.addVertex3f("rotation", new Vector3(-angle, -angle, -angle), new Vector3(angle, angle, angle), new Vector3(FastMath.TWO_PI / 8, 0, FastMath.TWO_PI / 8)); //Configurar camara en Tercer Persona camaraInterna = new TgcThirdPersonCamera(personaje.Position, 25, -45); Camara = camaraInterna; }
public MainCamera(Ship newShip) { this.ship = newShip; camera = GuiController.Instance.ThirdPersonCamera; camera.Enable = true; wheelPos = input.WheelPos; objetive = ship.mesh.Position; //Configurar centro al que se mira y distancia desde la que se mira camera.setCamera(objetive, ALTURA, DISTANCIA); }
public ConfiguracionPartido(string pathRecursos, int width, TgcThirdPersonCamera camara, EjemploAlumno main) { //Titulo this.titulo = new TgcText2D(); this.titulo.Text = "Configuración del partido"; this.titulo.Color = Color.White; this.titulo.Align = TgcText2D.TextAlign.CENTER; this.titulo.Size = new Size(400, 100); this.titulo.changeFont(new System.Drawing.Font("Arial", 24)); this.titulo.Position = new Point((width - this.titulo.Size.Width) / 2, 20); //Menu this.menus = new List <MenuItem>(); this.menus.Add(new MenuItem("listo", new Vector3(-7, 4, 0), new Vector3(14, 2, 0), pathRecursos + "Menu\\listo.png", pathRecursos + "Menu\\listo-seleccionado.png")); this.menus.Add(new MenuItem("uniformeLocal", new Vector3(-7, 1, 0), new Vector3(14, 4, 0), pathRecursos + "Menu\\local.png", pathRecursos + "Menu\\local-seleccionado.png")); this.menus.Add(new MenuItem("uniformeVisitante", new Vector3(-7, -3, 0), new Vector3(14, 4, 0), pathRecursos + "Menu\\visitante.png", pathRecursos + "Menu\\visitante-seleccionado.png")); this.menus.Add(new MenuItem("pelota", new Vector3(7, 3.2f, 0), new Vector3(14, 4, 0), pathRecursos + "Menu\\pelota.png", pathRecursos + "Menu\\pelota-seleccionado.png")); this.menus.Add(new MenuItem("camara", new Vector3(7, 0.2f, 0), new Vector3(14, 2, 0), pathRecursos + "Menu\\camara.png", pathRecursos + "Menu\\camara-seleccionado.png")); this.menus.Add(new MenuItem("volver", new Vector3(7, -2.2f, 0), new Vector3(14, 2, 0), pathRecursos + "Menu\\volver.png", pathRecursos + "Menu\\volver-seleccionado.png")); //Pelotas this.pelotas = new List <TgcSphere>(); //TODO cambiar por matrices this.pelotas.Add(this.CrearPelota(pathRecursos, new Vector3(10, 3.2f, 0), TgcTexture.createTexture(pathRecursos + Settings.Default.textureBall))); this.pelotas.Add(this.CrearPelota(pathRecursos, new Vector3(10, 3.2f, 0), TgcTexture.createTexture(pathRecursos + "Texturas\\pelota2.jpg"))); this.pelotas.Add(this.CrearPelota(pathRecursos, new Vector3(10, 3.2f, 0), TgcTexture.createTexture(pathRecursos + "Texturas\\pelota3.jpg"))); //Jugadores this.jugadores = new List <TgcSkeletalMesh>(); this.jugadores.Add(this.CrearJugador(pathRecursos, TgcTexture.createTexture(pathRecursos + Settings.Default.meshFolderPlayer + Settings.Default.textureTeam1))); this.jugadores.Add(this.CrearJugador(pathRecursos, TgcTexture.createTexture(pathRecursos + Settings.Default.meshFolderPlayer + Settings.Default.textureTeam2))); this.jugadores.Add(this.CrearJugador(pathRecursos, TgcTexture.createTexture(pathRecursos + Settings.Default.meshFolderPlayer + "Textures\\uvw.jpg"))); this.jugadores.Add(this.CrearJugador(pathRecursos, TgcTexture.createTexture(pathRecursos + Settings.Default.meshFolderPlayer + "Textures\\uvwBlack.png"))); this.jugadores.Add(this.CrearJugador(pathRecursos, TgcTexture.createTexture(pathRecursos + Settings.Default.meshFolderPlayer + "Textures\\uvwOrange.png"))); this.jugadores.Add(this.CrearJugador(pathRecursos, TgcTexture.createTexture(pathRecursos + Settings.Default.meshFolderPlayer + "Textures\\uvwViolet.png"))); //Camaras this.camaras = new List <TgcText2D>(); this.camaras.Add(this.CrearCamara("Pelota", width)); //this.camaras.Add(this.CrearCamara("Jugador", screenSize)); this.camaras.Add(this.CrearCamara("Aérea", width)); this.menus[0].Select(); this.pelota = 0; this.jugadorLocal = 0; this.jugadorVisitante = 1; this.camaraSeleccionada = 0; this.positionJugadorLocal = new Vector3(-4, -0.1f, 0); this.positionJugadorVisitante = new Vector3(-4, -4, 0); this.camara = camara; this.main = main; }
/// <summary> /// Iniciar cliente /// </summary> private void initClient() { //Crear piso var pisoTexture = TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\Quake\\TexturePack2\\rock_wall.jpg"); piso = TGCBox.fromSize(new TGCVector3(0, -60, 0), new TGCVector3(5000, 5, 5000), pisoTexture); //Camara en 3ra persona camaraInterna.resetValues(); camaraInterna = new TgcThirdPersonCamera(meshPrincipal.Position, 100, 400); Camara = camaraInterna; }
public Personaje(TgcThirdPersonCamera camaraParametro, Explosion explosion) { //Crear personaje TgcSkeletalLoader skeletalLoader = new TgcSkeletalLoader(); this.personaje = skeletalLoader.loadMeshAndAnimationsFromFile( GuiController.Instance.ExamplesMediaDir + "SkeletalAnimations\\BasicHuman\\" + "CS_Arctic-TgcSkeletalMesh.xml", GuiController.Instance.ExamplesMediaDir + "SkeletalAnimations\\BasicHuman\\", new string[] { GuiController.Instance.ExamplesMediaDir + "SkeletalAnimations\\BasicHuman\\Animations\\" + "Walk-TgcSkeletalAnim.xml", GuiController.Instance.ExamplesMediaDir + "SkeletalAnimations\\BasicHuman\\Animations\\" + "StandBy-TgcSkeletalAnim.xml", GuiController.Instance.ExamplesMediaDir + "SkeletalAnimations\\BasicHuman\\Animations\\" + "Jump-TgcSkeletalAnim.xml", GuiController.Instance.ExamplesMediaDir + "SkeletalAnimations\\BasicHuman\\Animations\\" + "Run-TgcSkeletalAnim.xml", GuiController.Instance.ExamplesMediaDir + "SkeletalAnimations\\BasicHuman\\Animations\\" + "HighKick-TgcSkeletalAnim.xml", GuiController.Instance.ExamplesMediaDir + "SkeletalAnimations\\BasicHuman\\Animations\\" + "Talk-TgcSkeletalAnim.xml", GuiController.Instance.AlumnoEjemplosMediaDir + "Kamikaze3D\\Animations\\WeaponPos-TgcSkeletalAnim.xml", GuiController.Instance.AlumnoEjemplosMediaDir + "Kamikaze3D\\Animations\\Muerte-TgcSkeletalAnim.xml", }); //Configurar animacion inicial this.personaje.playAnimation("StandBy", true); //Escalarlo y posicionarlo this.personaje.Position = new Vector3(-100f, 3.5f, -340f); this.personaje.Scale = new Vector3(0.7f, 0.7f, 0.7f); //Rotarlo 180° porque esta mirando para el otro lado this.personaje.rotateY(Geometry.DegreeToRadian(180f)); this.personaje.AutoUpdateBoundingBox = false; //Crear manejador de colisiones this.collisionManager = new SphereCollisionManager(); this.collisionManager.GravityEnabled = false; this.characterSphere = new TgcBoundingSphere(personaje.BoundingBox.calculateBoxCenter(), personaje.BoundingBox.calculateBoxRadius()); //Crear linea para mostrar la direccion del movimiento del personaje this.directionArrow = new TgcArrow(); this.directionArrow.BodyColor = Color.Red; this.directionArrow.HeadColor = Color.Green; this.directionArrow.Thickness = 1; this.directionArrow.HeadSize = new Vector2(10, 20); this.camara = camaraParametro; this.weapon = new Weapon(personaje.Position); //Agregar el arma al personaje this.addWeapon(personaje, weapon); this.explosion = explosion; }
/// <summary> /// Iniciar cliente /// </summary> private void initClient() { //Crear piso var pisoTexture = TgcTexture.createTexture(D3DDevice.Instance.Device, GuiController.Instance.ExamplesMediaDir + "Texturas\\Quake\\TexturePack2\\rock_wall.jpg"); piso = TgcBox.fromSize(new Vector3(0, -60, 0), new Vector3(5000, 5, 5000), pisoTexture); //Camara en 3ra persona this.camara = new TgcThirdPersonCamera(); CamaraManager.Instance.CurrentCamera = this.camara; this.camara.Enable = true; }
public MenuInicial(string pathRecursos, TgcThirdPersonCamera camara, EjemploAlumno main) { this.main = main; this.camara = camara; this.drawer2D = new Drawer2D(); //Titulo this.titulo = new TgcText2D(); this.titulo.Text = "Socketes"; this.titulo.Color = Color.White; this.titulo.Align = TgcText2D.TextAlign.CENTER; this.titulo.Position = new Point(280, 0); this.titulo.Size = new Size(400, 100); this.titulo.changeFont(new System.Drawing.Font("Arial", 35)); //Brazuca this.pelota = new TgcSphere(); //TODO cambiar por matrices this.pelota.AutoTransformEnable = true; this.pelota.setTexture(TgcTexture.createTexture(pathRecursos + Settings.Default.textureBall)); this.pelota.Radius = 2.5f; this.pelota.LevelOfDetail = 4; this.pelota.Position = new Vector3(3, 0, -4); this.pelota.updateValues(); //Cancha donde esta la pelota this.cancha = TgcBox.fromSize(new Vector3(20, 0, 20), TgcTexture.createTexture(pathRecursos + Settings.Default.textureMenuField)); //TODO cambiar por matrices this.cancha.AutoTransformEnable = true; this.cancha.Position = new Vector3(0, -2.5f, 0); //Menu this.menus = new List <MenuItem>(); this.menus.Add(new MenuItem("picadito", new Vector3(-5, 2, 0), new Vector3(8, 1, 0), pathRecursos + Settings.Default.texturePicadito1, pathRecursos + Settings.Default.texturePicadito2)); this.menus.Add(new MenuItem("configuracion", new Vector3(-5, 0.8f, 0), new Vector3(8, 1, 0), pathRecursos + Settings.Default.textureControles1, pathRecursos + Settings.Default.textureControles2)); this.menus.Add(new MenuItem("salir", new Vector3(-5, -0.4f, 0), new Vector3(8, 1, 0), pathRecursos + Settings.Default.textureSalir1, pathRecursos + Settings.Default.textureSalir2)); this.menus[0].Select(); //Menu de configuracion //Crear Sprite this.panelConfiguracion = new CustomSprite(); this.panelConfiguracion.Bitmap = new CustomBitmap(pathRecursos + Settings.Default.texturePanelcontroles, D3DDevice.Instance.Device); this.panelConfiguracion.Scaling = new Vector2(0.75f, 0.75f); Size textureSize = this.panelConfiguracion.Bitmap.Size; this.panelConfiguracion.Position = new Vector2(FastMath.Max(D3DDevice.Instance.Width / 2 - textureSize.Width / 2, 0), FastMath.Max(D3DDevice.Instance.Height / 2 - textureSize.Height / 2, 0)); }
public void init(TgcThirdPersonCamera camara, Personaje personaje) { this.camara = camara; this.personaje = personaje; //Crear loader TgcSceneLoader loader = new TgcSceneLoader(); this.scene = loader.loadSceneFromFile(GuiController.Instance.AlumnoEjemplosMediaDir + "Kamikaze3D\\Explosion\\Explosion-TgcScene.xml"); foreach (TgcMesh mesh in this.scene.Meshes) { mesh.Scale = new Vector3(0, 0, 0); } }
public override void Init() { var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\Patrullero\\Patrullero-TgcScene.xml"); mesh = scene.Meshes[0]; mesh.Scale = new Vector3(0.25f, 0.25f, 0.25f); //Cuerpo principal que se controla con el teclado //mesh = TgcBox.fromSize(new Vector3(0, 10, 0), new Vector3(10, 10, 10), Color.Blue).toMesh("box"); //triangulo triangle = new CustomVertex.PositionColored[3]; triangle[0] = new CustomVertex.PositionColored(-100, 0, 0, Color.Green.ToArgb()); triangle[1] = new CustomVertex.PositionColored(0, 0, 50, Color.Green.ToArgb()); triangle[2] = new CustomVertex.PositionColored(0, 100, 0, Color.Green.ToArgb()); triagleAABB = TgcBoundingAxisAlignBox.computeFromPoints(new[] { triangle[0].Position, triangle[1].Position, triangle[2].Position }); //box2 box2 = TgcBox.fromSize(new Vector3(-50, 10, -20), new Vector3(15, 15, 15), Color.Violet); //sphere boundingSphere = new TgcBoundingSphere(new Vector3(30, 20, -20), 15); //OBB: computar OBB a partir del AABB del mesh. meshObb = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Objetos\\Catapulta\\Catapulta-TgcScene.xml") .Meshes[0]; meshObb.Scale = new Vector3(0.1f, 0.1f, 0.1f); meshObb.Position = new Vector3(100, 0, 30); meshObb.updateBoundingBox(); //Computar OBB a partir del AABB del mesh. Inicialmente genera el mismo volumen que el AABB, pero luego te permite rotarlo (cosa que el AABB no puede) obb = TgcBoundingOrientedBox.computeFromAABB(meshObb.BoundingBox); //Otra alternativa es computar OBB a partir de sus vertices. Esto genera un OBB lo mas apretado posible pero es una operacion costosa //obb = TgcBoundingOrientedBox.computeFromPoints(mesh.getVertexPositions()); //Rotar mesh y rotar OBB. A diferencia del AABB, nosotros tenemos que mantener el OBB actualizado segun cada movimiento del mesh meshObb.Rotation = new Vector3(0, FastMath.PI / 4, 0); //Los obb tienen una especie de autotransform aun. obb.rotate(new Vector3(0, FastMath.PI / 4, 0)); //Configurar camara en Tercer Persona camaraInterna = new TgcThirdPersonCamera(mesh.Position, 30, -75); Camara = camaraInterna; }
/// <summary> /// Ajustar la posicion de la camara segun la colision con los objetos del escenario. /// Acerca la distancia entre el persona y la camara si hay colisiones de objetos /// en el medio /// </summary> private void ajustarPosicionDeCamara(TgcSkeletalMesh personaje, List <TgcBox> obstaculos) { //Actualizar valores de camara segun modifiers TgcThirdPersonCamera camera = GuiController.Instance.ThirdPersonCamera; camera.OffsetHeight = (float)GuiController.Instance.Modifiers["offsetHeight"]; camera.OffsetForward = (float)GuiController.Instance.Modifiers["offsetForward"]; Vector2 displacement = (Vector2)GuiController.Instance.Modifiers["displacement"]; camera.TargetDisplacement = new Vector3(displacement.X, displacement.Y, 0); //Pedirle a la camara cual va a ser su proxima posicion Vector3 segmentA; Vector3 segmentB; camera.generateViewMatrix(out segmentA, out segmentB); //Detectar colisiones entre el segmento de recta camara-personaje y todos los objetos del escenario Vector3 q; float minDistSq = FastMath.Pow2(camera.OffsetForward); foreach (TgcBox obstaculo in obstaculos) { //Hay colision del segmento camara-personaje y el objeto if (TgcCollisionUtils.intersectSegmentAABB(segmentB, segmentA, obstaculo.BoundingBox, out q)) { //Si hay colision, guardar la que tenga menor distancia float distSq = (Vector3.Subtract(q, segmentB)).LengthSq(); if (distSq < minDistSq) { minDistSq = distSq; //Le restamos un poco para que no se acerque tanto minDistSq /= 2; } } } //Acercar la camara hasta la minima distancia de colision encontrada (pero ponemos un umbral maximo de cercania) float newOffsetForward = -FastMath.Sqrt(minDistSq); /* * if(newOffsetForward < 10) * { * newOffsetForward = 10; * }*/ camera.OffsetForward = newOffsetForward; }
public override void Update(GameModel gameModel, TgcThirdPersonCamera camaraInterna, ModoCamara modoCamara) { // Determinar que la simulación del mundo físico se va a procesar 60 veces por segundo world.StepSimulation(1 / 60f, 30); // Actualizar parametros del Shader explosionFX.SetValue("time", time); // Actualizar variables de control UpdateControlVariables(gameModel.ElapsedTime); // Actualizar variables del jugador que requieren calculos complejos una sola vez player1.UpdateInternalValues(); enemy.UpdateInternalValues(); // Si el jugador cayó a más de 100 unidades en Y, se lo hace respawnear if (player1.RigidBody.CenterOfMassPosition.Y < -100) { player1.Respawn(inflictDmg, initialPosP1, 0f); } // Si el enemigo cayó a más de 100 unidades en Y, se lo hace respawnear if (enemy.RigidBody.CenterOfMassPosition.Y < -100) { enemy.Respawn(false, initialPosEnemy, FastMath.PI); } // Intenta enderezar si hace falta player1.TryStraighten(gameModel.ElapsedTime); enemy.TryStraighten(gameModel.ElapsedTime); // Manejar los inputs del teclado y joystick player1.ReactToInputs(gameModel, this); // Accion del enemigo enemy.TakeAction(gameModel, this); // Activar Información de Debug if (gameModel.Input.keyPressed(Key.F5)) { showInfo = !showInfo; } // Metodo que se encarga de manejar las colisiones según corresponda CollisionsHandler(gameModel); // Ajustar la posicion de la cámara segun la colisión con los objetos del escenario AdjustCameraPosition(camaraInterna, modoCamara); }
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]; //Vamos a utilizar la cámara en 3ra persona para que siga al objeto principal a medida que se mueve camaraInterna = new TgcThirdPersonCamera(mainMesh.Position, 200, 300); Camara = camaraInterna; }
public override void Init() { //Cargar escena var loader = new TgcSceneLoader(); scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Scenes\\Ciudad\\Ciudad-TgcScene.xml"); //Cargar mesh principal mainMesh = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\Hummer\\Hummer-TgcScene.xml") .Meshes[0]; //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); //Camera en 3ra persona camaraInterna = new TgcThirdPersonCamera(mainMesh.Position, 200, 300); Camara = camaraInterna; }
public override void Init() { //Cargar suelo var texture = TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\granito.jpg"); suelo = new TgcPlane(new TGCVector3(-5000, 0, -5000), new TGCVector3(10000, 0f, 10000), TgcPlane.Orientations.XZplane, texture); //Iniciarlizar PickingRay pickingRay = new TgcPickingRay(Input); //Cargar nave var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\NaveEspacial\\NaveEspacial-TgcScene.xml"); mesh = scene.Meshes[0]; //Rotación original de la malla, hacia -Z originalMeshRot = new TGCVector3(0, 0, -1); //Manipulamos los movimientos del mesh a mano mesh.AutoTransform = false; meshRotationMatrix = TGCMatrix.Identity; newPosition = mesh.Position; applyMovement = false; //Crear caja para marcar en que lugar hubo colision collisionPointMesh = TGCBox.fromSize(new TGCVector3(3, 100, 3), Color.Red); //Flecha para marcar la dirección directionArrow = new TgcArrow(); directionArrow.Thickness = 5; directionArrow.HeadSize = new TGCVector2(10, 10); //Camara en tercera persona camaraInterna = new TgcThirdPersonCamera(mesh.Position, 800, 1500); Camara = camaraInterna; speedModifier = AddFloat("speed", 1000, 5000, 2500); }
/// <summary> /// Método que se llama cada vez que hay que refrescar la pantalla. /// Escribir aquí todo el código referido al renderizado. /// </summary> /// <param name="elapsedTime">Tiempo en segundos transcurridos desde el último frame</param> public void render(float elapsedTime, TgcThirdPersonCamera camara) { for (int i = 0; i < this.cuadras.Length; i++) { this.cuadras[i].render(elapsedTime, camara); } //Cargar los valores de la Niebla /*if (explosion.estaEjecutandose()) * GuiController.Instance.Fog.Enabled = false; * else * GuiController.Instance.Fog.Enabled = (bool)GuiController.Instance.Modifiers["Enabled"]; * GuiController.Instance.Fog.StartDistance = (float)GuiController.Instance.Modifiers["startDistance"]; * GuiController.Instance.Fog.EndDistance = (float)GuiController.Instance.Modifiers["endDistance"]; * GuiController.Instance.Fog.Density = (float)GuiController.Instance.Modifiers["density"]; * GuiController.Instance.Fog.Color = (Color)GuiController.Instance.Modifiers["color"];*/ //Actualizar valores de la Niebla /*GuiController.Instance.Fog.updateValues();*/ }
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]; //Movemos el mesh un poco para arriba. Porque sino choca con el piso todo el tiempo y no se puede mover. mainMesh.Position = new TGCVector3(0, 5, 0); mainMesh.Transform = TGCMatrix.Translation(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); Camera = camaraInterna; }
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"); //scene = loader.loadSceneFromFile(MediaDir + "4toPiso\\Extract\\4toPiso-TgcScene.xml"); /* C:\Users\llain2\Documents\TGC\Viewer\Media\4toPiso\Extract * //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]; * <<<<<<< HEAD * ======= * mainMesh.AutoTransformEnable = true; * >>>>>>> master * //Movemos el mesh un poco para arriba. Porque sino choca con el piso todo el tiempo y no se puede mover. * mainMesh.Position = new TGCVector3(0, 50, 0); * mainMesh.UpdateMeshTransform();*/ physicsExample = new CubePhysic(); //physicsExample.setHummer(mainMesh); scene.Meshes[0].Position = TGCVector3.Empty; physicsExample.setBuildings(scene.Meshes); physicsExample.Init(MediaDir); //Vamos a utilizar la camara en 3ra persona para que siga al objeto principal a medida que se mueve camaraInterna = new TgcThirdPersonCamera(physicsExample.getPositionHummer(), 250, 375); Camara = camaraInterna; UserVars.addVar("HummerPositionX"); UserVars.addVar("HummerPositionY"); UserVars.addVar("HummerPositionZ"); UserVars.addVar("HummerBodyPositionX"); UserVars.addVar("HummerBodyPositionY"); UserVars.addVar("HummerBodyPositionZ"); }
/// <summary> /// Carga el shader para cada objeto de la cuadra e inicializa sus valores estaticos /// </summary> /*private void loadShader() * { * Microsoft.DirectX.Direct3D.Device d3dDevice = GuiController.Instance.D3dDevice; * * string compilationErrors; * * //Carga el shader * foreach (VoidMeshShader obj in this.objects) * { * obj.Effect = Microsoft.DirectX.Direct3D.Effect.FromFile(d3dDevice, GuiController.Instance.AlumnoEjemplosMediaDir + "Kamikaze3D\\Shader\\VoidShader3.2.fx", null, null, ShaderFlags.None, null, out compilationErrors); * if (obj.Effect == null) * { * throw new Exception("Error al cargar shader. Errores: " + compilationErrors); * } * * //Definir tecnica por default * obj.Effect.Technique = "VoidFullTransformationTechnique"; * * //Colorea las zonas por defecto del Modelo * obj.setColor(Color.White); * * //Cargar variables constantes del shader * obj.Effect.SetValue("fvAmbient", ColorValue.FromColor(this.ambientColor)); * obj.Effect.SetValue("fvDiffuse", ColorValue.FromColor(this.diffuseColor)); * obj.Effect.SetValue("fvSpecular", ColorValue.FromColor(Color.FromArgb(190, 190, 190))); * if (obj.Name == "Bloque") * obj.Effect.SetValue("fvSpecularIntensity", 0.28f); * else * obj.Effect.SetValue("fvSpecularIntensity", 0.95f); * } * }*/ /// <summary> /// Establece los valores dinamicos del shader /// </summary> /*public void updateShader(Vector3 lightPosition, Vector3 camaraPosition) * { * Microsoft.DirectX.Direct3D.Device d3dDevice = GuiController.Instance.D3dDevice; * * foreach (VoidMeshShader obj in this.objects) * { * obj.Effect.SetValue("fvLightPosition", TgcParserUtils.vector3ToFloat3Array(lightPosition)); * obj.Effect.SetValue("fvEyePosition", TgcParserUtils.vector3ToFloat3Array(camaraPosition)); * obj.Effect.SetValue("matView", d3dDevice.Transform.View); * obj.Effect.SetValue("matProjection", d3dDevice.Transform.Projection); * obj.Effect.SetValue("matWorld", obj.Transform); * } * }*/ /// <summary> /// Método que se llama cada vez que hay que refrescar la pantalla. /// Escribir aquí todo el código referido al renderizado. /// </summary> /// <param name="elapsedTime">Tiempo en segundos transcurridos desde el último frame</param> public void render(float elapsedTime, TgcThirdPersonCamera camara) { //Ver cual de las mallas se interponen en la visión de la cámara en 3ra persona. List <TgcMesh> objectsInFront = new List <TgcMesh>(); foreach (TgcMesh mesh in this.scene.Meshes) { Vector3 q; if (mesh.Name == "Vereda" || mesh.Name == "Bloque") //Vereda y calle siempre visible { objectsInFront.Add(mesh); } else if (!TgcCollisionUtils.intersectSegmentAABB(camara.Position, camara.Target, mesh.BoundingBox, out q)) { if (String.Compare(mesh.Name, 0, "Box", 0, 3) != 0) //No renderizar bloques azules { objectsInFront.Add(mesh); } } } //Render mallas que no se interponen foreach (TgcMesh mesh in objectsInFront) { mesh.render(); } /*foreach (TgcMesh mesh in this.scene.Meshes) * { * //Nos ocupamos solo de las mallas habilitadas * if (mesh.Enabled) * { * //Solo mostrar la malla si colisiona contra el Frustum * TgcCollisionUtils.FrustumResult r = TgcCollisionUtils.classifyFrustumAABB(this.frustum, mesh.BoundingBox); * if (r != TgcCollisionUtils.FrustumResult.OUTSIDE) * mesh.render(); * } * }*/ }
public override void Init() { //Cuerpo principal que se controla con el teclado box = TgcBox.fromSize(new Vector3(0, 10, 0), new Vector3(10, 10, 10), Color.Blue); //triangulo triangle = new CustomVertex.PositionColored[3]; triangle[0] = new CustomVertex.PositionColored(-100, 0, 0, Color.Red.ToArgb()); triangle[1] = new CustomVertex.PositionColored(0, 0, 50, Color.Green.ToArgb()); triangle[2] = new CustomVertex.PositionColored(0, 100, 0, Color.Blue.ToArgb()); triagleAABB = TgcBoundingBox.computeFromPoints(new[] { triangle[0].Position, triangle[1].Position, triangle[2].Position }); //box2 box2 = TgcBox.fromSize(new Vector3(-50, 10, -20), new Vector3(15, 15, 15), Color.Violet); //sphere sphere = new TgcBoundingSphere(new Vector3(30, 20, -20), 15); //OBB: computar OBB a partir del AABB del mesh. var loader = new TgcSceneLoader(); var meshObb = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\StarWars-ATST\\StarWars-ATST-TgcScene.xml") .Meshes[0]; obb = TgcObb.computeFromAABB(meshObb.BoundingBox); meshObb.dispose(); obb.move(new Vector3(100, 0, 30)); obb.setRotation(new Vector3(0, FastMath.PI / 4, 0)); //Configurar camara en Tercer Persona camaraInterna = new TgcThirdPersonCamera(box.Position, 30, -75); Camara = camaraInterna; }
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"); physicsExample = new CubePhysic(); //physicsExample.setHummer(mainMesh); scene.Meshes[0].Position = TGCVector3.Empty; physicsExample.setBuildings(scene.Meshes); physicsExample.Init(MediaDir); //Vamos a utilizar la camara en 3ra persona para que siga al objeto principal a medida que se mueve camaraInterna = new TgcThirdPersonCamera(physicsExample.getPositionHummer(), 250, 375); Camara = camaraInterna; UserVars.addVar("HummerPositionX"); UserVars.addVar("HummerPositionY"); UserVars.addVar("HummerPositionZ"); UserVars.addVar("HummerBodyPositionX"); UserVars.addVar("HummerBodyPositionY"); UserVars.addVar("HummerBodyPositionZ"); }
public override void Init() { //Crear piso var pisoTexture = TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\tierra.jpg"); piso = new TgcPlane(TGCVector3.Empty, new TGCVector3(2000, 0, 2000), TgcPlane.Orientations.XZplane, pisoTexture, 50f, 50f); //Cargar obstaculos y posicionarlos. Los obstáculos se crean con TgcBox en lugar de cargar un modelo. obstaculos = new List <TGCBox>(); TGCBox obstaculo; float wallSize = 1000; float wallHeight = 500; //Obstaculo 1 obstaculo = TGCBox.fromExtremes(TGCVector3.Empty, new TGCVector3(wallSize, wallHeight, 10), TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\baldosaFacultad.jpg")); obstaculo.Transform = TGCMatrix.Translation(obstaculo.Position); obstaculos.Add(obstaculo); //Obstaculo 2 obstaculo = TGCBox.fromExtremes(TGCVector3.Empty, new TGCVector3(10, wallHeight, wallSize), TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\madera.jpg")); obstaculo.Transform = TGCMatrix.Translation(obstaculo.Position); obstaculos.Add(obstaculo); //Obstaculo 3 obstaculo = TGCBox.fromExtremes(new TGCVector3(0, 0, wallSize), new TGCVector3(wallSize, wallHeight, wallSize + 10), TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\granito.jpg")); obstaculo.Transform = TGCMatrix.Translation(obstaculo.Position); obstaculos.Add(obstaculo); //Obstaculo 4 obstaculo = TGCBox.fromExtremes(new TGCVector3(wallSize, 0, 0), new TGCVector3(wallSize + 10, wallHeight, wallSize), TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\granito.jpg")); obstaculo.Transform = TGCMatrix.Translation(obstaculo.Position); obstaculos.Add(obstaculo); //Obstaculo 5 obstaculo = TGCBox.fromExtremes(new TGCVector3(wallSize / 2, 0, wallSize - 400), new TGCVector3(wallSize + 10, wallHeight, wallSize - 400 + 10), TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\granito.jpg")); obstaculo.Transform = TGCMatrix.Translation(obstaculo.Position); obstaculos.Add(obstaculo); //Cargar personaje con animaciones var skeletalLoader = new TgcSkeletalLoader(); personaje = skeletalLoader.loadMeshAndAnimationsFromFile( MediaDir + "SkeletalAnimations\\Robot\\Robot-TgcSkeletalMesh.xml", MediaDir + "SkeletalAnimations\\Robot\\", new[] { MediaDir + "SkeletalAnimations\\Robot\\Caminando-TgcSkeletalAnim.xml", MediaDir + "SkeletalAnimations\\Robot\\Parado-TgcSkeletalAnim.xml" }); //Configurar animacion inicial personaje.playAnimation("Parado", true); //Escalarlo porque es muy grande personaje.Position = new TGCVector3(100, 0, 100); personaje.Scale = new TGCVector3(0.75f, 0.75f, 0.75f); //Rotarlo 180° porque esta mirando para el otro lado personaje.RotateY(Geometry.DegreeToRadian(180f)); //Configurar camara en Tercera Persona y la asigno al TGC. camaraInterna = new TgcThirdPersonCamera(personaje.Position, 200, -300); Camara = camaraInterna; //Modifiers para modificar propiedades de la camara offsetHeightModifier = AddFloat("offsetHeight", 0, 300, 100); offsetForwardModifier = AddFloat("offsetForward", -400, 0, -220); displacementModifier = AddVertex2f("displacement", TGCVector2.Zero, new TGCVector2(100, 200), new TGCVector2(0, 100)); }
public override void Init() { //Crear piso var pisoTexture = TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\tierra.jpg"); piso = TGCBox.fromSize(new TGCVector3(5000, 5, 5000), pisoTexture); piso.Transform = TGCMatrix.Scaling(piso.Scale) * TGCMatrix.RotationYawPitchRoll(piso.Rotation.Y, piso.Rotation.X, piso.Rotation.Z) * TGCMatrix.Translation(piso.Position); piso.Position = new TGCVector3(0, -60, 0); //Cargar obstaculos y posicionarlos. Los obstaculos se crean con TgcBox en lugar de cargar un modelo. obstaculos = new List <TGCBox>(); sonidos = new List <Tgc3dSound>(); TGCBox obstaculo; Tgc3dSound sound; //Obstaculo 1 obstaculo = TGCBox.fromSize(new TGCVector3(80, 150, 80), TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\Quake\\TexturePack3\\goo2.jpg")); obstaculo.Position = new TGCVector3(-250, 0, 0); obstaculo.Transform = TGCMatrix.Scaling(obstaculo.Scale) * TGCMatrix.RotationYawPitchRoll(obstaculo.Rotation.Y, obstaculo.Rotation.X, obstaculo.Rotation.Z) * TGCMatrix.Translation(obstaculo.Position); obstaculos.Add(obstaculo); //Sondio obstaculo 1 //OJO, solo funcionan sonidos WAV Mono (No stereo). Hacer boton der => Propiedades sobre el archivo //y tiene que decir "1 Channel". sound = new Tgc3dSound(MediaDir + "Sound\\armonía, continuo.wav", obstaculo.Position, DirectSound.DsDevice); //Hay que configurar la mínima distancia a partir de la cual se empieza a atenuar el sonido 3D sound.MinDistance = 50f; sonidos.Add(sound); //Obstaculo 2 obstaculo = TGCBox.fromSize(new TGCVector3(80, 300, 80), TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\Quake\\TexturePack3\\lun_dirt.jpg")); obstaculo.Position = new TGCVector3(250, 0, 800); obstaculo.Transform = TGCMatrix.Translation(obstaculo.Position); obstaculos.Add(obstaculo); //Sondio obstaculo 2 sound = new Tgc3dSound(MediaDir + "Sound\\viento helado.wav", obstaculo.Position, DirectSound.DsDevice); sound.MinDistance = 50f; sonidos.Add(sound); //Obstaculo 3 obstaculo = TGCBox.fromSize(new TGCVector3(80, 100, 150), TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Texturas\\Quake\\TexturePack3\\Metal2_1.jpg")); obstaculo.Position = new TGCVector3(500, 0, -400); obstaculo.Transform = TGCMatrix.Scaling(obstaculo.Scale) * TGCMatrix.RotationYawPitchRoll(obstaculo.Rotation.Y, obstaculo.Rotation.X, obstaculo.Rotation.Z) * TGCMatrix.Translation(obstaculo.Position); obstaculos.Add(obstaculo); //Sondio obstaculo 3 sound = new Tgc3dSound(MediaDir + "Sound\\risa de maníaco.wav", obstaculo.Position, DirectSound.DsDevice); sound.MinDistance = 50f; sonidos.Add(sound); //Cargar personaje principal var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\Hummer\\Hummer-TgcScene.xml"); personaje = scene.Meshes[0]; personaje.Position = new TGCVector3(0, 0, 0); personaje.Transform = TGCMatrix.Scaling(personaje.Scale) * TGCMatrix.RotationYawPitchRoll(personaje.Rotation.Y, personaje.Rotation.X, personaje.Rotation.Z) * TGCMatrix.Translation(personaje.Position); //Hacer que el Listener del sonido 3D siga al personaje DirectSound.ListenerTracking = personaje; //Configurar camara en Tercer Persona camaraInterna = new TgcThirdPersonCamera(personaje.Position, 250, 500); Camara = camaraInterna; //Ejecutar en loop los sonidos foreach (var s in sonidos) { s.play(true); } }