如何从平移,旋转和缩放变换转换4x4矩阵?

时间:2016-10-01 07:29:43

标签: c# math matrix collada

我有3个人体骨骼转换(臀部骨骼的例子):

  <node id="hips" name="hips_bone" type="JOINT">
    <translate>0 0.941045 -0.02637</translate>
    <rotate sid="rotateZ">0 0 1 90</rotate>
    <rotate sid="rotateY">0 1 0 -12.0004</rotate>
    <rotate sid="rotateX">1 0 0 0</rotate>
    <scale>1 1 1</scale>
  </node>

有没有办法将这些数据转换为4x4矩阵? (我想我们可以抛弃比例转换,因为它总是1 1 1)。

更确切地说,我想要达到的结果:

<matrix sid="matrix">
  0.978148 -0.207912 0.000000 0.000000
  0.207912 0.978148 0.000000 -0.000012
  -0.000000 0.000000 1.000000 0.000000
  0.000000 0.000000 0.000000 1.000000
</matrix>

(结果矩阵不等于上面的转换数据)。

c#中是否有任何有用的结构可用于4x4矩阵?

2 个答案:

答案 0 :(得分:1)

如果您想在C#中使用3D图形,您可以使用专用框架,例如OpenTK(https://www.nuget.org/packages/OpenTK/)。它提供了一种在C#中使用OpenGL功能的方法。它还有许多有用的方法来处理转换,包括使用4x4矩阵。使用OpenTK库,您还可以获得一些示例项目,以了解它是如何工作的,或者通过其中一个教程(例如http://genericgamedev.com/tutorials/opengl-in-csharp-an-object-oriented-introduction-to-opentk/)。

我喜欢OpenTK的事实是,它可以被注入WinForms或WPF项目,就像任何其他控件或用户在游戏窗口模式中类似于OpenGL中使用的那种。

我希望我能提供帮助。

答案 1 :(得分:0)

  

有没有办法将这些数据转换为4x4矩阵? (我想我们可以抛弃比例转换因为它总是1 1 1。)

首先构建一个ID矩阵,然后应用translate,apply rotate ......等等

我的实现(ak_transformCombine)它从各个变换构建4x4矩阵: https://github.com/recp/assetkit/blob/master/src/transform/ak_trans.c#L50

这是C代码而不是C#,但数学是相同的, 在将来我可能会为它编写C#包装器

不要忘记其中一些变换有sid attrib,如sid =“rotateZ”。如果这些sid - ed转换在其他地方使用/引用,比如动画,它将禁用动画......