OSDN Git Service

Avatar Rendering: fix avatar posing/skinning, works now some small skinning issues...
authorRobin Cornelius <robin.cornelius@gmail.com>
Fri, 8 Jul 2011 12:29:22 +0000 (12:29 +0000)
committerRobin Cornelius <robin.cornelius@gmail.com>
Fri, 8 Jul 2011 12:29:22 +0000 (12:29 +0000)
git-svn-id: https://radegast.googlecode.com/svn/branches/avatarrendering@955 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/Rendering.Designer.cs
Radegast/GUI/Rendering/Rendering.cs
Radegast/GUI/Rendering/RenderingHelpers.cs

index de1ab77..03eaa83 100644 (file)
@@ -61,9 +61,9 @@ namespace Radegast.Rendering
             this.components = new System.ComponentModel.Container();\r
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SceneWindow));\r
             this.gbZoom = new System.Windows.Forms.GroupBox();\r
+            this.comboBox1 = new System.Windows.Forms.ComboBox();\r
             this.button_vparam = new System.Windows.Forms.Button();\r
-            this.textBox_vparamid = new System.Windows.Forms.TextBox();\r
-            this.hScrollBar_weight = new System.Windows.Forms.HScrollBar();\r
+            this.textBox_x = new System.Windows.Forms.TextBox();\r
             this.hsLOD = new System.Windows.Forms.HScrollBar();\r
             this.hsSpecular = new System.Windows.Forms.HScrollBar();\r
             this.hsDiffuse = new System.Windows.Forms.HScrollBar();\r
@@ -79,15 +79,19 @@ namespace Radegast.Rendering
             this.takeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.returnToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.textBox_y = new System.Windows.Forms.TextBox();\r
+            this.textBox_z = new System.Windows.Forms.TextBox();\r
             this.gbZoom.SuspendLayout();\r
             this.ctxObjects.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
             // gbZoom\r
             // \r
+            this.gbZoom.Controls.Add(this.textBox_z);\r
+            this.gbZoom.Controls.Add(this.textBox_y);\r
+            this.gbZoom.Controls.Add(this.comboBox1);\r
             this.gbZoom.Controls.Add(this.button_vparam);\r
-            this.gbZoom.Controls.Add(this.textBox_vparamid);\r
-            this.gbZoom.Controls.Add(this.hScrollBar_weight);\r
+            this.gbZoom.Controls.Add(this.textBox_x);\r
             this.gbZoom.Controls.Add(this.hsLOD);\r
             this.gbZoom.Controls.Add(this.hsSpecular);\r
             this.gbZoom.Controls.Add(this.hsDiffuse);\r
@@ -97,35 +101,62 @@ namespace Radegast.Rendering
             this.gbZoom.Controls.Add(this.cbAA);\r
             this.gbZoom.Controls.Add(this.chkWireFrame);\r
             this.gbZoom.Dock = System.Windows.Forms.DockStyle.Bottom;\r
-            this.gbZoom.Location = new System.Drawing.Point(0, 507);\r
+            this.gbZoom.Location = new System.Drawing.Point(0, 506);\r
             this.gbZoom.Name = "gbZoom";\r
             this.gbZoom.Size = new System.Drawing.Size(644, 98);\r
             this.gbZoom.TabIndex = 8;\r
             this.gbZoom.TabStop = false;\r
             // \r
+            // comboBox1\r
+            // \r
+            this.comboBox1.FormattingEnabled = true;\r
+            this.comboBox1.Items.AddRange(new object[] {\r
+            "mPelvis",\r
+            "mTorso",\r
+            "mChest",\r
+            "mNeck",\r
+            "mHead",\r
+            "mCollarLeft",\r
+            "mCollarRight",\r
+            "mShoulderLeft",\r
+            "mShoulderRight",\r
+            "mElbowLeft",\r
+            "mElbowRight",\r
+            "mWristRight",\r
+            "mWristLeft",\r
+            "mHipRight",\r
+            "mHipLeft",\r
+            "mKneeRight",\r
+            "mKneeLeft",\r
+            "mAnkleRight",\r
+            "mAnkleLeft",\r
+            "mFootLeft",\r
+            "mFootRight",\r
+            "mToeLeft",\r
+            "mToeRight"});\r
+            this.comboBox1.Location = new System.Drawing.Point(22, 65);\r
+            this.comboBox1.Name = "comboBox1";\r
+            this.comboBox1.Size = new System.Drawing.Size(121, 21);\r
+            this.comboBox1.TabIndex = 28;\r
+            // \r
             // button_vparam\r
             // \r
