リサむクルの䜜成方法 VR



前の蚘事では、フレヌムワヌクの基本的な抂念を実際に詊すために、A-Frameで基本的なシヌンを䜜成しようずしたした。 この蚘事では、A-Frame-リサむクルでゲヌムを䜜成した経隓を共有したいず思いたす。 VR プロゞェクトリポゞトリは、 次のリンクから入手できたす。

リサむクル


ゲヌムを䜜成するずいうアむデアは、Web VRを知っおすぐに生たれたした。 䞀般的には、どのような堎合でもWeb䞊のゲヌムは、パヌ゜ナルコンピュヌタヌやコン゜ヌルは蚀うたでもなく、モバむルデバむスにずっおも優れたプロゞェクトよりも劣るず思いたす。 しかし、私には、ゲヌムは最も難しいテストだず思われたす。 私は自分に䜕ができるかを正確に考え始めたした。 他のプロゞェクトを芋お、すぐにコントロヌラヌを䜿甚しお䜕かを撮る機䌚に感銘を受けたした。 そしお、私はかなり長い間、別々のガベヌゞコレクションに埓事しおいる組織に接続しおいたので、答えは自然に出おきたした。 リサむクル。 ゎミを取り、ゎミずしお捚おたす。 もっず簡単にできるこず。 しかし、すべおがそれほど単玔ではないこずが刀明したした。実際、これに぀いおはさらに説明したす。

フレヌムワヌクの遞択


ゲヌムの䜜業を開始した時点で、あたり重芁でないフレヌムワヌクは2぀だけでしたReact 360、A-Frame。 明らかに、A-Frameはゲヌムの䜜成に最適でした。 はい、今でもVRをサポヌトするPlayCanvasゲヌム゚ンゞンがあるこずを知っおいたすが、手遅れです。 さらに、A-Frameはゲヌムの䜜成にずっおも悪くないこずが刀明したした。

どこから始めたすか


私は、A-Frameの開発者によるゲヌムの公匏䟋を研究するこずから始めたした。 これらの利点は十分ではありたせん。 A-Blast、A-Painter、Museum、Super Craft、そしおGunters of Oasis。 提瀺されたすべおのプロゞェクトの䞭で、私は最もA-Blastが奜きでした-宇宙で最もかわいい生き物ず戊わなければならないシュヌティングゲヌム したがっお、私はこのゲヌムを私のテンプレヌトずしお䜿甚したいず考えたした。 しかし、うたくいきたせんでした。 そしお、その理由はゲヌムの構造にありたした。 圌女はあたりにも雑然ずしおいお、考え抜かれおいないように思えたした。 おそらくそれ以䞊は必芁ありたせんが、もっず䟿利で理解しやすい䜕かをしたかったのです。

構造


A-Blast構造は、1぀の゚ントリポむントのみを衚したす。index.htmlファむルには、すべおのアセット、メむンのゲヌム゚ンティティ、コントロヌル、および䞀般的なすべおの1぀のシヌンが含たれたす。



スクリヌンショットでわかるように、必芁なコンポヌネントずシステムA-FrameはEntity Component Systemパタヌンを䜿甚に加えお、匟䞞ず敵もありたす-基本的に同じシステムですが、䜕らかの理由で独自のラッパヌがありたす。 䞀般的に、このコヌドは理解しにくいず蚀いたす。 そこで、このコヌドをどのように構成できるかを考えるこずにしたした。 最初のアむデアは、シヌンを構成芁玠に分割するこずです。 ルヌタヌずテンプレヌトが圹立぀のはなぜですか。これにより、シヌンのこの郚分たたはその郚分がレンダリングされたす。 最初ず2番目5分ではなくを怜玢した埌、䜕も芋぀かりたせんでした。 私は芏則の支持者ですが、自転車を曞くこずはありたせんが、今回は決断を曞かなければなりたせんでした。 でも、2、3週間のうちのどこかで、Kevin Ngoのテンプレヌトに出䌚いたした。 しかし、手遅れでした。

ルヌタヌずパタヌン




そのため、 a-frame-router-templatesがシヌンに入りたす 。 圌は䜕ができたすか 前述のように、その䞻なタスクは、ゲヌムの必芁な郚分、たずえばタむトル画面、競技堎、ゲヌムの終了画面などをレンダリングするこずです。 どうやっおやるの 原則ずしお、必芁なものはすべおgithubのモゞュヌルのドキュメントで芋぀けるこずができたすが、芁するに、次のものがありたす。

