实现像kinect层次旋转

问题描述:

我会得到一些关于人类20个骨架的3d位置(在固定的世界坐标系统中)的数据流。实现像kinect层次旋转

我想使用骨架数据来驱动一个像demo video这样的固定骨骼的人体模型。

在Kinect SDK v1.8中,我可以通过NUI_SKELETON_BONE_ORIENTATION.hierarchicalRotation获得每个骨架的局部旋转。

我想实现这样的功能,但Kinect的SDK不是开源的。

我发现函数xnGetSkeletonJointOrientation可以像OpenNI那样得到框架的旋转。但是我还没有找到关于这个的实现函数。我不知道我在哪里错了。

任何想法表示赞赏。谢谢!

编辑

我已经找到了similar question

这是他最后使用的代码。

Point3d Controller::calRelativeToParent(int parentID,Point3d point,int frameID){ 
if(parentID == 0){ 
    QUATERNION temp = calChangeAxis(-1,parentID,frameID); 
    return getVect(multiplyTwoQuats(multiplyTwoQuats(temp,getQuat(point)),getConj(temp))); 
}else{ 
    Point3d ref = calRelativeToParent(originalRelativePointMap[parentID].parentID,point,frameID); 
    QUATERNION temp = calChangeAxis(originalRelativePointMap[parentID].parentID,parentID,frameID); 
    return getVect(multiplyTwoQuats(multiplyTwoQuats(temp,getQuat(ref)),getConj(temp))); 
}} 
QUATERNION Controller::calChangeAxis(int parentID,int qtcId,int frameID){ //currentid = id of the position of the orientation to be changed 
if(parentID == -1){ 
    QUATERNION out = multiplyTwoQuats(quatOrigin.toChange,originalRelativePointMap[qtcId].orientation); 
    return out; 
} 
else{ 
    //QUATERNION temp = calChangeAxis(originalRelativePointMap[parentID].parentID,qtcId,frameID); 
    //return multiplyTwoQuats(finalQuatMap[frameID][parentID].toChange,temp); 
    return multiplyTwoQuats(finalQuatMap[frameID][parentID].toChange,originalRelativePointMap[qtcId].orientation); 
}} 

但我仍然有一些关于这个问题。

变量quatOrigin.toChangeoriginalRelativePointMap代表什么?

,在我看来,参数Point3d point功能Controller::calRelativeToParent应符合欧拉angle.In这样一个载体,如何调用API Controller::calRelativeToParent在主program.Because我们只知道根的转动。

骨架类有一个“接头”成员,其中包含骨架上每个跟踪关节的所有三维位置数据。我会直接查看联合位置数据来驱动您的模型而不是角度。取一点作为你的基础(头或其他),然后在连接的骨骼点对之间以树形式生成向量。缩放这些向量并将其应用于您的模型。

+0

对不起,我的“关节”成员是从一些像kinect那样的设备获得的,没有高精度的关节位置。所以我不能通过关节位置来驱动我的模型,我想通过分层方向来驱动它。 – zdczdcc

+0

是的,我只是建议你推导出你自己的层次取向,因为我不记得你是否可以直接从kinect中获取。如果您担心噪音,请对每个点应用低通滤波器。但为了澄清,我建议你将每个关节进行连接并将它们分组,然后使用这些方向向量来创建您的层次结构。 –

+0

我可以得到每帧20关节,并将其保存到磁盘进行一些测试脱机。关键是我不知道如何派生分层orientation.And我想得到一个示例项目进行学习。所以我下载'OpenNI'和'libfreenect'.But我还没有在这两个项目中找到相关的代码。 – zdczdcc