/// <summary> /// Crear un BoundingBox igual a este /// </summary> /// <returns>BoundingBox clonado</returns> public TgcBoundingBox clone() { var cloneBbox = new TgcBoundingBox(); cloneBbox.pMin = pMin; cloneBbox.pMax = pMax; cloneBbox.pMinOriginal = pMinOriginal; cloneBbox.pMaxOriginal = pMaxOriginal; return(cloneBbox); }
/// <summary> /// Crea una pared vacia. /// </summary> public TgcPlaneWall() { vertices = new CustomVertex.PositionTextured[6]; AutoAdjustUv = false; Enabled = true; BoundingBox = new TgcBoundingBox(); UTile = 1; VTile = 1; AlphaBlendEnable = false; UVOffset = new Vector2(0, 0); //Shader effect = TgcShaders.Instance.VariosShader; technique = TgcShaders.T_POSITION_TEXTURED; }
/// <summary> /// Crea el terreno /// </summary> public TgcEditableLand() { //16 caras, 32 triangulos, 96 vertices vertices = new CustomVertex.PositionTextured[96]; vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionTextured), vertices.Length, D3DDevice.Instance.Device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); //Crear los 25 vertices editables, formando una grilla de 5x5 vertices editableVertices = new EditableVertex[25]; var uvStep = 1f / 4f; for (var i = 0; i < 5; i++) { for (var j = 0; j < 5; j++) { var v = new EditableVertex(); v.Pos = new Vector3(j * PATCH_SIZE, 0, i * PATCH_SIZE); v.UV = new Vector2(j * uvStep, i * uvStep); editableVertices[i * 5 + j] = v; } } AutoTransformEnable = true; Transform = Matrix.Identity; translation = new Vector3(0, 0, 0); rotation = new Vector3(0, 0, 0); scale = new Vector3(1, 1, 1); Enabled = true; AlphaBlendEnable = false; UVOffset = new Vector2(0, 0); UVTiling = new Vector2(1, 1); //BoundingBox BoundingBox = new TgcBoundingBox(); updateBoundingBox(); //Shader effect = TgcShaders.Instance.VariosShader; technique = TgcShaders.T_POSITION_TEXTURED; }
/// <summary> /// Crea una caja vacia /// </summary> public TgcBox() { vertices = new CustomVertex.PositionColoredTextured[36]; vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColoredTextured), vertices.Length, D3DDevice.Instance.Device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColoredTextured.Format, Pool.Default); AutoTransformEnable = true; Transform = Matrix.Identity; translation = new Vector3(0, 0, 0); rotation = new Vector3(0, 0, 0); Enabled = true; color = Color.White; AlphaBlendEnable = false; UVOffset = new Vector2(0, 0); UVTiling = new Vector2(1, 1); //BoundingBox BoundingBox = new TgcBoundingBox(); //Shader effect = TgcShaders.Instance.VariosShader; technique = TgcShaders.T_POSITION_COLORED; }
/// <summary> /// Generar OBB a partir de AABB /// </summary> /// <param name="aabb">BoundingBox</param> /// <returns>OBB generado</returns> public static TgcObb computeFromAABB(TgcBoundingBox aabb) { return(computeFromAABB(aabb.toStruct()).toClass()); }
/// <summary> /// Calcular OBB a partir de un conjunto de puntos. /// Prueba todas las orientaciones entre initValues y endValues, saltando de angulo en cada intervalo segun step /// Continua recursivamente hasta llegar a un step menor a 0.01f /// </summary> /// <returns></returns> private static OBBStruct computeFromPointsRecursive(Vector3[] points, Vector3 initValues, Vector3 endValues, float step) { var minObb = new OBBStruct(); var minVolume = float.MaxValue; var minInitValues = Vector3.Empty; var minEndValues = Vector3.Empty; var transformedPoints = new Vector3[points.Length]; float x, y, z; x = initValues.X; while (x <= endValues.X) { y = initValues.Y; var rotX = FastMath.ToRad(x); while (y <= endValues.Y) { z = initValues.Z; var rotY = FastMath.ToRad(y); while (z <= endValues.Z) { //Matriz de rotacion var rotZ = FastMath.ToRad(z); var rotM = Matrix.RotationYawPitchRoll(rotY, rotX, rotZ); Vector3[] orientation = { new Vector3(rotM.M11, rotM.M12, rotM.M13), new Vector3(rotM.M21, rotM.M22, rotM.M23), new Vector3(rotM.M31, rotM.M32, rotM.M33) }; //Transformar todos los puntos a OBB-space for (var i = 0; i < transformedPoints.Length; i++) { transformedPoints[i].X = Vector3.Dot(points[i], orientation[0]); transformedPoints[i].Y = Vector3.Dot(points[i], orientation[1]); transformedPoints[i].Z = Vector3.Dot(points[i], orientation[2]); } //Obtener el AABB de todos los puntos transformados var aabb = TgcBoundingBox.computeFromPoints(transformedPoints); //Calcular volumen del AABB var extents = aabb.calculateAxisRadius(); extents = TgcVectorUtils.abs(extents); var volume = extents.X * 2 * extents.Y * 2 * extents.Z * 2; //Buscar menor volumen if (volume < minVolume) { minVolume = volume; minInitValues = new Vector3(x, y, z); minEndValues = new Vector3(x + step, y + step, z + step); //Volver centro del AABB a World-space var center = aabb.calculateBoxCenter(); center = center.X * orientation[0] + center.Y * orientation[1] + center.Z * orientation[2]; //Crear OBB minObb.center = center; minObb.extents = extents; minObb.orientation = orientation; } z += step; } y += step; } x += step; } //Recursividad en mejor intervalo encontrado if (step > 0.01f) { minObb = computeFromPointsRecursive(points, minInitValues, minEndValues, step / 10f); } return(minObb); }