<a-scene router> ... <!-- Routes --> <a-route id="start-screen" template="start-screen"></a-route> <a-route id="game-field" template="game-field"></a-route> <a-route id="game-over" template="game-over"></a-route> <a-route id="how-to-play" template="how-to-play"></a-route> <!-- End Routes --> ... <!-- Templates --> <a-template name="controls"></a-template> <!-- End Templates --> ... </a-scene> 

  1. ルヌタヌコンポヌネントをシヌンに远加しおいたす。
  2. アプリケヌションの各郚分シヌンのフレヌムにルヌトを远加したす。 ホヌム画面甚の1぀のルヌト、競技堎甚の別のルヌトなど。
  3. a-templatesを䜿甚しおテンプレヌトを盎接レンダリングする
  4. 必芁に応じお、ルヌトを倉曎したす

     this.el.systems.router.changeRoute('game-field'); 

    泚 この䟋ではシヌンコヌドを参照しおいるため、ルヌタヌシステムを盎接呌び出すこずができたす。
  5. 次のようなテンプレヌトを蚭定しお接続したす。

     AFRAME.registerTemplate('game-field', ` <a-sub-assets> <a-asset-item id="glass" src="/assets/models/glass_bottle.gltf"></a-asset-item> ... <audio id="fail" src="/assets/sounds/fail.wav" preload></audio> </a-sub-assets> <a-template name="button" options="text: EXIT; position: 0 1 4; rotation: 0 180 0; event: stop-game"></a-template> <a-entity id="indicator" indicator visible="false" position="0 1 -2" text="align: center; width: 4; color: #00A105; value: -1" ></a-entity> <a-entity game-field-manager></a-entity> `); 

    泚 a-sub-assetsでは、a-assetsず同様にアセットを読み蟌むこずができたすが、デフォルトでチェックがあり、アセットが既に远加されおいる堎合は、ルヌトが倉曎されおもアセットは再床远加されたせん。

    泚2通垞、テンプレヌトはES6テンプレヌト文字列でのみ䜿甚できたす。 そうしないず、クヌルではなく、「ストリング」+ var +「ストリング」に倉わる可胜性がありたす。 たずえば、Kevinはテンプレヌト゚ンゞンをサポヌトしおいたす。 しかし、なぜそれを耇雑にしたすか

したがっお、 コンポヌネント、システム、テンプレヌト、状態、ラむブラリを含む䟿利なアプリケヌション構造を䜜成できたす。 これ以䞊のものはなく、すべおが棚にありたす。

オブゞェクトを操䜜する




解決すべき最初のタスクはオブゞェクトの操䜜でした。 グラブのような機胜が必芁でした-投げたす。 最初は、そのようなコンポヌネントをれロから䜜成する方法に぀いお考え始めたした。 玔粋にフィリピンレベルでは、そのような反映は蚱容されたす。コントロヌラヌデスクトップの堎合はカヌ゜ルがあり、䜍眮がありたす。 たた、キュヌブなどの特定のオブゞェクトもあり、それらには䜍眮もありたす。 コントロヌラヌの䜍眮を倉曎するには、オブゞェクトの䜍眮を倉曎する必芁がありたす。 ただ だから、実際にはい、しかしそれは機胜したせん。 このこずを玍埗させるために、非垞に長いリストからいく぀かの点に蚀及したす。


りィルマヌフィヌ氏ず圌の友人たちがa-frame-super-handsを䜜ったこずは良いこずです。 基本的に、このラむブラリには必芁なすべおのコンポヌネントが含たれおいたす。


䞊蚘のリポゞトリで、スヌパヌハンドの蚭定ず接続に必芁なすべおを芋぀けるこずができたす。 いく぀かのニュアンスに泚目したいだけです。


物理孊を远加


フレヌムに物理を远加するこずは実際には非垞に簡単です。 これには特別なシステムがありたす。 それはシヌンず出来䞊がりに远加され、物理孊はすでにあなたのポケットの䞭にありたす。

 <a-scene physics="debug: false"> <a-box dynamic-body position="0 1 -2"></a-box> <a-box id="floor" static-body></a-box> </a-scene> 

Mark  debugtrueは、ゞオメトリにバむンドされた物理ボディを衚瀺する機胜を有効にしたす。 オブゞェクトを「アりトラむン化」する必芁がある堎合に䟿利です。

実際、これはcannon.jsのラッパヌであり、ゞオメトリず物理ボディを比范するための汚い䜜業をすべお行いたす。 繰り返したすが、このシステムの仕組みに぀いおは、リポゞトリの説明で芋぀けるこずができたす。 そしお、私は自分のゲヌムにずっお重芁な1぀の点だけに焊点を圓おたいず思いたす。

ゎミのボタンを抌すこずで、特定の力が蚭定されおいるこずを確認する必芁がありたしたボタンを抌し続けるほど力が倧きくなりたす。 刀明したように、このタスクは䞀芋思えるほど単玔ではありたせん。 さお、䜕がそんなに耇雑なのでしょうか -あなたは蚀う、私たちは適甚するImpluseず出来䞊がり 。 そうではありたせん...それは、䜓の䞭心に適甚されるベクトルに沿っおオブゞェクトの回転を蚭定したす。 この方法を䜿甚するず、ナヌルのみを゚ミュレヌトできたす。 ただし、平面に察しお正しい角床でベクトルを蚭定するず、プッシュに䌌たものが埗られる堎合がありたす。 しかし、これは私が必芁ずしたものではありたせん。

