Amazon Sumerian Tutorial 21:Physics Part 2

こんにちは、ナレコム前川です。

今回は、Amazon Sumerian の公式チュートリアルのPhysics Part 2を進めていきたいと思います。

ここで学ぶのは、

・Rigid Body component

・Collider component

・State Machine

・Scripting

の4つです。

それでは、進めていきましょう。

1. 2つの Bumper を追加

まずはじめに、Table の傾きを 0 に変更してください。

まずはじめに、Table の傾きを 0 に変更してください。

① Bumper1 を選択し、複製。 Bumper4, Bumper5 を追加。

② 以下のように Bumper を配置。

※ここは好きなように配置して良いです。

2. Slant の追加

① Create Entity から Box を 2つ 追加。

① Create Entity から Box を 2つ 追加。

② 名前を 「LeftSlant」と「RightSlant」に変更。

① Create Entity から Box を 2つ 追加。

② 名前を 「LeftSlant」と「RightSlant」に変更。

③ Transform を以下のように設定。

④ それぞれ Collider コンポーネントを追加し、以下のように設定。– Friction : 0– Restitution : 0.5

④ それぞれ Collider コンポーネントを追加し、以下のように設定。

– Friction : 0

– Restitution : 0.5

設定が完了したら、キャンバス内では以下のように配置されていると思います。

3. Flipper の追加

Flipper Pivot

① Create Entity から Empty Entity を 2つ 追加。

② 名前を「LeftFlipperPivot」と「RightFlipperPivot」に変更。③ Transform をそれぞれ以下のように設定。

② 名前を「LeftFlipperPivot」と「RightFlipperPivot」に変更。

③ Transform をそれぞれ以下のように設定。

④ それぞれ Rigit Body コンポーネントを追加して、Kinematic にチェックを入れる。

④ それぞれ Rigit Body コンポーネントを追加して、Kinematic にチェックを入れる。

Flipper

① Create Entity から Box を 2 つ追加。

② 名前を「LeftFlipper」と「RightFlipper」に変更。

① Create Entity から Box を 2 つ追加。

② 名前を「LeftFlipper」と「RightFlipper」に変更。

③ それぞれの Flipper を FlipperPivot の子要素にする。

④ それぞれの Flipper の Transform を以下のようにする

④ それぞれの Flipper の Transform を以下のようにする

⑤ 両方に Collider コンポーネントを追加し、以下のように設定。

⑤ 両方に Collider コンポーネントを追加し、以下のように設定。

実行して、衝突判定がきちんと行われているか確認しましょう。私の場合は、前回のバグが改善されていないので、すり抜けて行ってしまいました。はじめからシーンを作り直した際には、うまくいきました。

4. Script の追加

① Table を選択して、Script コンポーネントを追加。

① Table を選択して、Script コンポーネントを追加。

② + ボタンをクリックし、Customを選択。

③ 編集ボタンをクリックして、エディタを開く。

③ 編集ボタンをクリックして、エディタを開く。

④ 以下のコードをコピーしてエディタ内のコードと置き換える。
1var setup = function(args, ctx, sumerian) {2    ctx.speed = 8;34    ctx.cw = new sumerian.Vector3(0, ctx.speed, 0);  // clockwise rotation5    ctx.ccw = new sumerian.Vector3(0, -ctx.speed, 0); // counterclockwise rotation6    ctx.tempVec = new sumerian.Vector3(0,0,0);7    ctx.tempQuat = new sumerian.Quaternion();89    ctx.roundit = function(v) { return Math.round(v * 100) / 100; };1011    function initFlipper(name, dir, vec) {12        var f = ctx.world.by.name(name).first();13        f.on = false;14        f.lr = f.transformComponent.transform.rotation; // local rotation shortcut15        f.wr = f.transformComponent.worldTransform.rotation; // world rotation shortcut16        f.lr.toAngles(ctx.tempVec);17        f.start = ctx.roundit(ctx.tempVec.y);  // flipper start rotation18        f.goal = ctx.roundit(ctx.tempVec.y + dir);  // flipper end rotation19        f.wr.applyPost(vec); // tilt the cw or ccw rotation vector along the table slope20        return f;21    }2223    ctx.LeftFlipper = initFlipper('LeftFlipperPivot', Math.PI * 0.25, ctx.cw);24    ctx.RightFlipper = initFlipper('RightFlipperPivot', -Math.PI * 0.25, ctx.ccw);2526    ctx.ball = ctx.world.by.name('Ball').first();2728    function react(e, flag, dirLeft, dirRight) {29        switch(e.keyCode){30            case sumerian.ScriptUtils._keys.Leftarrow:31            case sumerian.ScriptUtils._keys.A:32                if(flag === ctx.LeftFlipper.on){33                    ctx.LeftFlipper.on = !flag;34                    ctx.LeftFlipper.rigidBodyComponent.setAngularVelocity(dirLeft);35                }36                break;37            case sumerian.ScriptUtils._keys.Rightarrow:38            case sumerian.ScriptUtils._keys.D:39                if(flag === ctx.RightFlipper.on){40                    ctx.RightFlipper.on = !flag;41                    ctx.RightFlipper.rigidBodyComponent.setAngularVelocity(dirRight);42                }43                break;44        }45    }4647    ctx.keydown = function(e) {48        react( e,false,ctx.cw,ctx.ccw);49    };50    ctx.keyup = function(e) {51        react( e,true,ctx.ccw,ctx.cw);52    };53    document.body.addEventListener('keydown', ctx.keydown, false);54    document.body.addEventListener('keyup', ctx.keyup, false);55    document.body.addEventListener('touchstart', ctx.keydown, false);56    document.body.addEventListener('touchend', ctx.keyup, false);5758    ctx.checkTarget = function(flipper, target, speed, comparator) {59        var tc = flipper.transformComponent;60        flipper.lr.toAngles(ctx.tempVec);61        var rot = ctx.roundit(ctx.tempVec.y);62        if(rot !== flipper.goal){63            var angle = ctx.tempVec.y + speed * ctx.world.tpf;64            if( (comparator === '>=' && angle >= target) || (comparator === '=');65    } else {66        ctx.checkTarget( ctx.LeftFlipper, ctx.LeftFlipper.start, -ctx.speed, '=');67    }68};

保存して、エディタを閉じたら実行してみてください。

実行の様子は以下からご覧ください。

キーボードの ← → ボタンをクリックすると、追加したFlipperを動かすことができます。

これで、落ちてきたボールを跳ね返して遊ぶことができるようになっています。

今回のチュートリアルは以上です。

お疲れ様でした。

この記事を書いた人

aws-recipe-user