-            this.button_vparam.Location = new System.Drawing.Point(265, 67);\r
+            this.button_vparam.Location = new System.Drawing.Point(265, 64);\r
             this.button_vparam.Name = "button_vparam";\r
             this.button_vparam.Size = new System.Drawing.Size(75, 23);\r
             this.button_vparam.TabIndex = 27;\r
-            this.button_vparam.Text = "button1";\r
+            this.button_vparam.Text = "Apply";\r
             this.button_vparam.UseVisualStyleBackColor = true;\r
             this.button_vparam.Click += new System.EventHandler(this.button_vparam_Click);\r
             // \r
-            // textBox_vparamid\r
-            // \r
-            this.textBox_vparamid.Location = new System.Drawing.Point(211, 67);\r
-            this.textBox_vparamid.Name = "textBox_vparamid";\r
-            this.textBox_vparamid.Size = new System.Drawing.Size(49, 20);\r
-            this.textBox_vparamid.TabIndex = 26;\r
+            // textBox_x\r
             // \r
-            // hScrollBar_weight\r
-            // \r
-            this.hScrollBar_weight.Location = new System.Drawing.Point(3, 67);\r
-            this.hScrollBar_weight.Name = "hScrollBar_weight";\r
-            this.hScrollBar_weight.Size = new System.Drawing.Size(205, 22);\r
-            this.hScrollBar_weight.TabIndex = 25;\r
+            this.textBox_x.Location = new System.Drawing.Point(149, 66);\r
+            this.textBox_x.Name = "textBox_x";\r
+            this.textBox_x.Size = new System.Drawing.Size(32, 20);\r
+            this.textBox_x.TabIndex = 26;\r
+            this.textBox_x.Text = "0";\r
+            this.textBox_x.TextChanged += new System.EventHandler(this.textBox_vparamid_TextChanged);\r
             // \r
             // hsLOD\r
             // \r
@@ -256,11 +287,27 @@ namespace Radegast.Rendering
             this.deleteToolStripMenuItem.Text = "Delete";\r
             this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click);\r
             // \r
+            // textBox_y\r
+            // \r
+            this.textBox_y.Location = new System.Drawing.Point(187, 67);\r
+            this.textBox_y.Name = "textBox_y";\r
+            this.textBox_y.Size = new System.Drawing.Size(32, 20);\r
+            this.textBox_y.TabIndex = 29;\r
+            this.textBox_y.Text = "0";\r
+            // \r
+            // textBox_z\r
+            // \r
+            this.textBox_z.Location = new System.Drawing.Point(225, 67);\r
+            this.textBox_z.Name = "textBox_z";\r
+            this.textBox_z.Size = new System.Drawing.Size(32, 20);\r
+            this.textBox_z.TabIndex = 30;\r
+            this.textBox_z.Text = "0";\r
+            // \r
             // SceneWindow\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
-            this.ClientSize = new System.Drawing.Size(644, 605);\r
+            this.ClientSize = new System.Drawing.Size(644, 604);\r
             this.Controls.Add(this.gbZoom);\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
             this.Name = "SceneWindow";\r
@@ -292,8 +339,10 @@ namespace Radegast.Rendering
         private System.Windows.Forms.HScrollBar hsAmbient;\r
         private System.Windows.Forms.HScrollBar hsLOD;\r
         private System.Windows.Forms.Button button_vparam;\r