結局のずころ、このパラメヌタヌを蚭定するずきは速床が必芁でした。オブゞェクトは指定された方向に動き始めたす。 この方向はベクトルによっお指定されたす。 そしお、ここから楜しみが始たりたす。 このベクタヌを芋぀ける方法は 私は2぀のオプションを芋぀けたした

  1. コントロヌラヌたたはデスクトップ甚のカメラのクォヌタニオンを取埗したす。これは、空間での向きを衚したす。 ベクトルV1 = <1,1,1>を䜜成し、それに投げる力を掛けお、このすべおに方向を適甚したす。

     const velocityVector = new THREE.Vector3(1,1,1); velocityVector.multiplyScalar(this.force); velocityVector.applyQuaternion(controllerQuaternion); this.grabbed.body.velocity.set(velocityVector.x, velocityVector.y, velocityVector.z); 
  2. コントロヌラヌカヌ゜ルの䜍眮ずスロヌされおいるオブゞェクトの䜍眮を芋぀けたす。 2点の方向ベクトルを蚈算したす。 ベクトルを正芏化したす。 そしお、それを力で掛けたす。

     const directionX = (trashPosition.x - zeroPosition.x); const directionZ = (trashPosition.z - zeroPosition.z); const vectorsLength = Math.sqrt(Math.pow(directionX, 2) + Math.pow(directionZ, 2)); const x = (directionX / vectorsLength) * this.force; const y = this.force; const z = (directionZ / vectorsLength) * this.force; this.grabbed.body.velocity.set(x , y, z ); 

2番目のオプションを遞択したのは、xずzのみをカりントできるためです。 そしお、ナヌザヌがコントロヌラヌを持っおいるにもかかわらず、捚おられたごみがバスケットに萜ちるように匧に沿っお投げる必芁があったので、自分で蚭定しおください。

モデルに぀いおのいく぀かの蚀葉




最初から、 ロヌポリスタむルのゲヌムを䜜るこずにしたした。 今日のWebGLは比范​​的耇雑なシヌンをレンダリングできたすが、そのパフォヌマンスは䟝然ずしおDirectX、Vulkan、Mantleなどの高床なラむブラリよりも劣っおいたす。たた、ナヌザヌのデバむスのパフォヌマンスにも䟝存したす。 手頃な䟡栌のBPモバむルヘルメットOculus Go、Gear VRに焊点を圓おたいので、䜎ポリはVRアプリケヌションたたはゲヌムを䜜成する数少ない゜リュヌションの1぀だず思いたす。 もちろん、それはすべおボリュヌムに䟝存したす。

さお、䜎ポリは非垞に䜎ポリですが、それをすべお行う方法は すべおが非垞にシンプルで、優れたオヌプン゜ヌスツヌルBlenderがありたす。 私を信じお、圌は倚くの胜力がありたすが、単玔なタスクにはあたり適しおいたせん。 Blenderのモデリングに関連するトレヌニング資料はたくさんあり、それらを芋぀けるこずは難しくありたせん。 Web開発に関連するいく぀かのポむントに泚意を集䞭させたかっただけです。

  1. Three-js゚クスポヌタヌは叀くなっおいたす。 GLTF゚クスポヌタヌを芋぀けお提䟛する必芁がありたす。 GLTFは、Web甚に蚭蚈された特別な圢匏です。 はい、これはJSONです。
  2. GLTFはCycles Rendererをサポヌトしおいないため、Blender Rendererを䜿甚する必芁がありたす。 そしおこれは、クヌルな結び目、色の倉換、メタリックのハむラむトがないこずを意味したす異なる方法で行うこずができたす。
  3. 遞択したアむテムのみを゚クスポヌトする必芁がありたす。 远加のカメラずラむトは必芁ありたせんか ファむル>゚クスポヌト> gltf 2.0。 巊偎のメニュヌで、[GLTF 2.0の゚クスポヌト]> [遞択のみ゚クスポヌト]をクリックしたす。
  4. Blenderの䜍眮<0、0、0>から゚クスポヌトを開始したす。 同じ堎所でスケヌリングするこずをお勧めしたす。これにより、埌でフレヌム内でスケヌリングコンポヌネントを䜿甚しなくなりたす。
  5. リサむクルのようにオヌプンスペヌスを描画する堎合 VRでは、プレむダヌが理論的に芋るこずができる堎所にのみオブゞェクトを远加する必芁がありたす。 家の埌ろ、リサむクルの䞭で いく぀かのツリヌがあり、ナヌザヌがそれらを芋るこずができる堎所にのみありたす。 シヌンをオヌバヌロヌドする必芁はありたせん。
  6. モデルのマテリアルを倉曎する必芁がある堎合は、ロヌドするたで埅機し、モデル自䜓を取埗し、そこからすべおのノヌドを匕き出す必芁がありたすGLTFにはメッシュだけでなく情報も含たれおいたす

     e.detail.model.traverse((node) => { if (node.isMesh) { node.material.color = new THREE.Color(someColor); } }); 

結論ずしお


ご枅聎ありがずうございたした プロゞェクトリポゞトリは次のリンクから入手できたす。 このゲヌムに䜕か新しいものを持ち蟌みたいすべおの人に、私たちは倧歓迎です。

Source: https://habr.com/ru/post/J443062/


All Articles