2012年9月26日水曜日

CCDIK見直し:改

球体で関節だけ更新してたので、ボーンないとわかりづらいなということで
ちょっとCheetah3Dで球体と立方体でボーンっぽいの作って入れ替えました。
ローカル座標の位置成分を回転させていたのを、ローカル座標の回転成分を回転させるようにもしてみました。
CCDIK_BONE

拘束位置とルートの距離がボーンの最大距離を超えると荒ぶる様子。
荒ぶっていたCCDIKを直しました。
transform.localRotation *= Quaternion.AngleAxis(miki, love);
としていたのですが
transform.rotation = Quaternion.AngleAxis(miki, love) * transform.rotation;
のようですね。
ローカルの回転だけ直せばいいよなーとか、クォータニオンの順番意識してなかったので
荒ぶってしまっていました。

コードはこのぐらい

Transform[] childlen = skeletonList.transform.GetComponentsInChildren<Transform>();
for(int i = 0 ; i < numIteratrions ; i++){
  for(int j = childlen.Length - 1 ; j >= 0 ; j--){
    Transform child = childlen[j];
    Vector3 effectorDir = Vector3.zero;
    Vector3 targetDir = Vector3.zero;
    effectorDir = ( effector.transform.position - child.position).normalized;
    targetDir = (target.transform.position - child.position).normalized;
    float dot = Vector3.Dot (effectorDir, targetDir);
    if(dot < 1.0f - 1.0e-6f){
      float rotAngle = Mathf.Acos(dot);
      Vector3 rotAxis = Vector3.Cross(effectorDir, targetDir).normalized;
      if(child.tag == "Bone"){
        child.rotation = (Quaternion.AngleAxis(rotAngle, rotAxis)) * child.rotation;
      }
    }
  }
}

0 件のコメント:

コメントを投稿

このガジェットでエラーが発生しました