//姿勢情報とそれに応じた描画内容の更新を行います。 void Update() { if (_model.AttachedQumarion == null) { return; } UpdateAccelerometerSetting(); //主要な処理部分: 本体情報を更新し、結果のうちWorld位置情報を特に用いて各ボーンの位置を指定 _model.Update(); foreach (var kvp in _spheres) { var boneType = kvp.Key; var sphere = kvp.Value; var t = _model.Bones[boneType].WorldMatrix.Translate; sphere.transform.localPosition = 0.01f * new Vector3(-t.X, t.Y, t.Z); var r = MatrixToQuaternion.CreateFrom(_model.Bones[boneType].WorldMatrix); sphere.transform.localRotation = r; } foreach (var bone in _drawableBones) { bone.Update(); } }
/// <summary>ボーンの姿勢を更新します。</summary> public void Update() { //子要素の更新 foreach (var child in _childs) { child.Update(); } //姿勢の更新 var lmat = _bone.LocalMatrix; //lmatは[左-上-前」という右手系座標で定義されてんので「右-上-前」系に修正してから用いる //1. 成分表記が逆なので反転。 lmat[0, 0] *= -1f; lmat[1, 0] *= -1f; lmat[2, 0] *= -1f; //2.x軸の向きそのものが逆なので反転。結果としてlmat[0, 0]は数値的には元の値といっしょ。 lmat[0, 0] *= -1f; lmat[0, 1] *= -1f; lmat[0, 2] *= -1f; var q = MatrixToQuaternion.CreateFrom(lmat); Vector3 axis; float angle; q.ToAngleAxis(out angle, out axis); //NOTE: ここ、あまり理解してないのだけど // 右手系と左手系ではデフォルト回転正向きが逆なので補正が要るらしい? BoneObject.transform.localRotation = Quaternion.AngleAxis(-angle, axis); var translate = _bone.InitialLocalMatrix.Translate; //NOTE: Qumarionでは長さがcm単位らしいのでm単位に修正 BoneObject.transform.localPosition = new Vector3(-translate.X * 0.01f, translate.Y * 0.01f, translate.Z * 0.01f); //線の描画内容を更新 if (_lineRenderer != null && _parent != null) { _lineRenderer.SetPosition(0, _parent.BoneObject.transform.position); _lineRenderer.SetPosition(1, BoneObject.transform.position); } }
//Qumarionから得た姿勢行列(左-上-前の右手系)をUnityで利用可能な左手系回転表現に直す private Quaternion MatrixToQuaternionWithCoordinateModify(Matrix4f lmat) { //lmatは[左-上-前」という右手系座標で定義されてんので「右-上-前」系に修正してから用いる //1. 成分表記が逆なので反転。 //lmat[0, 0] *= -1f; lmat[1, 0] *= -1f; lmat[2, 0] *= -1f; //2.x軸の向きそのものが逆なので反転。結果としてlmat[0, 0]は数値的には元の値といっしょ。 //lmat[0, 0] *= -1f; lmat[0, 1] *= -1f; lmat[0, 2] *= -1f; var q = MatrixToQuaternion.CreateFrom(lmat); Vector3 axis; float angle; q.ToAngleAxis(out angle, out axis); //NOTE: ここ、あまり理解してないのだけど // 右手系と左手系ではデフォルト回転正向きが逆なので補正が要るということ? return(Quaternion.AngleAxis(-angle, axis)); }