/// <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(); } } }
/// <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(); } } }
/// <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; }
/// <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; } }