2015-07-01 17 views
24

Ortak Dönüşümler Ben Collada için özel 3 boyutlu model biçimi vermek çalışıyorum pozlar. Collada veri sınıflarını XSD ile oluşturdum ve şimdi özellikle matrislerle ilgili olanları içeren verileri doldurmaya çalıştığımda sorunlar geliyor.Bind Collada

Benim Skeleton sınıfım temel olarak ikili dosyadan okuduğum ve her Ortak'ın bu gibi görünen bir Ortak sınıflar dizisidir (traslation ve rotasyon değerleri ana Ortak'a göre veya her zaman ebeveyn değilse Root). :

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

ilk işim dosyanın "library_visual_scenes" bölümünde ORTAK düğümleri oluşturmaktır. Hangi oldukça basit ve doğru sonuçlar elde: Ben de ihracat ağırlıkları (zarını verileri) içine zorunda beri

<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> 

Şimdi zor kısmı, gelir: Burada

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

çıktı örneğidir şöyle "library_controllers" bölümü: Burada

<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 ilk 16 değerleri, ters bağlama temsil etmelidir ait bn_head arasında poz benim örneğim.

düzgün eklem dizisi oluşturabilir ve sorunsuz ağırlıklar köşe işleyebilir ama gerçekten matrisler cilt Kontrolörün içinde kullanılan edinme anlamıyorum. Y UP oryantasyonuyla bir Collada modeli çıkarmam gerekiyor ve tek bildiğim, Collada matrislerinin kolon-major olmasıdır. Elimdeki verilere başlayarak

, sorularım temelde şunlardır:

  1. nasıl hesaplarım bind_shape_matrix (bir kimlik matrisi var ama ben de durum farklı olduğu diğer Collada dosyaları gördüğüm bu örnekte) ?
  2. Her bağlantı için ters bağlama matrislerini nasıl hesaplarım?
+1

Bağlama şekli matrisinizi hesaplamanız gerekmemelidir; sizde ya var ya da yok. Bu değer temel olarak bağlı ağa bir sapmadır. Eğer zaten sahip değilseniz (kaynak dosya formatınız bunu belirtmiyorsa), sadece kimlik olarak bırakın. ? – FrozenKiwi

+0

Ve ters bağlama matrisler float_array id = "skinU3D1_id-bind_poses-dizi belirtilmiştir Zaten geçerli bir ihracat var gibi - Ben sorunuzu anlama ediyorsam emin değilim – FrozenKiwi

+0

Aslında ben nasıl anlamamız gerekir? ters bağlama pozlar hesaplamak ve yerel matrisleri dönüştürmeye. Bildiğim kadarıyla birkaç dönüştürücüler olanlar hesaplamak için 4x3 matrisleri kullanmak biliyorum. –

cevap

0

Sana atıfta hangi dosya biçimi biliyorum. Kullandığınız dosya formatı (.anim), (.inv_bind_mats) uzantılı ve aynı ada sahip bir iskelet dosyasına sahiptir, bir şey hesaplamanıza gerek yoktur, sadece .inv_bind_mats dosyasını okuyun.

+0

@zarathos da küçük bir soruyu yanıtlayabilir misiniz, rotasyon kuaternionunu nasıl okuyorsunuz? Yarım bayt olarak 2 bayt ve sonra süzülmeli ya da ne? –