Amazon Sumerian Tutorial 36:Three Ways to Click an Entity

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

今回は、Amazon Sumerian の公式チュートリアルの

Three Ways to Click an Entity を進めていきたいと思います。

ここでは、Amazon Sumerian の 3種類の Clicking について学んでいきます。

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

1. シーンの作成

① ダッシュボードから Default Lighting を選択。

① ダッシュボードから Default Lighting を選択。

② シーン名を「Clicking」にし、シーン作成。

③ Create Entity から Box を追加。

③ Create Entity から Box を追加。

※ シーン名も Entity も自由に設定して構いません。

これでシーンの準備は完了です。

2. 3種類のクリックオプションについて

ここからは、3種類のクリックオプションをそれぞれ説明していきます。

Hardware Picking

これは、マウスやVRコントローラーでシングルクリックがされるのを待機する際に最適です。

Hardware Picking を実装するのに最も簡単な方法は、State Machine で Pick アクションを追加することです。

それでは、実際に設定していきましょう。

それでは、実際に設定していきましょう。

① 先程追加した Entity を選択し、State Machine コンポーネントを追加。

② + をクリック。③ State 1 に Pick アクションを追加。

② + をクリック。

③ State 1 に Pick アクションを追加。

④ 新しく State を追加し、その State に Fire FX アクションを追加。

④ 新しく State を追加し、その State に Fire FX アクションを追加。

追加できたら以下のように表示されます。

⑤ State 同士を以下のように繋げる。

⑤ State 同士を以下のように繋げる。

⑥ シーンを実行。

⑥ シーンを実行。

マウスでクリックすると、Box から炎が上がりました。

Bounding Box Raycasting

これは、Hardware Picking よりもパフォーマンスが必要な場合に適しています。

しかし、このオプションは Hardware Picking ほど正確ではないようです。

ここでは、Script でクリックされたか判断するようにしていきます。

① Box に Script コンポーネントを追加し、Custom Script を新規追加。

② 以下のプログラムに置き換える。

1var setup = function(args, ctx) {2    ctx.ray = new sumerian.Ray();34    ctx.onClick = function(evt){5        var dpr = ctx.world.sumerianRunner.renderer.devicePixelRatio;6        var x = evt.clientX * dpr;7        var y = evt.clientY * dpr;8        var activeCamera = ctx.activeCameraEntity.cameraComponent.camera;9        activeCamera.getPickRay(x, y, ctx.viewportWidth, ctx.viewportHeight, ctx.ray);10        var isHit = ctx.entity.meshRendererComponent.worldBound.intersectsRay(ctx.ray);11        if(isHit){12            sumerian.SystemBus.emit(args.channel);13        }14    };1516    ctx.domElement.addEventListener('click', ctx.onClick);17};1819var cleanup = function(args, ctx) {20    ctx.domElement.removeEventListener('click', ctx.onClick);21};2223var parameters = [{24    key: 'channel',25    type: 'string',26    'default': 'pick'27}];

③ Channel に pick を設定。

これで、State Machine や Script から Pick イベントを検出できるようになりました。

Collider Raycasting

より精度の高いピッキングが必要な場合は、このオプションを使用する必要があります。

衝突判定があった場合にイベントを発生させたいときなどに使用できます。

① Box に Collider コンポーネントを追加。

② 以下のプログラムに置き換える。
1var setup = function(args, ctx) {2    ctx.ray = new sumerian.Ray();3    ctx.physicsSystem = ctx.world.getSystem('PhysicsSystem');4    ctx.result = new sumerian.RaycastResult();56    ctx.onClick = function(evt){7        var dpr = ctx.world.sumerianRunner.renderer.devicePixelRatio;8        var x = evt.clientX * dpr;9        var y = evt.clientY * dpr;10        var activeCamera = ctx.activeCameraEntity.cameraComponent.camera;1112        activeCamera.getPickRay(x, y, ctx.viewportWidth, ctx.viewportHeight, ctx.ray);1314        ctx.physicsSystem.raycastClosest(ctx.ray.origin, ctx.ray.direction, args.maxDistance, {}, ctx.result);15        if(ctx.result.entity === ctx.entity){16            sumerian.SystemBus.emit(args.channel);17        }18        ctx.result.reset();19    };2021    ctx.domElement.addEventListener('click', ctx.onClick);22};2324var cleanup = function(args, ctx) {25    ctx.domElement.removeEventListener('click', ctx.onClick);26};2728var parameters = [{29    key: 'channel',30    type: 'string',31    'default': 'pick'32},{33    key: 'maxDistance',34    type: 'float',35    'default': 10000,36    min: 037}];

これで Collider Raycasting が使えるようになります。

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

お疲れ様でした。

この記事を書いた人

aws-recipe-user