111. ~A ⇥ ( ~B ⇥ ~C)
= ( ~A · ~C) ~B ( ~A · ~B) ~C
~r ⇥ (~! ⇥ ~r)
= (~r · ~r)~! (~r · ~!)~r
= |~r|2
~! (rx!x + ry!y + rz!z)~r
= |~r|2
~! (rx!x + ry!y + rz!z)
0
@
rx
ry
rz
1
A
= |~r|2
~!
0
@
r2
x!x + rxry!y + rzrx!z
rxry!x + r2
y!y + ryrz!z
rzrx!x + ryrz!y + r2
z!z
1
A
= (r2
x + r2
y + r2
z)~!
0
@
r2
x rxry rzrx
rxry r2
y ryrz
rzrx rxry r2
z
1
A
0
@
!x
!y
!z
1
A
=
0
@
r2
y + r2
z rxry rzrx
rxry r2
x + r2
z ryrz
rzrx ryrz r2
x + r2
y
1
A ~!
参考
密度と
物体形状で を
積分したものが
慣性テンソル
I
112. 0
@
r2
y + r2
z rxry rzrx
rxry r2
x + r2
z ryrz
rzrx ryrz r2
x + r2
y
1
A
x
y
z
a
b
c
m
abc
Z c
2
c
2
Z b
2
b
2
Z a
2
a
2
(y2
+ z2
)dxdydz
=
m
12
(b2
+ c2
)
I =
0
@
m
12 (b2
+ c2
) 0 0
0 m
12 (c2
+ a2
) 0
0 0 m
12 (a2
+ b2
)
1
A
例:直方体の慣性テンソル
9要素すべてを計算
121. public class SimpleRotator : MonoBehaviour {
void Update() {
if (Input.GetMouseButton(0)) {
var rb = GetComponent<Rigidbody>();
var omega = new Vector3(0f, 1f, 0f);
var R = transform.rotation;
var RI = Quaternion.Inverse(transform.rotation);
var Id = rb.inertiaTensor;
var Ir = rb.inertiaTensorRotation;
var IrI = Quaternion.Inverse(Ir);
var torque = R * Ir * Vector3.Scale(Id, IrI * RI * omega);
rb.AddTorque(torque, ForceMode.Impulse);
}
}
}
鉛直の角速度をもたらすトルクを得るサンプル
(現在の姿勢も考慮したもの)