public Auto CrearHummer(TgcScene MapScene, Velocimetro velocimetro) { float scaleRuedas = 1f; TgcMesh rueda = CrearRueda(1f); rueda.move(0, -25, 0); TgcScene hummerScene = Loader.loadSceneFromFile(MediaDir + "Hummer\\Hummer-TgcScene.xml"); TgcMesh hummerMesh = hummerScene.Meshes[0]; //hummerMesh.Scale = new Vector3(0.4f,0.4f,0.4f); //para las ruedas el offset es (ancho,altura,largo) float y = 13f; float x = 40; float z1 = 54; float z2 = 62; Ruedas ruedasAtras = new Ruedas(rueda, new Vector3(x, y, z1), new Vector3(-x, y, z1), true, scaleRuedas); Ruedas ruedasAdelante = new Ruedas(rueda, new Vector3(-x, y, -z2), new Vector3(x, y, -z2), false, scaleRuedas); float avanceMax = 5f; float aceleracion = 4f; float desaceleracion = 2f; return(new Auto("hummer", 100f, avanceMax, 3f, aceleracion, desaceleracion, hummerMesh, Gm, ruedasAdelante, ruedasAtras, rueda, velocimetro)); }
public override void render(float elapsedTime) { Device d3dDevice = GuiController.Instance.D3dDevice; //Obtener rotacion de mesh (pasar a radianes) float rotation = FastMath.ToRad((float)GuiController.Instance.Modifiers["rotation"]); //Rotar mesh y rotar OBB. A diferencia del AABB, nosotros tenemos que mantener el OBB actualizado segun cada movimiento del mesh Vector3 lastRot = mesh.Rotation; float rotationDiff = rotation - lastRot.Y; mesh.rotateY(rotationDiff); obb.rotate(new Vector3(0, rotationDiff, 0)); //Actualizar posicion Vector3 position = (Vector3)GuiController.Instance.Modifiers["position"]; Vector3 lastPos = mesh.Position; Vector3 posDiff = position - lastPos; mesh.move(posDiff); obb.move(posDiff); //Renderizar modelo mesh.render(); //Renderizar obb obb.render(); }
private void generarBancoPasto(List <TgcMesh> objs, Vector3 pos, Random rdm) { for (int q = 0; q < 1; q++) { for (int w = 0; w < 1; w++) { scale = rdm.Next(10, 20); TgcMesh pastoBanco = pastoOriginal.createMeshInstance(pastoOriginal.Name + q + w + pos.X + pos.Z); pastoBanco.AlphaBlendEnable = true; pastoBanco.Scale = new Vector3(0.025f * scale, 0.025f * scale, 0.025f * scale); pastoBanco.move(pos.X + q * 2.6f, 0, pos.Z + w * 2.6f); pastoBanco.UserProperties = new Dictionary <string, string>(); pastoBanco.Effect = treeWindEffect; pastoBanco.Technique = "SimpleWindGrass"; // gana algunos fps pastoBanco.AutoTransformEnable = false; pastoBanco.Transform = Matrix.Scaling(pastoBanco.Scale) * Matrix.Translation(pastoBanco.Position); objs.Add(pastoBanco); } } }
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.AutoTransformEnable = true; mesh.rotateY(FastMath.QUARTER_PI); mesh.move(new Vector3(100, 40, -200)); //mesh.Transform = Matrix.RotationY(FastMath.QUARTER_PI) * Matrix.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); }
public override void Render() { PreRender(); //Obtener rotacion de mesh (pasar a radianes) var rotation = FastMath.ToRad((float)Modifiers["rotation"]); //Rotar mesh y rotar OBB. A diferencia del AABB, nosotros tenemos que mantener el OBB actualizado segun cada movimiento del mesh var lastRot = mesh.Rotation; var rotationDiff = rotation - lastRot.Y; mesh.rotateY(rotationDiff); obb.rotate(new Vector3(0, rotationDiff, 0)); //Actualizar posicion var position = (Vector3)Modifiers["position"]; var lastPos = mesh.Position; var posDiff = position - lastPos; mesh.move(posDiff); obb.move(posDiff); //Renderizar modelo mesh.render(); //Renderizar obb obb.render(); PostRender(); }
public void init() { moto = new TgcSceneLoader().loadSceneFromFile(MediaDir + Game.Default.pathMoto).Meshes[0]; moto.Scale = new Vector3(0.5f, 0.5f, 0.5f); moto.move(posInicial); velocidad = 0; velocidadMaxima = 250; rotando = 0; velocidadRotacion = 25; anguloRotado = 0; posY = 0; distMaxSalto = 50; velocidadSalto = 40; saltando = 0; moto.moveOrientedY(35); pathlight = new PathLight(moto.Position); moto.moveOrientedY(-35); jugando = true; modoDios = false; vertexbuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, D3DDevice.Instance.Device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default); }
private void dispararProyectil() { Vector3 v = new Vector3(0f, 20f, 0f); bala.move(personaje.getPosicionBala() + v); vistaDelPersonaje(personaje.getPersonaje().Position); }
public Trofeo(Vector3 pos) { this.init(); this.posicion = pos; this.colision = TgcBox.fromSize(posicion, new Vector3(300, 100, 300)); this.meshTrofeo.Position = posicion; this.meshMesa.Position = posicion; meshMesa.move(new Vector3(0, -8f, 0)); this.meshTrofeo.move(new Vector3(0, 55f, 0)); }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; meshes = new List <TgcMesh>(); for (int i = 0; i < 100; i++) { TgcSceneLoader loader = new TgcSceneLoader(); TgcScene scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Meshes\\Vegetacion\\Palmera\\Palmera-TgcScene.xml"); TgcMesh mesh = scene.Meshes[0]; mesh.move(0, i * 100, 0); meshes.Add(mesh); mesh.D3dMesh.Disposing += new EventHandler(D3dMesh_Disposing); } }
public void render(float elapsedTime) { var matrizView = GuiController.Instance.D3dDevice.Transform.View; if (bandera == false) { meshTrofeo.render(); } else { meshTrofeo.rotateY(elapsedTime * velocidad); velocidad = velocidad + (2 * elapsedTime); meshTrofeo.move(new Vector3(0, 0.001f * velocidad, 0)); meshTrofeo.render(); } meshMesa.render(); }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; //Cargar modelo estatico Box TgcSceneLoader loader = new TgcSceneLoader(); TgcScene scene = loader.loadSceneFromFile( GuiController.Instance.ExamplesMediaDir + "ModelosTgc\\Box\\" + "Box-TgcScene.xml", GuiController.Instance.ExamplesMediaDir + "ModelosTgc\\Box\\"); mesh = scene.Meshes[0]; //Desplazarlo mesh.move(0, 10, 0); //Alejar camara rotacional GuiController.Instance.RotCamera.CameraDistance = 100f; }
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() { Microsoft.DirectX.Direct3D.Device d3dDevice = GuiController.Instance.D3dDevice; //Cargar escena TgcSceneLoader loader = new TgcSceneLoader(); scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Scenes\\Ciudad\\Ciudad-TgcScene.xml"); //Cargar mesh principal mainMesh = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "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 GuiController.Instance.ThirdPersonCamera.Enable = true; GuiController.Instance.ThirdPersonCamera.setCamera(mainMesh.Position, 200, 300); }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; //Crear suelo TgcTexture pisoTexture = TgcTexture.createTexture(d3dDevice, GuiController.Instance.ExamplesMediaDir + "Texturas\\pasto.jpg"); suelo = TgcBox.fromSize(new Vector3(500, 0, 500), new Vector3(2000, 0, 2000), pisoTexture); //Cargar modelo de palmera original TgcSceneLoader loader = new TgcSceneLoader(); TgcScene scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Meshes\\Vegetacion\\Palmera\\Palmera-TgcScene.xml"); palmeraOriginal = scene.Meshes[0]; //Crear varias instancias del modelo original, pero sin volver a cargar el modelo entero cada vez int rows = 5; int cols = 6; float offset = 200; meshes = new List <TgcMesh>(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { //Crear instancia de modelo TgcMesh instance = palmeraOriginal.createMeshInstance(palmeraOriginal.Name + i + "_" + j); //Desplazarlo instance.move(i * offset, 70, j * offset); instance.Scale = new Vector3(0.25f, 0.25f, 0.25f); meshes.Add(instance); } } //Camara en primera persona GuiController.Instance.FpsCamera.Enable = true; GuiController.Instance.FpsCamera.MovementSpeed = 400; GuiController.Instance.FpsCamera.JumpSpeed = 400; GuiController.Instance.FpsCamera.setCamera(new Vector3(61.8657f, 403.7024f, -527.558f), new Vector3(379.7143f, 12.9713f, 336.3295f)); }
private void creaUnItem(string fileMesh, Vector3 posicion, float rotacion) { var sceneCura = loader.loadSceneFromFile(fileMesh); TgcMesh meshCura = sceneCura.Meshes[0]; meshCura.AutoTransformEnable = true; meshCura.AutoUpdateBoundingBox = true; meshCura.createBoundingBox(); meshCura.Position = posicion; meshCura.rotateX(rotacion); meshCura.Scale = new Vector3(0.5f, 0.5f, 0.5f); meshCura.move(0, 20, 0); //cura.BoundingBox.transform(Matrix.Scaling(new Vector3(0.1f, 3, 0.1f)) * Matrix.Translation(new Vector3(posteDeLuz.Position.X + 33, posteDeLuz.Position.Y, posteDeLuz.Position.Z))); /*Item cura = new Item(this.env.MediaDir, this.env.ShadersDir); * cura.setMesh(meshCura); * cura.setFileNameSound(MediaDir + "MySounds\\PickUp2.wav");*/ items.Add(meshCura); }
public override void render(float elapsedTime) { Microsoft.DirectX.Direct3D.Device d3dDevice = GuiController.Instance.D3dDevice; //Procesamos input de teclado para mover el objeto principal en el plano XZ TgcD3dInput input = GuiController.Instance.D3dInput; Vector3 movement = new Vector3(0, 0, 0); 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; } 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; } //Aplicar movimiento movement *= MOVEMENT_SPEED * elapsedTime; mainMesh.move(movement); //Hacer que la cámara en 3ra persona se ajuste a la nueva posición del objeto GuiController.Instance.ThirdPersonCamera.Target = mainMesh.Position; //Dibujar objeto principal //Siempre primero hacer todos los cálculos de lógica e input y luego al final dibujar todo (ciclo update-render) mainMesh.render(); //Dibujamos la escena scene.renderAll(); }
public override void Render() { PreRender(); //Procesamos input de teclado para mover el objeto principal en el plano XZ var input = TgcD3dInput.Instance; var movement = new Vector3(0, 0, 0); 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; } 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; } //Aplicar movimiento movement *= MOVEMENT_SPEED * ElapsedTime; mainMesh.move(movement); //Hacer que la cámara en 3ra persona se ajuste a la nueva posición del objeto camaraInterna.Target = mainMesh.Position; //Dibujar objeto principal //Siempre primero hacer todos los cálculos de lógica e input y luego al final dibujar todo (ciclo update-render) mainMesh.render(); //Dibujamos la escena scene.renderAll(); PostRender(); }
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; }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; MyMediaDir = GuiController.Instance.ExamplesDir + "Shaders\\WorkshopShaders\\Media\\"; MyShaderDir = GuiController.Instance.ExamplesDir + "Shaders\\WorkshopShaders\\Shaders\\"; //Crear loader TgcSceneLoader loader = new TgcSceneLoader(); //Cargar mesh scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "ModelosTgc\\Teapot\\Teapot-TgcScene.xml"); mesh = scene.Meshes[0]; mesh.Scale = new Vector3(1f, 1f, 1f); mesh.Position = new Vector3(-100f, -5f, 0f); // Arreglo las normales int [] adj = new int[mesh.D3dMesh.NumberFaces * 3]; mesh.D3dMesh.GenerateAdjacency(0, adj); mesh.D3dMesh.ComputeNormals(adj); //Cargar Shader personalizado effect = TgcShaders.loadEffect(GuiController.Instance.ExamplesDir + "Shaders\\WorkshopShaders\\Shaders\\ToonShading.fx"); // le asigno el efecto a la malla mesh.Effect = effect; mesh.Technique = "DefaultTechnique"; // Creo las instancias de malla instances = new List <TgcMesh>(); for (int i = -5; i < 5; i++) { for (int j = -5; j < 5; j++) { TgcMesh instance = mesh.createMeshInstance(mesh.Name + i); instance.move(i * 50, (i + j) * 5, j * 50); instances.Add(instance); } } GuiController.Instance.Modifiers.addVertex3f("LightPosition", new Vector3(-100, -100, -100), new Vector3(100, 100, 100), new Vector3(0, 40, 0)); GuiController.Instance.Modifiers.addFloat("Ambient", 0, 1, 0.5f); GuiController.Instance.Modifiers.addFloat("Diffuse", 0, 1, 0.6f); GuiController.Instance.Modifiers.addFloat("Specular", 0, 1, 0.5f); GuiController.Instance.Modifiers.addFloat("SpecularPower", 1, 100, 16); GuiController.Instance.RotCamera.setCamera(new Vector3(20, 20, 0), 200); GuiController.Instance.RotCamera.CameraDistance = 300; GuiController.Instance.RotCamera.RotationSpeed = 1.5f; // Creo un depthbuffer sin multisampling, para que sea compatible con el render to texture // Nota: // El render to Texture no es compatible con el multisampling en dx9 // Por otra parte la mayor parte de las placas de ultima generacion no soportan // mutisampling para texturas de punto flotante con lo cual // hay que suponer con generalidad que no se puede usar multisampling y render to texture // Para resolverlo hay que crear un depth buffer que no tenga multisampling, // (de lo contrario falla el zbuffer y se producen artifacts tipicos de que no tiene zbuffer) // Si uno quisiera usar el multisampling, la tecnica habitual es usar un RenderTarget // en lugar de una textura. // Por ejemplo en c++: // // Render Target formato color buffer con multisampling // // g_pd3dDevice->CreateRenderTarget(Ancho,Alto, // D3DFMT_A8R8G8B8, D3DMULTISAMPLE_2_SAMPLES, 0, // FALSE, &g_pRenderTarget, NULL); // // Luego, ese RenderTarget NO ES una textura, y nosotros necesitamos acceder a esos // pixeles, ahi lo que se hace es COPIAR del rendertartet a una textura, // para poder trabajar con esos datos en el contexto del Pixel shader: // // Eso se hace con la funcion StretchRect: // copia de rendertarget ---> sceneSurface (que es la superficie asociada a una textura) // g_pd3dDevice->StretchRect(g_pRenderTarget, NULL, g_pSceneSurface, NULL, D3DTEXF_NONE); // // Esta tecnica se llama downsampling // Y tiene el costo adicional de la transferencia de memoria entre el rendertarget y la // textura, pero que no traspasa los limites de la GPU. (es decir es muy performante) // no es lo mismo que lockear una textura para acceder desde la CPU, que tiene el problema // de transferencia via AGP. g_pDepthStencil = d3dDevice.CreateDepthStencilSurface(d3dDevice.PresentationParameters.BackBufferWidth, d3dDevice.PresentationParameters.BackBufferHeight, DepthFormat.D24S8, MultiSampleType.None, 0, true); // inicializo el render target g_pRenderTarget = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth , d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); effect.SetValue("g_RenderTarget", g_pRenderTarget); // inicializo el mapa de normales g_pNormals = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth , d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); effect.SetValue("g_Normals", g_pNormals); // Resolucion de pantalla effect.SetValue("screen_dx", d3dDevice.PresentationParameters.BackBufferWidth); effect.SetValue("screen_dy", d3dDevice.PresentationParameters.BackBufferHeight); //Se crean 2 triangulos con las dimensiones de la pantalla con sus posiciones ya transformadas // x = -1 es el extremo izquiedo de la pantalla, x=1 es el extremo derecho // Lo mismo para la Y con arriba y abajo // la Z en 1 simpre CustomVertex.PositionTextured[] vertices = new CustomVertex.PositionTextured[] { new CustomVertex.PositionTextured(-1, 1, 1, 0, 0), new CustomVertex.PositionTextured(1, 1, 1, 1, 0), new CustomVertex.PositionTextured(-1, -1, 1, 0, 1), new CustomVertex.PositionTextured(1, -1, 1, 1, 1) }; //vertex buffer de los triangulos g_pVBV3D = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); g_pVBV3D.SetData(vertices, 0, LockFlags.None); efecto_blur = false; }
/// <summary> /// Actualizar estado /// </summary> public void update() { float maxDist = 2 * handleSphere.Radius; float movement; float correction; switch (currentState) { //Hacer animacion de abrir cajon case LockerState.Opening: movement = movementSpeed * GuiController.Instance.ElapsedTime; //Mover mesh.move(0, 0, movement); handleSphere.moveCenter(new Vector3(0, 0, movement)); //Ver si llegamos al limite if (handleSphere.Center.Z >= handleMaxZ) { //Corregir lo que nos pasamos correction = handleSphere.Center.Z - handleMaxZ; mesh.move(0, 0, -correction); handleSphere.moveCenter(new Vector3(0, 0, -correction)); //Pasar a estado abierto currentState = LockerState.Opened; waintElapsedTime = 0; } break; //Abierto case LockerState.Opened: waintElapsedTime += GuiController.Instance.ElapsedTime; if (waintElapsedTime > WAIT_TIME) { waintElapsedTime = WAIT_TIME; } break; //Cerrado case LockerState.Closed: waintElapsedTime += GuiController.Instance.ElapsedTime; if (waintElapsedTime > WAIT_TIME) { waintElapsedTime = WAIT_TIME; } break; //Hacer animacion de cerrar cajon case LockerState.Closing: movement = -movementSpeed * GuiController.Instance.ElapsedTime; //Mover mesh.move(0, 0, movement); handleSphere.moveCenter(new Vector3(0, 0, movement)); //Ver si llegamos al limite if (handleSphere.Center.Z <= handleMinZ) { //Corregir lo que nos pasamos correction = handleSphere.Center.Z - handleMinZ; mesh.move(0, 0, -correction); handleSphere.moveCenter(new Vector3(0, 0, -correction)); //Pasar a estado cerrado currentState = LockerState.Closed; waintElapsedTime = 0; } break; } }
public override void render(float elapsedTime) { Microsoft.DirectX.Direct3D.Device d3dDevice = GuiController.Instance.D3dDevice; //Procesamos input de teclado para mover el objeto principal en el plano XZ TgcD3dInput input = GuiController.Instance.D3dInput; Vector3 movement = new Vector3(0, 0, 0); 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; } 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 Vector3 originalPos = mainMesh.Position; //Aplicar movimiento 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. bool collisionFound = false; foreach (TgcMesh mesh in scene.Meshes) { //Los dos BoundingBox que vamos a testear TgcBoundingBox mainMeshBoundingBox = mainMesh.BoundingBox; TgcBoundingBox sceneMeshBoundingBox = mesh.BoundingBox; //Ejecutar algoritmo de detección de colisiones TgcCollisionUtils.BoxBoxResult 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; } //Actualizar posicion de cámara GuiController.Instance.ThirdPersonCamera.Target = mainMesh.Position; //Dibujar mainMesh.render(); scene.renderAll(); //En este ejemplo a modo de debug vamos a dibujar los BoundingBox de todos los objetos. //Asi puede verse como se efectúa el testeo de colisiones. mainMesh.BoundingBox.render(); foreach (TgcMesh mesh in scene.Meshes) { mesh.BoundingBox.render(); } }
public PlayScene() { string mediaDir = GuiController.Instance.AlumnoEjemplosMediaDir; string examplesMediaDir = GuiController.Instance.ExamplesMediaDir; TgcTexture pisoTexture = TgcTexture.createTexture(GuiController.Instance.D3dDevice, mediaDir + "CEGA\\Textures\\Grass.jpg"); suelo = TgcBox.fromSize(new Vector3(1300, 0, 1300), new Vector3(2800, 0, 2800), pisoTexture); heightMap = new SimpleTerrain(); heightMap.loadHeightmap(GuiController.Instance.AlumnoEjemplosMediaDir + "CEGA\\Heightmap\\" + "hmap4.jpg", 26, 0.4f, new Vector3(52, 0, 48)); heightMap.loadTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "CEGA\\Textures\\" + "Pasto2.jpg"); treeWindEffect = TgcShaders.loadEffect( GuiController.Instance.AlumnoEjemplosMediaDir + "CEGA\\Shaders\\TreeWind.fx"); TgcSceneLoader loader = new TgcSceneLoader(); TgcScene scene = loader.loadSceneFromFile(mediaDir + "CEGA\\Pino-TgcScene.xml"); TgcMesh pinoOriginal = scene.Meshes[0]; scene = loader.loadSceneFromFile(mediaDir + "CEGA\\BarrilPolvora-TgcScene.xml"); TgcMesh barrilOriginal = scene.Meshes[0]; scene = loader.loadSceneFromFile(mediaDir + "CEGA\\Pasto3-TgcScene.xml"); pastoOriginal = scene.Meshes[0]; //Crear varias instancias del modelo original, pero sin volver a cargar el modelo entero cada vez, hace 23*23 = 529 pinos int rows = 22; int cols = 22; Random RandomPlayScene = new Random(10); int offset = RandomPlayScene.Next(100); otrosObjetos = new List <TgcMesh>(); for (int i = 1; i <= rows; i++) { for (int j = 1; j <= cols; j++) { //Randomeo el proximo offset, de esta forma nunca vamos a tener 2 escenarios iguales, si queremos evitar que se superpongan cosas hay que fijarse acá. //Si les parece que quedan muy concentrados en el origen podemos separarlo en 2 For (o en 4) para que no se peguen tanto cuando i=1 y j=1. offset = RandomPlayScene.Next(50, 150); scale = RandomPlayScene.Next(10, 30); //Me fijo que quede dentro de los limites del mapa if (i * offset > 2600 || j * offset > 2600) { offset = RandomPlayScene.Next(10, 100); } //Crear instancia de modelo // Barriles if (i == 21) { TgcMesh BarrilInstance = barrilOriginal.createMeshInstance(barrilOriginal.Name + i + j); BarrilInstance.move(j * offset, 0, i * offset); BarrilInstance.AlphaBlendEnable = true; BarrilInstance.Scale = new Vector3(0.09f, 0.09f, 0.09f); // gana algunos fps BarrilInstance.AutoTransformEnable = false; BarrilInstance.Transform = Matrix.Scaling(BarrilInstance.Scale) * Matrix.Translation(BarrilInstance.Position); BarrilInstance.UserProperties = new Dictionary <string, string>(); BarrilInstance.UserProperties["colisionable"] = ""; otrosObjetos.Add(BarrilInstance); } // Pinos // TgcMesh instance = pinoOriginal.createMeshInstance(pinoOriginal.Name + i + "_" + j); instance.AlphaBlendEnable = true; instance.Position = new Vector3(i * offset, 0, j * offset); instance.Scale = new Vector3(0.05f * (scale), 0.05f * (scale), 0.05f * (scale)); // gana algunos fps instance.AutoTransformEnable = false; instance.Transform = Matrix.Scaling(instance.Scale) * Matrix.Translation(instance.Position); instance.UserProperties = new Dictionary <string, string>(); instance.UserProperties["colisionable"] = ""; //Modifico el BB del arbol para que sea solo el tronco instance.AutoUpdateBoundingBox = false; instance.BoundingBox.scaleTranslate(instance.Position, new Vector3(0.0012f * instance.BoundingBox.calculateSize().X, 0.0016f * instance.BoundingBox.calculateSize().Y, 0.0012f * instance.BoundingBox.calculateSize().Z)); //Effecto de Viento (Shader); instance.Effect = treeWindEffect; instance.Technique = "SimpleWindTree"; //Agrego a la coleccion otrosObjetos.Add(instance); // Bancos de Pasto if (j == 20) { generarBancoPasto(otrosObjetos, new Vector3(j * offset, 0, i * offset), RandomPlayScene); } } } //Sky Box string texturesPath = mediaDir + "CEGA\\Skyboxes\\SkyBox4\\"; //Creo el SkyBox skyBox = new TgcSkyBox(); skyBox.Center = new Vector3(1300, 250, 1300); skyBox.Size = new Vector3(4000, 1500, 4000); //Cargo las texturas de las caras, (algunas no tienen "down" así que uso TOP, por que igual no se debería ver en nuestro caso) skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Up, texturesPath + "top.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Down, texturesPath + "top.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Left, texturesPath + "left.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Right, texturesPath + "right.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Front, texturesPath + "front.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Back, texturesPath + "back.jpg"); //Actualizar todos los valores para crear el SkyBox skyBox.updateValues(); sound_WindLong = new TgcStaticSound(); sound_WindLong.loadSound(mediaDir + @"CEGA\Sound\viento_largo.wav", -2000); sound_WindMedium = new TgcStaticSound(); sound_WindMedium.loadSound(mediaDir + @"CEGA\Sound\viento_medio.wav", -2000); sound_WindLeaves = new TgcStaticSound(); sound_WindLeaves.loadSound(examplesMediaDir + @"\Sound\viento en arbustos.wav", -2000); sound_music = new TgcStaticSound(); sound_music.loadSound(mediaDir + @"CEGA\Sound\rabbia.wav", -2000); sound_music.play(true); //Crear Grilla grilla = new GrillaRegular(); grilla.create(otrosObjetos, heightMap.BoundingBox); grilla.createDebugMeshes(); }
private void crearVeredas() { cordones.Add(new TgcPlane(new Vector3(-450 + fix_posX, 5, -450 + fix_posZ), new Vector3(5900, 0, 5), TgcPlane.Orientations.XZplane, cordonTexture, 40, 1)); cordones.Add(new TgcPlane(new Vector3(-450 + fix_posX, 0, -445 + fix_posZ), new Vector3(5895, 5, 0), TgcPlane.Orientations.XYplane, cordonTexture, 40, 1)); cordones.Add(new TgcPlane(new Vector3(-500 + fix_posX, 5, -500 + fix_posZ), new Vector3(6000, 0, 50), TgcPlane.Orientations.XZplane, veredaTexture, 60, 1)); for (int i = 0; i < 30; i++) { var sceneRueda = loader.loadSceneFromFile(MediaDir + "PosteDeLuz\\Poste de luz-TgcScene.xml"); posteDeLuz = sceneRueda.Meshes[0]; posteDeLuz.AutoTransformEnable = true; posteDeLuz.Position = new Vector3(-455 + (i * (5900 / 30)) + fix_posX, 5, -450 + fix_posZ); posteDeLuz.rotateY(FastMath.PI_HALF); posteDeLuz.Scale = new Vector3(1, 3, 1); posteDeLuz.move(0, 50, 0); posteDeLuz.BoundingBox.transform(Matrix.Scaling(new Vector3(0.1f, 3, 0.1f)) * Matrix.Translation(new Vector3(posteDeLuz.Position.X, posteDeLuz.Position.Y, posteDeLuz.Position.Z - 33))); meshes.Add(posteDeLuz); LpostesDeLuz.Add(posteDeLuz); } cordones.Add(new TgcPlane(new Vector3(-450 + fix_posX, 5, -445 + fix_posZ), new Vector3(5, 0, 5890), TgcPlane.Orientations.XZplane, cordonTexture, 1, 40)); cordones.Add(new TgcPlane(new Vector3(-445 + fix_posX, 0, -445 + fix_posZ), new Vector3(0, 5, 5890), TgcPlane.Orientations.YZplane, cordonTexture, 1, 40)); cordones.Add(new TgcPlane(new Vector3(-500 + fix_posX, 5, -450 + fix_posZ), new Vector3(50, 0, 5950), TgcPlane.Orientations.XZplane, veredaTexture, 1, 60)); for (int i = 0; i < 30; i++) { var sceneRueda = loader.loadSceneFromFile(MediaDir + "PosteDeLuz\\Poste de luz-TgcScene.xml"); posteDeLuz = sceneRueda.Meshes[0]; posteDeLuz.AutoTransformEnable = true; posteDeLuz.Position = new Vector3(-455 + fix_posX, 5, -450 + (i * (5900 / 30)) + fix_posZ); posteDeLuz.rotateY(FastMath.PI); posteDeLuz.Scale = new Vector3(1, 3, 1); posteDeLuz.move(0, 50, 0); posteDeLuz.BoundingBox.transform(Matrix.Scaling(new Vector3(0.1f, 3, 0.1f)) * Matrix.Translation(new Vector3(posteDeLuz.Position.X - 33, posteDeLuz.Position.Y, posteDeLuz.Position.Z))); meshes.Add(posteDeLuz); LpostesDeLuz.Add(posteDeLuz); } cordones.Add(new TgcPlane(new Vector3(-450 + fix_posX, 5, 5445 + fix_posZ), new Vector3(5900, 0, 5), TgcPlane.Orientations.XZplane, cordonTexture, 40, 1)); cordones.Add(new TgcPlane(new Vector3(-450 + fix_posX, 0, 5445 + fix_posZ), new Vector3(5900, 5, 0), TgcPlane.Orientations.XYplane, cordonTexture, 40, 1)); cordones.Add(new TgcPlane(new Vector3(-450 + fix_posX, 5, 5500 + fix_posZ), new Vector3(5950, 0, -50), TgcPlane.Orientations.XZplane, veredaTexture, 60, 1)); for (int i = 0; i < 30; i++) { var sceneRueda = loader.loadSceneFromFile(MediaDir + "PosteDeLuz\\Poste de luz-TgcScene.xml"); posteDeLuz = sceneRueda.Meshes[0]; posteDeLuz.AutoTransformEnable = true; posteDeLuz.Position = new Vector3(-455 + (i * (5900 / 30)) + fix_posX, 5, 5445 + fix_posZ); posteDeLuz.rotateY(FastMath.PI + FastMath.PI_HALF); posteDeLuz.Scale = new Vector3(1, 3, 1); posteDeLuz.move(0, 50, 0); posteDeLuz.BoundingBox.transform(Matrix.Scaling(new Vector3(0.1f, 3, 0.1f)) * Matrix.Translation(new Vector3(posteDeLuz.Position.X, posteDeLuz.Position.Y, posteDeLuz.Position.Z + 33))); meshes.Add(posteDeLuz); LpostesDeLuz.Add(posteDeLuz); } cordones.Add(new TgcPlane(new Vector3(5445 + fix_posX, 5, -445 + fix_posZ), new Vector3(5, 0, 5890), TgcPlane.Orientations.XZplane, cordonTexture, 1, 40)); cordones.Add(new TgcPlane(new Vector3(5445 + fix_posX, 0, -445 + fix_posZ), new Vector3(0, 5, 5890), TgcPlane.Orientations.YZplane, cordonTexture, 1, 40)); cordones.Add(new TgcPlane(new Vector3(5450 + fix_posX, 5, -450 + fix_posZ), new Vector3(50, 0, 5900), TgcPlane.Orientations.XZplane, veredaTexture, 1, 60)); for (int i = 0; i < 30; i++) { var sceneRueda = loader.loadSceneFromFile(MediaDir + "PosteDeLuz\\Poste de luz-TgcScene.xml"); posteDeLuz = sceneRueda.Meshes[0]; posteDeLuz.AutoTransformEnable = true; posteDeLuz.Position = new Vector3(5445 + fix_posX, 5, -450 + (i * (5900 / 30)) + fix_posZ); posteDeLuz.rotateY(FastMath.TWO_PI); posteDeLuz.Scale = new Vector3(1, 3, 1); posteDeLuz.move(0, 50, 0); posteDeLuz.BoundingBox.transform(Matrix.Scaling(new Vector3(0.1f, 3, 0.1f)) * Matrix.Translation(new Vector3(posteDeLuz.Position.X + 33, posteDeLuz.Position.Y, posteDeLuz.Position.Z))); meshes.Add(posteDeLuz); LpostesDeLuz.Add(posteDeLuz); } }
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 = new Vector3(0, 0, 0); //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; }
public void mover(Vector3 matriz) { moto.move(matriz); }
public override void Update() { PreUpdate(); var velocidadCaminar = VELOCIDAD_DESPLAZAMIENTO * ElapsedTime; //Calcular proxima posicion de personaje segun Input var moving = false; var movement = new Vector3(0, 0, 0); //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(triangle[0].Position, triangle[1].Position, 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); } }
public override void move(Vector3 move) { mesh.move(move); }