-        private System.Windows.Forms.TextBox textBox_vparamid;\r
-        private System.Windows.Forms.HScrollBar hScrollBar_weight;\r
+        private System.Windows.Forms.TextBox textBox_x;\r
+        private System.Windows.Forms.ComboBox comboBox1;\r
+        private System.Windows.Forms.TextBox textBox_z;\r
+        private System.Windows.Forms.TextBox textBox_y;\r
 \r
     }\r
 }\r
index a943a97..131f569 100644 (file)
@@ -1141,7 +1141,60 @@ namespace Radegast.Rendering
 \r
                     GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
 \r
+                    //Mark the joints\r
+\r
+                   \r
+                    newpos.X += 0.01f;\r
+                    newpos.Y += 0.01f;\r
+                    newpos.Z += 0.01f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.X -= 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                  \r
+                    newpos.Y -= 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.X += 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.Y += 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.Z -= 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.Y -= 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.X -= 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.Y += 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.X += 0.02f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+                    newpos.Y -= 0.01f;\r
+                    newpos.Z += 0.01f;\r
+                    newpos.X -= 0.01f;\r
+                    GL.Vertex3(newpos.X, newpos.Y, newpos.Z);\r
+\r
+\r
+\r
                 }\r
+\r
+\r
                 \r
                 GL.Color3(0.0, 1.0, 0.0);\r
 \r
@@ -2267,12 +2320,14 @@ namespace Radegast.Rendering
         {\r
             //int paramid = int.Parse(textBox_vparamid.Text);\r
             //float weight = (float)hScrollBar_weight.Value/100f;\r
-            float weight = float.Parse(textBox_vparamid.Text);\r
+            float weightx = float.Parse(textBox_x.Text);\r
+            float weighty = float.Parse(textBox_y.Text);\r
+            float weightz = float.Parse(textBox_z.Text);\r
 \r
             foreach (RenderAvatar av in Avatars.Values)\r
             {\r
                 //av.glavatar.morphtest(av.avatar,paramid,weight);\r
-                av.glavatar.skel.deformbone("mShoulderLeft", new Vector3(0, 0, 0), new Vector3(1, 1, 1), Quaternion.CreateFromEulers((float)(Math.PI * (weight / 180)), 0.0f, 0.0f));\r
+                av.glavatar.skel.deformbone(comboBox1.Text, new Vector3(0, 0, 0), new Vector3(1, 1, 1), Quaternion.CreateFromEulers((float)(Math.PI * (weightx / 180)), (float)(Math.PI * (weighty / 180)), (float)(Math.PI * (weightz / 180))));\r
 \r
                 foreach (GLMesh mesh in av.glavatar._meshes.Values)\r
                {\r
@@ -2282,6 +2337,11 @@ namespace Radegast.Rendering
            }\r
         }\r
 \r
+        private void textBox_vparamid_TextChanged(object sender, EventArgs e)\r
+        {\r
+\r
+        }\r
+\r
        \r
 \r
     }\r
index 150e2a0..803d9d8 100644 (file)
@@ -793,31 +793,34 @@ namespace Radegast.Rendering
                 // ON upper torso 5 and 10 are not used\r
                 // 4 is neck and 6 and 11 are the left and right collar bones\r
 \r
-                //the bone rotations are stored with each bone as a SRT 4x4 matrix\r
-                //it is suspose to be a case of just mulutiplying the bone chain together\r
+                Vector3 lerp;\r
+\r
+                Vector3 offset;\r
+                Quaternion rot = ba.getRotation();\r
 \r
