扩展Collada Node元素以添加骨骼尾部

时间:2016-05-24 21:48:04

标签: collada

我想编写一个用于导出Skeleton的Collada-1.4导出器。我需要扩展Collada格式以定义一些额外的信息:

  • 骨尾(相对于关节位置)
  • 骨滚(相对于纵轴)
  • 骨骼连接状态(骨骼连接到父关节)

我能想到的最好的方法是使用一个元素并添加一个特定于工具的配置文件,但文档并不清楚如何准确地执行此操作。

我猜这是一个正确的工作示例:

<node id="Armature" name="Armature" type="NODE">
  <matrix sid="transform">
      1 0 0 0.1151489
      0 1 0 0.01073149
      0 0 1 1.730716 
      0 0 0 1</matrix>
  <node id="A" name="A" sid="A" type="JOINT">
    <matrix sid="transform">1 0 0 0 0 0 -1 0 0 1 0 0 0 0 0 1</matrix>
    <node id="B" name="B" sid="B" type="JOINT">
      <matrix sid="transform">
        -0.7919466 -0.4411024 0.422196 0  
         8.9407e-8 0.6914554 0.7224193 1
        -0.6105905 0.5721177 -0.5475955 0 
         0 0 0 1
      </matrix>
      <extra>
        <technique profile="blender">
          <!-- =============================== -->
          <!-- Bone tail offset from bone head -->
          <!-- =============================== -->
          <float_array name="tail" sid="tail" count="3">
            0.0 0.0 1.0
          </float_array>
        </technique>
        <technique_common/>
      </extra>
    </node>
  </node>
</node>

但是我有一些问题:

  • 这是提供骨尾信息的可接受方法吗?
  • 我可以使用technique_common元素作为定义配置文件的替代方法吗?
  • 我是否必须定义一个空的technique_common元素,还是可以跳过它?
  • 是否可以对整个collada文件中的每个骨尾使用sid =“tail”?
  • 是否有更简洁的方法来定义骨尾信息?
  • 我可以更具体的方式使用个人资料吗?例如:

    <node>
      ...
      <extra>
        <technique profile="blender">
          <tail type="float_array" connect="true">0 0 1.0</tail>
          <roll type="float">0</roll>
        </technique>
        <technique_common/>
      </extra>
    </node>
    

我不确定是否允许我定义新元素(tail,role,connect),如上例所示。我可以这样做吗?

我也知道导入器必须知道额外的数据(支持blender配置文件)才能找到骨尾信息。因此,如果工具不知道搅拌器配置文件,它将无法识别其他骨骼信息,但这对我来说没问题。

1 个答案:

答案 0 :(得分:2)

我可以尝试回答你的问题。

  • 如果您阅读了Collada规范中的<extra>标签,则可以 在<technique><technique_common>下编写任何符合XML的数据 xmlns。所以对于你的第一个问题,是的 可以接受的。如果您为XML元素定义了任何模式,那么您 可以在技术中为其赋予<technique_common>属性。
  • 是的,您可以选择<technique>元素,但最好在您的情况下提供个人资料信息。我更愿意使用 <technique_common>并提供您已有的个人资料信息 完成。
  • 如果您没有相关信息,则无需将<extra>元素作为sid的子元素。
  • $scope.events = [ //{title: 'test event',start: moment()}, {title: 'Long Event',start: new Date(y, m, d - 5),end: new Date(y, m, d - 2)}, {id: 999,title: 'Repeating Event',start: new Date(y, m, d - 3, 16, 0),allDay: false}, {id: 999,title: 'Repeating Event',start: new Date(y, m, d + 4, 16, 0),allDay: false}, {title: 'Birthday Party',start: new Date(y, m, d + 1, 19, 0),end: new Date(y, m, d + 1, 22, 30),allDay: false}, {title: 'Click for Google',start: new Date(y, m, 28),end: new Date(y, m, 29),url: 'http://google.com/'} ]; $scope.handleClick = function() { $scope.events.push({title: 'Click for XYZ',start: new Date(y, m, 28),end: new Date(y, m, 29),url: 'http://someurl'}); } 在文档中应该是唯一的。所以不行。您可以尝试连续编号尾部。
  • 骨尾信息更多地是关于语义。我无法回答这个问题。
  • 我认为你在第二个例子中的表现比第一个好。但是你是那个用它来进行数据交换的人。您应该考虑进口商应该如何解释这些数据。如果不了解进口商的实习结构,我无法帮助您。