ポエムタグは出来心です。
See the Pen freefall by using cannon.js by kob58im (@kob58im) on CodePen.
歯車(?)の形状作成部分
Quaternion
を使って、角度を変えながらbody
にaddShape
していっています。
// 補足:
// Wings = 5;
// body = new CANNON.Body({mass: 2, material:matWing});
function makeWing(body) {
for(let i=0;i<Wings;i++){
let quo = new CANNON.Quaternion();
let rad = 2*Math.PI*i/Wings;
quo.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), rad);
body.addShape(
new CANNON.Box(new CANNON.Vec3(WidthOfWing, 0.2, Radius-0.3)),
new CANNON.Vec3(0, Radius*(1-Math.sin(rad)), Radius*Math.cos(rad)),
quo
);
}
}
回転軸との接触
ContactMaterial
で摩擦と反発係数を0
にしておくのがポイント。
mass: 0
にするのが必須かはわからないが、0
以外にすると重力の作用を受けるので、空中には浮かせられない。
phyBasement = new CANNON.Body({mass: 0, material:matBasement});
(・・・中略・・・)
let matBW = new CANNON.ContactMaterial(matBasement, matWing, { friction: 0.5, restitution: 0.0});
world.addContactMaterial(matBW);
以下は余談
途中までphyBasement.angularVelocity.set(0, 0, 4);
とかにしてたせいで、しょっぱなから歯車が吹っ飛ぶありさまで、暫く原因不明でハマってました。
mass: 0
なので物体は動かないが、跳ね飛ばす力は作用してしまうっぽい。