/// <summary> /// Actualiza la posicion e inclinacion del cilindro /// </summary> public void updateValues() { this.boundingCylinder.Radius = FastMath.Max( FastMath.Abs(this.topRadius), FastMath.Abs(this.bottomRadius)); this.boundingCylinder.updateValues(); this.updateDraw(); }
/// <summary> /// Idica si un BoundingSphere colisiona con un plano /// </summary> /// <returns>True si hay colisión</returns> public static bool testSpherePlane(TgcBoundingSphere s, Plane plane) { Vector3 p = toVector3(plane); // For a normalized plane (|p.n| = 1), evaluating the plane equation // for a point gives the signed distance of the point to the plane float dist = Vector3.Dot(s.Center, p) - plane.D; // If sphere center within +/-radius from plane, plane intersects sphere return(FastMath.Abs(dist) <= s.Radius); }
/// <summary> /// Indica si un Plano colisiona con un BoundingBox /// </summary> /// <param name="plane">Plano</param> /// <param name="aabb">BoundingBox</param> /// <returns>True si hay colisión.</returns> public static bool testPlaneAABB(Plane plane, TgcBoundingBox aabb) { Vector3 c = (aabb.PMax + aabb.PMin) * 0.5f; // Compute AABB center Vector3 e = aabb.PMax - c; // Compute positive extents // Compute the projection interval radius of b onto L(t) = b.c + t * p.n float r = e.X * FastMath.Abs(plane.A) + e.Y * FastMath.Abs(plane.B) + e.Z * FastMath.Abs(plane.C); // Compute distance of box center from plane float s = plane.Dot(c); // Intersection occurs when distance s falls within [-r,+r] interval return(FastMath.Abs(s) <= r); }
/// <summary> /// Aplica el valor absoluto a todos los componentes del vector /// </summary> /// <param name="v">Vector</param> /// <returns>Vector resultante</returns> public static Vector3 abs(Vector3 v) { return new Vector3(FastMath.Abs(v.X), FastMath.Abs(v.Y), FastMath.Abs(v.Z)); }
/// <summary> /// Duplica los vertices que deben tener coordenadas de textura diferentes para diferentes triangulos /// </summary> /// <param name="vertices"></param> /// <param name="indices"></param> /// <param name="iverticesU1"></param> /// <param name="polos"></param> protected virtual void fixTexcoords(List <Vertex.PositionColoredTexturedNormal> vertices, List <int> indices, List <int> iverticesU1, int[] polos) { Dictionary <int, int> duplicados = new Dictionary <int, int>(); float U0p5 = 0.5f * UVTiling.X + UVOffset.X; float U1 = UVTiling.X + UVOffset.X; //Fix compartidos foreach (int idx in iverticesU1) { for (int i = 0; i < indices.Count; i += 3) { //Triangulo que tiene ese vertice. if (indices[i] == idx || indices[i + 1] == idx || indices[i + 2] == idx) { int i1 = indices[i]; int i2 = indices[i + 1]; int i3 = indices[i + 2]; //Solo me importan los que tienen un vertice con u=1(fin de la textura) y otro menor a 0.5 (comienzo de la textura) if ((!esPolo(vertices[i1]) && vertices[i1].Tu < U0p5) || (!esPolo(vertices[i2]) && vertices[i2].Tu < U0p5) || (!esPolo(vertices[i3]) && vertices[i3].Tu < U0p5)) { List <int> u1 = new List <int>(); List <int> um = new List <int>(); //Clasifico cada vertice segun su Tu1 for (int j = 0; j < 3; j++) { if (vertices[indices[i + j]].Tu == U1 || esPolo(vertices[indices[i + j]])) { u1.Add(i + j); } else if (vertices[indices[i + j]].Tu < U0p5) { um.Add(i + j); } } if (um.Count == 1 && !(esPolo(vertices[indices[u1[0]]]) && vertices[indices[um[0]]].X >= 0)) { //Casos: //2 vertices con u=1 o uno con u=1 y otro con u>0.5 //1 vertice es el polo, y uno de los vertices esta al final de la textura y otro al principio //La coordenada textura del de u >0.5 pasa a ser 1+u indices[um[0]] = dupWithU(vertices, indices, duplicados, um[0], vertices[indices[um[0]]].Tu + UVTiling.X); } else if (!esPolo(vertices[indices[u1[0]]])) { // Caso: // 1 vertice con u=1 y dos con u<0.5 // El u del vertice con u=1 pasa a ser 0 indices[u1[0]] = dupWithU(vertices, indices, duplicados, u1[0], UVOffset.X); } } } } } //Fix polos for (int p = 0; p < 2; p++) { bool first = true; for (int i = 0; i < indices.Count; i += 3)//Por cada triangulo { int iipolo = i; for (; iipolo < i + 3 && indices[iipolo] != polos[p]; iipolo++) { ; } //Si un vertice es el polo if (iipolo < i + 3) { Vertex.PositionColoredTexturedNormal[] u = new Vertex.PositionColoredTexturedNormal[2]; int n = 0; //Guardo los vertices que no son polos. for (int j = 0; j < 3; j++) { if (i + j != iipolo) { u[n++] = vertices[indices[i + j]]; } } float minU = FastMath.Min(u[0].Tu, u[1].Tu); Vertex.PositionColoredTexturedNormal pole = vertices[polos[p]]; //Chequea que no sea un triangulo rectangulo Vertex.PositionColoredTexturedNormal zeroXZ = u[0]; bool noRectangulo = false; if (u[0].X != 0 && u[0].Z != 0) { zeroXZ = u[0]; } else if (u[1].X != 0 && u[1].Z != 0) { zeroXZ = u[1]; } else { noRectangulo = true; } //Interpolo Tu1 if (basePoly.Equals(eBasePoly.ICOSAHEDRON) || noRectangulo) { pole.Tu = minU + FastMath.Abs(u[0].Tu - u[1].Tu) / 2; } else { pole.Tu = zeroXZ.Tu; } if (first) //Si es la primera vez que lo hago, modifico el vertice. { vertices[polos[p]] = pole; first = false; } else //Sino lo duplico. { indices[iipolo] = vertices.Count; vertices.Add(pole); } } } } }