4

问题

我试图通过解析它来从 BVH 文件中获取功能。BVH 文件通过NUICapture导出,这是一款通过 Kinect 捕捉身体运动的软件。

我知道的所有 BVH 示例文件都以ZXY符号而不是指定欧拉角ZYX,但是 NUICapture 使用ZYX符号导出 BVH 文件,因此我无法解析它。

背景

在 BVH 格式中,由于为每个身体部位指定的欧拉角,轴的顺序可能不同。身体部位的旋转由指定轴的矩阵乘法指定,整个身体的运动被视为层次结构中所有连续身体部位的旋转的乘积。由于矩阵乘法不是可交换ZXY的,因此与 不同ZYX

解决方案的尝试

我遇到的所有现有解析器都表示ZXY为事实上的标准,所有论文也是如此。我发现没有一个解析器能够解析 NUICapture 生成的 BVH 文件,但BVHhacker 除外。但是 BVHhacker 没有可用的源代码,因此即使它似乎能够重放 NUICapture 捕获的动作,也无法访问 BVHhacker 解析器创建的内部表示。

我尝试使用开源 Python BVH 解析器(例如BVHPlay)ZXY并尝试导入 NUICapture 的 BVH 文件,但出现文件输入错误,其他具有“正确”格式的示例 BVH 文件不会发生这种情况。为了解决这个问题,我需要以某种方式纠正轴序列,但我不确定如何在不影响原始身体运动完整性的情况下做到这一点。对我来说,仅仅手动切换顺序以允许解析 BVH 可能是非常幼稚的。

4

2 回答 2

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。

于 2013-06-10T19:11:11.670 回答
0

呃......以正确的顺序应用旋转应该非常简单。ZXY 是事实上的标准,但规范明确支持任意顺序。

如果您使用 3ds Max,我们以前为 CAT waaaay 编写了一个 BVH 解析器,您可以在“stdplugs\stdscripts\CATScripts\ImportBVH.ms”中找到它。该脚本手动解析 BVH 文件并支持多种欧拉顺序。我大约有 10 年没看过它了,所以不能保证正确性;但这个理论相当简单。

如果您不使用 Max,是的,您可以更改乘法的顺序。我不熟悉引用的 python 应用程序,但你要做的就是

ZXY = rotMatrix(Z) * rotMatrix(X) * rotMatrix(Y)
ZYX = rotMatrix(Z) * rotMatrix(Y) * rotMatrix(X)

但是,您无法更改 bvh 文件中的值,因此您无法进入文件并仅移动值以获得 ZXY 顺序的旋转。

于 2015-07-29T11:45:01.367 回答