2011-06-03 80 views
0

我正在尝试创建一个骨骼和IK系统。下面是递归的方法,它计算每个骨骼的绝对位置和绝对角度。我用根骨骼和零参数调用它。它工作正常,但是当我尝试使用CCD IK时,我得到的结果与计算结果之间存在差异。因此,即使它起作用,也许我做错了。我是否将本地空间正确转换为世界空间坐标?

感谢

void Skeleton::_updateBones(Bone* root,float realStartX, float realStartY, float realStartAngle) 
{ 
    if(!root->isRelative()) 
    { 
     realStartX = 0.0f; 
     realStartY = 0.0f; 
     realStartAngle = 0.0f; 
    } 
    realStartX += root->getX(); 
    realStartY += root->getY(); 
    realStartAngle += root->getAngle(); 
    float vecX = sin(realStartAngle); 
    float vecY = cos(realStartAngle); 

    realStartX += (vecX * root->getLength()); 
    realStartY += (vecY * root->getLength()); 

    root->setFrame(realStartX,realStartY,realStartAngle); 

    float angle = fmod(realStartAngle,2.0f * 3.141592f); 

    if(angle < -3.141592f) 
     angle += (2.0f * 3.141592); 
    else if(angle > 3.141592f) 
     angle -= (2.0f * 3.141592f); 
    for(std::list<Bone>::iterator it = root->begin(); it != root->end(); ++it) 
    { 
     _updateBones(&(*it),realStartX,realStartY,angle); 
    } 

} 
+2

如果你编写两个函数:'LocalToWorld'和'WorldToLocal',它们将相当简化你的生活,它将获取坐标并在两个空间之间转换它们。阅读你的代码,我很难说出你在做什么转换。另外,考虑包含'math.h'并使用'M_PI'常量。或者如果你想使用'float'而不是'double'来定义你自己的。 – 2011-06-03 17:13:16

+0

请参阅Jim的评论。并且肯定使用'M_PI'或者等价的。 (例如,Pi实际上比3.141592更接近3.141593 ...只需使用符号常量。)另外,fmod(x,M_PI)保证-M_PI和+ M_PI之间的结果,因此不需要检查该结果。 – Nemo 2011-06-03 17:23:18

+0

是的,请使用'M_PI'或定义您自己的常量或宏。那么你不会无意中忽略浮点数字尾随的'f'。你在'angle + =(2.0f * 3.141592)'这行中做了这个。 – 2011-06-03 17:31:53

回答

1

这看起来是错误的。

float vecX = sin(realStartAngle); 
float vecY = cos(realStartAngle); 

交换sin()cos()

float vecX = cos(realStartAngle); 
float vecY = sin(realStartAngle); 
相关问题