2011-06-03 4 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

あなたは二つの機能を記述し、かなり場合は、あなたの人生を簡素化します。あなたのコードを読んで、どこのコンバージョンを行っているのかが分かりにくいです。また、 'math.h'をインクルードし、' M_PI'定数を使うことを検討してください。あるいは、 'double'ではなく' float'を使いたい場合は独自のものを定義してください。 –

+0

ジムのコメントを参照してください。そして、確実に 'M_PI'か同等のものを使用してください。 (実際にはPiは3.141592よりも3.141592に近いです。例えば、記号定数を使用してください)また、fmod(x、M_PI)は-M_PIと+ M_PIの間の結果を保証しますので、チェックする必要はありません。 – Nemo

+0

はい、 'M_PI'を使うか、独自の定数やマクロを定義してください。それで、浮動小数点型のリテラルから 'f'を後に出さないことは間違いないでしょう。あなたは 'angle + =(2.0f * 3.141592);'行でそれを行いました。 –

答えて

1

これは間違って見えます。

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

スワップsin()cos()。 `LocalToWorld`と` WorldToLocal`、座標を取り、両空間の間でそれらを変換します:

float vecX = cos(realStartAngle); 
float vecY = sin(realStartAngle); 
関連する問題