public override void setSelected(bool selected) { this.selected = selected; Color color = selected ? MeshCreatorUtils.SELECTED_OBJECT_COLOR : MeshCreatorUtils.UNSELECTED_OBJECT_COLOR; // mesh.BoundingSphere.setRenderColor(color); bb.setRenderColor(color); }
public override void render(float elapsedTime) { TgcModifiers modifiers = GuiController.Instance.Modifiers; Vector2 size = (Vector2)modifiers.getValue("size"); Vector3 position = (Vector3)modifiers.getValue("position"); collider.Center = position; collider.Radius = size.X; collider.Length = size.Y; if (TgcCollisionUtils.testSphereCylinder(collisionableSphere, collider)) { collisionableSphere.setRenderColor(collisionColor); } else { collisionableSphere.setRenderColor(noCollisionColor); } if (TgcCollisionUtils.testAABBCylinder(collisionableAABB, collider)) { collisionableAABB.setRenderColor(collisionColor); } else { collisionableAABB.setRenderColor(noCollisionColor); } if (TgcCollisionUtils.testCylinderCylinder(collisionableCylinder, collider)) { collisionableCylinder.setRenderColor(collisionColor); } else { collisionableCylinder.setRenderColor(noCollisionColor); } collider.render(); collisionableSphere.render(); collisionableAABB.render(); collisionableCylinder.render(); }
public override void render(float elapsedTime) { TgcModifiers modifiers = GuiController.Instance.Modifiers; Vector2 size = (Vector2)modifiers.getValue("size"); Vector3 position = (Vector3)modifiers.getValue("position"); collider.Center = position; collider.Radius = size.X; collider.Length = size.Y; collider.updateValues(); if (TgcCollisionUtils.testSphereCylinder(collisionableSphere, collider)) { collisionableSphere.setRenderColor(collisionColor); } else { collisionableSphere.setRenderColor(noCollisionColor); } if (TgcCollisionUtils.testAABBCylinder(collisionableAABB, collider)) { collisionableAABB.setRenderColor(collisionColor); } else { collisionableAABB.setRenderColor(noCollisionColor); } if (TgcCollisionUtils.testCylinderCylinder(collisionableCylinder, collider)) { collisionableCylinder.setRenderColor(collisionColor); } else { collisionableCylinder.setRenderColor(noCollisionColor); } if (pickingTimeLeft > 0) { pickingTimeLeft -= elapsedTime; } else { collider.setRenderColor(noCollisionColor); } if (GuiController.Instance.D3dInput.buttonPressed(TgcViewer.Utils.Input.TgcD3dInput.MouseButtons.BUTTON_LEFT)) { TgcPickingRay pickingRay = new TgcPickingRay(); pickingRay.updateRay(); if (TgcCollisionUtils.testRayCylinder(pickingRay.Ray, collider)) { pickingTimeLeft = PICKING_TIME; collider.setRenderColor(pickingColor); } } collider.render(); collisionableSphere.render(); collisionableAABB.render(); collisionableCylinder.render(); }
/// <summary> /// Crea la malla de un terreno en base a un Heightmap /// </summary> /// <param name="heightmapPath">Imagen de Heightmap</param> /// <param name="scaleXZ">Escala para los ejes X y Z</param> /// <param name="scaleY">Escala para el eje Y</param> /// <param name="center">Centro de la malla del terreno</param> /// <param name="divisiones">Cantidad de filas y columnas en las que se va a dividir el terreno</param> public void loadHeightmap(string heightmapPath, float scaleXZ, float scaleY, Vector3 center, int divisiones) { Device d3dDevice = GuiController.Instance.D3dDevice; this.center = center; TgcBoundingBox box; vbTerrains = new List <VertexBuffer>(); boundingBoxes = new List <TgcBoundingBox>(); //Dispose de VertexBuffer anterior, si habia foreach (VertexBuffer vbTerrain in vbTerrains) { if (vbTerrain != null && !vbTerrain.Disposed) { vbTerrain.Dispose(); } } vbTerrains.Clear(); //cargar heightmap heightmapData = loadHeightMap(d3dDevice, heightmapPath); float width = (float)heightmapData.GetLength(0); float length = (float)heightmapData.GetLength(1); //Crear vertexBuffer float nodeWidth = (width / divisiones); float nodeLength = (length / divisiones); for (int x = 0; x < divisiones; x++) { for (int z = 0; z < divisiones; z++) { VertexBuffer vbTerrain; totalVertices = 2 * 3 * ((int)nodeWidth - 1) * ((int)nodeLength - 1); vbTerrain = new VertexBuffer(typeof(CustomVertex.PositionTextured), totalVertices, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); //Cargar vertices int dataIdx = 0; Vector3 pMin = Vector3.Empty; Vector3 pMax = Vector3.Empty; CustomVertex.PositionTextured[] data = new CustomVertex.PositionTextured[totalVertices]; Vector3 currentCenter; currentCenter.X = center.X * scaleXZ - (width / 2) * scaleXZ; currentCenter.Y = center.Y * scaleY; currentCenter.Z = center.Z * scaleXZ - (length / 2) * scaleXZ; for (int k = 0; k < (nodeWidth) - 1; k++) { for (int l = 0; l < (nodeLength) - 1; l++) { int i = k + (x * ((int)nodeWidth - 1)); int j = l + (z * ((int)nodeLength - 1)); //Vertices Vector3 v1 = new Vector3(currentCenter.X + i * scaleXZ, currentCenter.Y + heightmapData[i, j] * scaleY, currentCenter.Z + j * scaleXZ); Vector3 v2 = new Vector3(currentCenter.X + i * scaleXZ, currentCenter.Y + heightmapData[i, j + 1] * scaleY, currentCenter.Z + (j + 1) * scaleXZ); Vector3 v3 = new Vector3(currentCenter.X + (i + 1) * scaleXZ, currentCenter.Y + heightmapData[i + 1, j] * scaleY, currentCenter.Z + j * scaleXZ); Vector3 v4 = new Vector3(currentCenter.X + (i + 1) * scaleXZ, currentCenter.Y + heightmapData[i + 1, j + 1] * scaleY, currentCenter.Z + (j + 1) * scaleXZ); //Coordendas de textura Vector2 t1 = new Vector2(i / nodeWidth, j / nodeLength); Vector2 t2 = new Vector2(i / nodeWidth, (j + 1) / nodeLength); Vector2 t3 = new Vector2((i + 1) / nodeWidth, j / nodeLength); Vector2 t4 = new Vector2((i + 1) / nodeWidth, (j + 1) / nodeLength); //Cargar triangulo 1 data[dataIdx] = new CustomVertex.PositionTextured(v1, t1.X, t1.Y); data[dataIdx + 1] = new CustomVertex.PositionTextured(v2, t2.X, t2.Y); data[dataIdx + 2] = new CustomVertex.PositionTextured(v4, t4.X, t4.Y); //Cargar triangulo 2 data[dataIdx + 3] = new CustomVertex.PositionTextured(v1, t1.X, t1.Y); data[dataIdx + 4] = new CustomVertex.PositionTextured(v4, t4.X, t4.Y); data[dataIdx + 5] = new CustomVertex.PositionTextured(v3, t3.X, t3.Y); dataIdx += 6; if (k == 0 && l == 0) { pMin = v1; pMin.Y = 0; } if (k == (nodeLength) - 2 && l == (nodeLength) - 2) { pMax = v4; pMax.Y = 1500; } } } vbTerrain.SetData(data, 0, LockFlags.None); vbTerrains.Add(vbTerrain); //vbTerrain.Dispose(); box = new TgcBoundingBox(pMin, pMax); box.setRenderColor(Color.Red); boundingBoxes.Add(box); } } }
public bool colisionar(TgcBoundingBox objeto, List <Vector3> centros) { if (objeto.Position.Y - (centros[0].Y + escalaY) - tolerancia > EPSILON) {//si esta lejos en el eje y, no tiene sentido testear lo demas. objeto.setRenderColor(Color.Yellow); return(false); } objeto.setRenderColor(Color.Red); centros_probables.Clear(); if (objeto.Position.Y < 0) { return(true); } //Si el avion avanza demasiado rápido y no se llega a checkear la colisión foreach (Vector3 centro in centros) { if ((Math.Pow(objeto.Position.X - centro.X, 2) + Math.Pow(objeto.Position.Z - centro.Z, 2)) - Math.Pow(tamanio_terrenos / 2, 2) < EPSILON) {//si el centro esta cerca en altura, y en horizontal lo guardo para colisionar centros_probables.Add(centro); } } //veo si colisionan los terrenos Vector3 nuevaPosicion; List <Vector3> verticesEnEsfera = new List <Vector3>(); TgcBoundingBox bounding = objeto.clone(); foreach (Vector3 centro in centros_probables) { //desplazo el avion en vez del terreno para testear colisiones nuevaPosicion = Vector3.Subtract(objeto.Position, centro); bounding.move(Vector3.Multiply(centro, -1f)); verticesEnEsfera.Clear(); TgcBoundingSphere esfera = new TgcBoundingSphere(nuevaPosicion, tolerancia); Vector3 colision = new Vector3(); for (int i = 0; i < verticesTerreno.Length; i += 3) { if (TgcCollisionUtils.testSphereTriangle(esfera, verticesTerreno[i].Position, verticesTerreno[i + 1].Position, verticesTerreno[i + 2].Position, out colision)) { if (TgcCollisionUtils.testTriangleAABB(verticesTerreno[i].Position, verticesTerreno[i + 1].Position, verticesTerreno[i + 2].Position, bounding)) { return(true); } } } /* * foreach (CustomVertex.PositionTextured vertice in verticesTerreno) * { * if ( Vector3.LengthSq(Vector3.Subtract(nuevaPosicion,vertice.Position)) - toleranciaSQ < EPSILON) * { * verticesEnEsfera.Add(vertice.Position); * } * } * * foreach (Vector3 vertice in verticesEnEsfera) * { * if (TgcCollisionUtils.sqDistPointAABB(vertice, bounding) < EPSILON) * { * return true; * } * }*/ } return(false); }
public override void Render() { PreRender(); var size = (Vector2)Modifiers.getValue("size"); var position = (Vector3)Modifiers.getValue("position"); collider.Center = position; collider.Radius = size.X; collider.Length = size.Y; collider.updateValues(); if (TgcCollisionUtils.testSphereCylinder(collisionableSphere, collider)) { collisionableSphere.setRenderColor(collisionColor); } else { collisionableSphere.setRenderColor(noCollisionColor); } if (TgcCollisionUtils.testAABBCylinder(collisionableAABB, collider)) { collisionableAABB.setRenderColor(collisionColor); } else { collisionableAABB.setRenderColor(noCollisionColor); } if (TgcCollisionUtils.testCylinderCylinder(collisionableCylinder, collider)) { collisionableCylinder.setRenderColor(collisionColor); } else { collisionableCylinder.setRenderColor(noCollisionColor); } if (pickingTimeLeft > 0) { pickingTimeLeft -= ElapsedTime; } else { collider.setRenderColor(noCollisionColor); } if (TgcD3dInput.Instance.buttonPressed(TgcD3dInput.MouseButtons.BUTTON_LEFT)) { var pickingRay = new TgcPickingRay(); pickingRay.updateRay(); if (TgcCollisionUtils.testRayCylinder(pickingRay.Ray, collider)) { pickingTimeLeft = PICKING_TIME; collider.setRenderColor(pickingColor); } } collider.render(); collisionableSphere.render(); collisionableAABB.render(); collisionableCylinder.render(); PostRender(); }