IKまで完了
IKのひざの特別処理で回転をオイラー角に分解してから、角度に制限を加えた後でオイラー角を回転に戻す処理があるのだがそこで使った
core::matrix4::setRotationRadians
か
core::quaternion::quaternion(const core::matrix4 &rotation)
の動きが怪しかった。Irrlichtの数学ライブラリに疑心暗鬼になりつつw
代替コード。
static core::quaternion constraint(const core::quaternion q) { core::vector3df euler; q.toEuler(euler); // Xの回転角度の制限 euler.X=clamp(euler.X, static_cast<f32>(-M_PI), -0.002f); // Xの回転のみのクォータニオンを作る float radianX=euler.X * 0.5f; float sinX = sinf(radianX); float cosX = cosf(radianX); return core::quaternion(sinX, 0, 0, cosX); }
x軸1軸の回転だとわかっているのでこんな感じに。
次は、Bullet組み込み。