-                Matrix4 deform;\r
-                Matrix4 ma = ba.getdeform();\r
-              \r
                 if (bb != null)\r
                 {\r
-                    Matrix4 mb = bb.getdeform();\r
-                    deform = Matrix4.Lerp(ma, mb, weight);\r
+                    Vector3 oa = ba.getOffset() - ba.getOrigOffset();\r
+                    Vector3 ob = bb.getOffset() - bb.getOrigOffset();\r
+                    lerp = Vector3.Lerp(oa, ob, weight);\r
+                    offset = Vector3.Lerp(ba.getOffset(), bb.getOffset(), weight);\r
                 }\r
                 else\r
                 {\r
-                    deform = ba.getdeform();\r
+                    lerp = ba.getOffset()- ba.getOrigOffset();\r
+                    offset = ba.getOffset();\r
+                    rot = ba.getRotation();\r
                 }\r
 \r
                 Vector3 pos = new Vector3(OrigRenderData.Vertices[v], OrigRenderData.Vertices[v + 1], OrigRenderData.Vertices[v + 2]);\r
-                pos = pos - (ba.getOffset() - ba.getOrigOffset());\r
-                Vector3 newpos = pos * deform;\r
-                newpos = newpos + (ba.getOffset()-ba.getOrigOffset());\r
-\r
-                RenderData.Vertices[v] = newpos.X;\r
-                RenderData.Vertices[v + 1] = newpos.Y;\r
-                RenderData.Vertices[v + 2] = newpos.Z;\r
-                \r
+                pos = pos + lerp; \r
+                pos = pos - offset;\r
+                pos = pos * rot;\r
+                pos = pos + offset;\r
+               \r
+                RenderData.Vertices[v] = pos.X;\r
+                RenderData.Vertices[v + 1] = pos.Y;\r
+                RenderData.Vertices[v + 2] = pos.Z;\r
             }\r
         }\r
 \r
@@ -1294,7 +1297,8 @@ namespace Radegast.Rendering
             b.scale = new Vector3(float.Parse(scaleparts[0]), float.Parse(scaleparts[1]), float.Parse(scaleparts[2]));\r
             b.orig_scale = new Vector3(b.scale);\r
 \r
-            float[] deform = Math3D.CreateSRTMatrix(new Vector3(1,1,1), b.rot, new Vector3(0,0,0));\r
+\r
+            float[] deform = Math3D.CreateSRTMatrix(new Vector3(1,1,1), b.rot, b.orig_pos);\r
             b.mDeformMatrix = new Matrix4(deform[0], deform[1], deform[2], deform[3], deform[4], deform[5], deform[6], deform[7], deform[8], deform[9], deform[10], deform[11], deform[12], deform[13], deform[14], deform[15]);\r
 \r
             //TODO piviot\r
