Пример #1
0
        /// <summary>
        /// Dibujar el esqueleto de la malla
        /// </summary>
        protected void renderSkeletonMesh()
        {
            Device  device  = GuiController.Instance.D3dDevice;
            Vector3 ceroVec = new Vector3(0, 0, 0);

            //Dibujar huesos y joints
            for (int i = 0; i < bones.Length; i++)
            {
                TgcSkeletalBone bone = bones[i];

                //Renderizar Joint
                TgcBox jointBox = skeletonRenderJoints[i];
                jointBox.Transform = bone.MatFinal * this.transform;
                jointBox.render();

                //Modificar línea del bone
                if (bone.ParentBone != null)
                {
                    TgcLine boneLine = skeletonRenderBones[i];

                    boneLine.PStart = TgcVectorUtils.transform(ceroVec, bone.MatFinal * this.transform);
                    boneLine.PEnd   = TgcVectorUtils.transform(ceroVec, bone.ParentBone.MatFinal * this.transform);
                    boneLine.updateValues();
                }
            }

            //Dibujar bones
            foreach (TgcLine boneLine in skeletonRenderBones)
            {
                if (boneLine != null)
                {
                    boneLine.render();
                }
            }
        }
Пример #2
0
        /// <summary>
        ///     Dibujar el esqueleto de la malla
        /// </summary>
        protected void renderSkeletonMesh()
        {
            var ceroVec = new Vector3(0, 0, 0);

            //Dibujar huesos y joints
            for (var i = 0; i < bones.Length; i++)
            {
                var bone = bones[i];

                //Renderizar Joint
                var jointBox = skeletonRenderJoints[i];
                jointBox.Transform = bone.MatFinal * transform;
                jointBox.render();

                //Modificar línea del bone
                if (bone.ParentBone != null)
                {
                    var boneLine = skeletonRenderBones[i];

                    boneLine.PStart = TgcVectorUtils.transform(ceroVec, bone.MatFinal * transform);
                    boneLine.PEnd   = TgcVectorUtils.transform(ceroVec, bone.ParentBone.MatFinal * transform);
                    boneLine.updateValues();
                }
            }

            //Dibujar bones
            foreach (var boneLine in skeletonRenderBones)
            {
                if (boneLine != null)
                {
                    boneLine.render();
                }
            }
        }
