2
3

More than 3 years have passed since last update.

落下物で歯車(?)を回してみた (CANNON.js + THREE.js)

Last updated at Posted at 2021-01-03

ポエムタグは出来心です。

See the Pen freefall by using cannon.js by kob58im (@kob58im) on CodePen.

歯車(?)の形状作成部分

Quaternionを使って、角度を変えながらbodyaddShapeしていっています。


// 補足:
//  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なので物体は動かないが、跳ね飛ばす力は作用してしまうっぽい。

参考サイト

2
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3