@@ -1318,7 +1322,7 @@ namespace Radegast.Rendering
 \r
         public void deformbone(Vector3 pos, Vector3 scale, Quaternion rot)\r
         {\r
-            float[] deform = Math3D.CreateSRTMatrix(scale, rot, pos);\r
+            float[] deform = Math3D.CreateSRTMatrix(scale, rot, this.orig_pos);\r
             mDeformMatrix = new Matrix4(deform[0], deform[1], deform[2], deform[3], deform[4], deform[5], deform[6], deform[7], deform[8], deform[9], deform[10], deform[11], deform[12], deform[13], deform[14], deform[15]);\r
             this.pos = Bone.mBones[name].orig_pos + pos;\r
             this.scale = Bone.mBones[name].orig_scale * scale;\r
@@ -1341,7 +1345,7 @@ namespace Radegast.Rendering
         {\r
             if (parent != null)\r
             {\r
-                Quaternion totalrot = getRotation();\r
+                Quaternion totalrot = getParentRot(); // we don't want this joints rotation included\r
                 Vector3 parento = parent.getOffset();\r
                 Vector3 mepre = pos * scale;\r
                 mepre = mepre * totalrot;\r
@@ -1383,6 +1387,20 @@ namespace Radegast.Rendering
             }\r
         }\r
 \r
+\r
+        public Quaternion getParentRot()\r
+        {\r
+            Quaternion totalrot = Quaternion.Identity;\r
+\r
+            if (parent != null)\r
+            {\r
+                totalrot = parent.getRotation();\r
+            }\r
+\r
+            return totalrot;\r
+\r
+        }\r
+\r
         public Quaternion getRotation()\r
         {\r
             Quaternion totalrot = rot;\r
@@ -1695,53 +1713,5 @@ namespace Radegast.Rendering
             string[] rotparts = data.Split(' ');\r
             return Quaternion.CreateFromEulers((float)(float.Parse(rotparts[0]) * Math.PI / 180f), (float)(float.Parse(rotparts[1]) * Math.PI / 180f), (float)(float.Parse(rotparts[2]) * Math.PI / 180f));\r
         }\r
-\r
-    }\r
-\r
-    class Tests\r
-    {\r
-        static public void runtest()\r
-        {\r
-            Vector3 i = new Vector3(1, 1, 1);\r
-            Vector3 o;\r
-            float[] deform = Math3D.CreateSRTMatrix(new Vector3(1, 1, 1), Quaternion.Identity, new Vector3(0, 0, 0));\r
-            Matrix4 mDeformMatrix = new Matrix4(deform[0], deform[1], deform[2], deform[3], deform[4], deform[5], deform[6], deform[7], deform[8], deform[9], deform[10], deform[11], deform[12], deform[13], deform[14], deform[15]);\r
-            o = i * mDeformMatrix;\r
-\r
-            Console.WriteLine(String.Format("Input {0}, output {1}",i,o));\r
-\r
-            if (i != new Vector3(1, 1, 1))\r
-                throw (new Exception("Test failed"));\r
-\r
-            // End of test\r
-\r
-            i = new Vector3(0, 10, 0);\r
-\r
-            deform = Math3D.CreateSRTMatrix(new Vector3(1, 1, 1), Quaternion.CreateFromEulers(0,0,(float)(Math.PI*90.0f/180.0f)), new Vector3(0, 0, 0));\r
-            mDeformMatrix = new Matrix4(deform[0], deform[1], deform[2], deform[3], deform[4], deform[5], deform[6], deform[7], deform[8], deform[9], deform[10], deform[11], deform[12], deform[13], deform[14], deform[15]);\r
-            o = i * mDeformMatrix;\r
-            Console.WriteLine(String.Format("Input {0}, output {1}",i,o));\r
-\r
-\r
-            deform = Math3D.CreateSRTMatrix(new Vector3(1, 1, 1), Quaternion.CreateFromEulers(0, 0, (float)(Math.PI * 90.0f / 180.0f)), new Vector3(0, 0, 0));\r
-            mDeformMatrix = new Matrix4(deform[0], deform[4], deform[8], deform[12], deform[1], deform[5], deform[9], deform[13], deform[2], deform[6], deform[10], deform[14], deform[3], deform[7], deform[11], deform[15]);\r
-            o = i * mDeformMatrix;\r
-            Console.WriteLine(String.Format("Input {0}, output {1}",i,o));\r
-\r
-            deform = Math3D.CreateSRTMatrix(new Vector3(1, 1, 1), Quaternion.Identity, new Vector3(20, 0, 0));\r
-//            mDeformMatrix = new Matrix4(deform[0], deform[4], deform[8], deform[12], deform[1], deform[5], deform[9], deform[13], deform[2], deform[6], deform[10], deform[14], deform[3], deform[7], deform[11], deform[15]);\r
-            mDeformMatrix = new Matrix4(deform[0], deform[1], deform[2], deform[3], deform[4], deform[5], deform[6], deform[7], deform[8], deform[9], deform[10], deform[11], deform[12], deform[13], deform[14], deform[15]);\r
-\r
-            Matrix4 mDeformMatrix2 = new Matrix4(deform[0], deform[1], deform[2], deform[3], deform[4], deform[5], deform[6], deform[7], deform[8], deform[9], deform[10], deform[11], deform[12], deform[13], deform[14], deform[15]);\r
-\r
-\r
-            Matrix4 xx = mDeformMatrix2 * mDeformMatrix;\r
-            Console.WriteLine(String.Format("Input {0}, output {1}", i, o));\r
-\r
-        }\r
-\r
-\r
     }\r
-\r
-\r
 }\r