我试图通过解析来获取BVH文件中的功能。 BVH文件通过NUICapture导出,该软件通过Kinect捕获身体移动。
我知道的所有BVH示例文件都以ZXY
表示法指定欧拉角,而不是ZYX
,但NUICapture使用ZYX
表示法导出BVH文件,因此我在解析它时遇到问题
在BVH格式中,由于为每个身体部位指定的欧拉角,轴的顺序可能不同。通过指定轴的矩阵乘法来指定身体部位的旋转,并且将整个身体的运动视为层次结构中所有连续身体部位的旋转的乘积。由于矩阵乘法不可交换,ZXY
与ZYX
不同。
我遇到的所有现有解析器都将ZXY
表示为事实上的标准,所有论文也都表示。我找到的解析器都没有能够解析NUICapture生成的BVH文件,但BVHhacker除外。但是BVHhacker没有可用的源代码,因此即使它似乎能够重放NUICapture捕获的动作,也无法访问BVHhacker解析器创建的内部表示。
我尝试使用开源Python BVH解析器,例如BVHPlay并尝试导入NUICapture的BVH文件,但是存在文件输入错误,其他样本BVH文件不会出现“正确” “ZXY
格式。为了解决这个问题,我需要以某种方式纠正轴序列,但我不知道如何做到这一点而不影响原始身体运动的完整性。对我来说,手动切换订单以允许解析BVH可能是天真的。
答案 0 :(得分:1)
请参阅本页底部:http://research.cs.wisc.edu/graphics/Courses/cs-838-1999/Jeff/BVH.html 如您所见,您通过每个轴的旋转矩阵的倒数预乘,以相反的顺序,然后(预)乘以正确的顺序的矩阵。 因此,如果你有R = XYZ,你将R乘以X ^( - 1),然后将结果乘以Y ^( - 1),然后将结果乘以X然后乘以Y,这样你最终得到 Y * X * Y ^( - 1)* X ^( - 1)* R
答案 1 :(得分:0)
呃......以正确的顺序应用旋转应该非常简单。 ZXY是事实上的标准,但规范明确支持任意订单。
如果您使用3ds Max,我们在当天为CAT waaaay写了一个BVH解析器,您可以在“stdplugs \ stdscripts \ CATScripts \ ImportBVH.ms”中找到它。此脚本手动解析BVH文件并支持各种euler订单。我在大约10年内没有看过它,所以不能保证正确性;但理论相当直接。
如果您不使用Max,是的,您只需更改乘法的顺序即可。我不熟悉引用的python应用程序,但所有你必须做的是
ZXY = rotMatrix(Z) * rotMatrix(X) * rotMatrix(Y)
ZYX = rotMatrix(Z) * rotMatrix(Y) * rotMatrix(X)
你不能改变bvh文件中的值,所以你不能进入文件只是移动值来获得ZXY顺序的旋转。