Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 4
0
        /// <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;
        }
Ejemplo n.º 5
0
 /// <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());
 }
Ejemplo n.º 6
0
        /// <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);
        }