.net - बाइंड पॉज़, कोलाडा में संयुक्त ट्रांसफॉर्म



matrix 3d (1)

मैं कोलाडा को एक कस्टम 3 डी मॉडल प्रारूप निर्यात करने की कोशिश कर रहा हूं। मैंने एक्सएसडी के माध्यम से कोलाडा डेटा कक्षाएं बनाई हैं और अब समस्याएं आती हैं जब मैं उन्हें डेटा से भरने की कोशिश करता हूं, खासकर मैट्रिस के लिए क्या चिंता करता है।

माई स्केलेटन क्लास मूल रूप से संयुक्त वर्गों की एक सरणी है जिसे मैंने बाइनरी फ़ाइल से पढ़ा है और इस तरह के प्रत्येक संयुक्त दिखने वाले हैं (ट्रान्सलेशन और रोटेशन के मान माता-पिता के साथ हैं, या रूट अगर कोई माता-पिता नहीं है, तो हमेशा):

class Joint
{
    List<Joint> Children;
    Quaternion Rotation;
    Joint Parent;
    String Name;
    UInt32 Id;
    Vector3 Traslation;
}

पहली बात यह है कि मैं फ़ाइल के "library_visual_scenes" खंड में जॉइन नोड्स बनाना चाहता हूं। जो काफी सरल है और मुझे सही परिणाम मिलते हैं:

foreach (Joint joint in hierarchicalJoints)
    WriteJointNodes(joint);

private void WriteJointNodes(Joint joint)
{
    Vector3 rotationEulers = Quaternion.ToEulers(joint.Rotation, EulersOrder.ZYX);

    WriteStartElement("node");
    WriteAttributeString("id", String.Concat(joint.Name, "_id"));
    WriteAttributeString("type", "JOINT");
    WriteAttributeString("name", joint.Name);
    {
        WriteElementString("translate", bone.Traslation);
        WriteElementStringAttributes("rotate", String.Concat("0.0 0.0 1.0 ", rotation.Z.ToDegrees()), { "sid", "rotateZ" });
        WriteElementStringAttributes("rotate", String.Concat("0.0 1.0 0.0 ", rotation.Y.ToDegrees()), { "sid", "rotateY" });
        WriteElementStringAttributes("rotate", String.Concat("1.0 0.0 0.0 ", rotation.X.ToDegrees()), { "sid", "rotateX" });
        WriteElementString("scale", "1.0 1.0 1.0");

        Joint[] children = joint.GetChildren();

        for (Int32 i = 0; i < children.Length; ++i)
            WriteJointNodes(children[i]);
    }
    WriteEndElement();
}

आउटपुट का एक उदाहरण यहां दिया गया है:

<node id="bn_head_id" type="JOINT" name="bn_head">
    <translate>0.0732510 0.0000000 0.0000000</translate>
    <rotate sid="rotateZ">1.0 0.0 1.0 0.0</rotate>
    <rotate sid="rotateY">0.0 1.0 0.0 9.0</rotate>
    <rotate sid="rotateX">1.0 0.0 0.0 0.0</rotate>
    <scale>1.0 1.0 1.0</scale>

अब मुश्किल हिस्सा आता है, क्योंकि मुझे "लाइब्रेरी_कंट्रोलर" सेक्शन में वजन (स्किनिंग डेटा) निर्यात करना पड़ता है जो इस तरह दिखता है:

<skin source="#geometry1_id">
    <bind_shape_matrix>1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</bind_shape_matrix>
    <source id="skinU3D1_id-joints">
        <Name_array id="skinU3D1_id-joints-array" count="4">bn_head_id bn_jaw_id bn_lefteye_id bn_righteye_id</Name_array>
        <technique_common>
            <accessor source="#skinU3D1_id-joints-array" count="4" stride="1">
                <param name="JOINT" type="Name"/>
            </accessor>
        </technique_common>
    </source>
    <source id="skinU3D1_id-bind_poses">
        <float_array id="skinU3D1_id-bind_poses-array" count="64">0 0.999831 0.018391 -1.58086 -1 0 0 -0.000000 0 -0.018391 0.999831 0.041763 0 0 0 1 -0.00011 -0.374834 0.927092 0.564468 -1 -0.000506 -0.000323 0.000808 0.00059 -0.927092 -0.374834 1.45633 0 0 0 1 0 0.000036 1 -0.074606 1 0 0 0.032523 0 1 -0.000036 -1.638 0 0 0 1 -0.00004 0.000036 1 -0.074607 1 -0.000302 0.00004 -0.032021 0.000302 1 -0.000036 -1.63774 0 0 0 1</float_array>
        <technique_common>
            <accessor source="#skinU3D1_id-bind_poses-array" count="4" stride="16">
                <param name="TRANSFORM" type="float4x4"/>
            </accessor>
        </technique_common>
        </source>
        // <<Weights Source Here>>
        <joints>
            <input semantic="JOINT" source="#skinU3D1_id-joints"/>
            <input semantic="INV_BIND_MATRIX" source="#skinU3D1_id-bind_poses"/>
        </joints>
        // <<Vertex Weights Here>>
</skin>

यहां, skinU3D1_id-bind_poses-array के पहले 16 मानों को मेरे उदाहरण के bn_head के विपरीत बाइंड पॉज़ का प्रतिनिधित्व करना चाहिए।

मैं जोड़ों के सरणी को ठीक तरह से बना सकता हूं और मैं समस्याओं के बिना ऊर्ध्वाधर वजन को नियंत्रित कर सकता हूं लेकिन मुझे वास्तव में समझ में नहीं आता कि त्वचा नियंत्रक के अंदर उपयोग किए जाने वाले मैट्रिस को कैसे प्राप्त किया जाए। मुझे वाई यूपी अभिविन्यास के साथ कोलाडा मॉडल आउटपुट करने की आवश्यकता है और मुझे पता है कि कोलाडा मैट्रिस कॉलम-प्रमुख हैं।

मेरे पास मौजूद डेटा से शुरू होने पर, मेरे प्रश्न मूल रूप से हैं:

  1. मैं bind_shape_matrix गणना कैसे करूं (इस उदाहरण में यह एक पहचान मैट्रिक्स है लेकिन मैंने अन्य कोलाडा फ़ाइलों को भी देखा है जिसमें यह अलग है)?
  2. मैं प्रत्येक संयुक्त के लिए उलटा बंधक matrices की गणना कैसे करूं?

मुझे पता है कि आप किस फ़ाइल प्रारूप का जिक्र कर रहे हैं। आपके द्वारा उपयोग किए जाने वाले फ़ाइल प्रारूप (.anim) में एक और कंकाल फ़ाइल है (.inv_bind_mats) एक्सटेंशन और एक ही नाम के साथ, आपको कुछ भी गणना करने की आवश्यकता नहीं है, लेकिन केवल .inv_bind_mats फ़ाइल पढ़ें।





collada