Пример #3
0
        /// <summary>
        /// Transformar fisicamente los vertices del mesh segun su transformacion actual
        /// </summary>
        private void applyMeshTransformToVertices(TgcMesh m)
        {
            //Transformacion actual
            Matrix transform = Matrix.Scaling(m.Scale)
                               * Matrix.RotationYawPitchRoll(m.Rotation.Y, m.Rotation.X, m.Rotation.Z)
                               * Matrix.Translation(m.Position);

            switch (m.RenderType)
            {
            case TgcMesh.MeshRenderType.VERTEX_COLOR:
                TgcSceneLoader.VertexColorVertex[] verts1 = (TgcSceneLoader.VertexColorVertex[])m.D3dMesh.LockVertexBuffer(
                    typeof(TgcSceneLoader.VertexColorVertex), LockFlags.ReadOnly, m.D3dMesh.NumberVertices);
                for (int i = 0; i < verts1.Length; i++)
                {
                    verts1[i].Position = TgcVectorUtils.transform(verts1[i].Position, transform);
                }
                m.D3dMesh.SetVertexBufferData(verts1, LockFlags.None);
                m.D3dMesh.UnlockVertexBuffer();
                break;

            case TgcMesh.MeshRenderType.DIFFUSE_MAP:
                TgcSceneLoader.DiffuseMapVertex[] verts2 = (TgcSceneLoader.DiffuseMapVertex[])m.D3dMesh.LockVertexBuffer(
                    typeof(TgcSceneLoader.DiffuseMapVertex), LockFlags.ReadOnly, m.D3dMesh.NumberVertices);
                for (int i = 0; i < verts2.Length; i++)
                {
                    verts2[i].Position = TgcVectorUtils.transform(verts2[i].Position, transform);
                }
                m.D3dMesh.SetVertexBufferData(verts2, LockFlags.None);
                m.D3dMesh.UnlockVertexBuffer();
                break;

            case TgcMesh.MeshRenderType.DIFFUSE_MAP_AND_LIGHTMAP:
                TgcSceneLoader.DiffuseMapAndLightmapVertex[] verts3 = (TgcSceneLoader.DiffuseMapAndLightmapVertex[])m.D3dMesh.LockVertexBuffer(
                    typeof(TgcSceneLoader.DiffuseMapAndLightmapVertex), LockFlags.ReadOnly, m.D3dMesh.NumberVertices);
                for (int i = 0; i < verts3.Length; i++)
                {
                    verts3[i].Position = TgcVectorUtils.transform(verts3[i].Position, transform);
                }
                m.D3dMesh.SetVertexBufferData(verts3, LockFlags.None);
                m.D3dMesh.UnlockVertexBuffer();
                break;
            }

            //Quitar movimientos del mesh
            m.Position            = new Vector3(0, 0, 0);
            m.Scale               = new Vector3(1, 1, 1);
            m.Rotation            = new Vector3(0, 0, 0);
            m.Transform           = Matrix.Identity;
            m.AutoTransformEnable = true;

            //Calcular nuevo bounding box
            m.createBoundingBox();
        }
        /// <summary>
        ///     Transforma el BondingBox en base a una matriz de transformación.
        ///     Esto implica escalar, rotar y trasladar.
        ///     El procedimiento es mas costoso que solo hacer scaleTranslate().
        ///     Se construye un nuevo BoundingBox en base a los puntos extremos del original
        ///     más la transformación pedida.
        ///     Si el BoundingBox se transformó y luego se llama a scaleTranslate(), se respeta
        ///     la traslación y la escala, pero la rotación se va a perder.
        /// </summary>
        /// <param name="transform"></param>
        public void transform(Matrix transform)
        {
            //Transformar vertices extremos originales
            var corners    = computeCorners(pMinOriginal, pMaxOriginal);
            var newCorners = new Vector3[corners.Length];

            for (var i = 0; i < corners.Length; i++)
            {
                newCorners[i] = TgcVectorUtils.transform(corners[i], transform);
            }

            //Calcular nuevo BoundingBox en base a extremos transformados
            var newBB = computeFromPoints(newCorners);

            //actualizar solo pMin y pMax, pMinOriginal y pMaxOriginal quedan sin ser transformados
            pMin = newBB.pMin;
            pMax = newBB.pMax;

            dirtyValues = true;
        }
Пример #5
0
        /// <summary>
        /// Crea mallas a modo Debug para visualizar la configuración del esqueleto
        /// </summary>
        public void buildSkletonMesh()
        {
            //Crear array para dibujar los huesos y joints
            Color   jointsColor = Color.Violet;
            Color   bonesColor  = Color.Yellow;
            Vector3 jointsSize  = new Vector3(2, 2, 2);
            Vector3 ceroVec     = new Vector3(0, 0, 0);

            skeletonRenderJoints = new TgcBox[bones.Length];
            skeletonRenderBones  = new TgcLine[bones.Length];
            int boneColor = Color.Yellow.ToArgb();

            //Actualizar jerarquia
            for (int i = 0; i < bones.Length; i++)
            {
                TgcSkeletalBone bone = bones[i];

                //Es hijo o padre
                if (bone.ParentBone == null)
                {
                    skeletonRenderBones[i] = null;
                }
                else
                {
                    //Crear linea de hueso para renderziar esqueleto
                    TgcLine boneLine = new TgcLine();
                    boneLine.PStart        = TgcVectorUtils.transform(ceroVec, bone.MatFinal);
                    boneLine.PEnd          = TgcVectorUtils.transform(ceroVec, bone.ParentBone.MatFinal);
                    boneLine.Color         = bonesColor;
                    skeletonRenderBones[i] = boneLine;
                }
                //Crear malla de Joint para renderizar el esqueleto
                TgcBox jointBox = TgcBox.fromSize(jointsSize, jointsColor);
                jointBox.AutoTransformEnable = false;
                skeletonRenderJoints[i]      = jointBox;
            }
        }