前提・実現したいこと
A-Frameを使用して、VRゲームを作っています。
画面上で、PCならマウスクリック、タッチデバイスならタッチした時、
そのスクリーン座標と対応するAR空間内の座標にオブジェクトを配置する機能を実装したいのですが、
思うように動作しません。
3Dレンダリング等の知識に乏しく、
解決策が分かりません。
よろしくお願いいたします。
発生している問題
実際にクリックした位置とはズレた場所にオブジェクトが配置されてしまいます。
該当のソースコード
html
1<!DOCTYPE html> 2<html> 3 4<head> 5 <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script> 6</head> 7 8<body> 9 10 <script> 11 // {底辺の長さ(a)}=2×{二等辺三角形の高さ(h)}/tan{底辺の角度(α)} 12 // 2等辺三角形の高さ(z座標) 13 const z = 10; 14 // 底辺の角度 15 const t = (180 - 80) / 2 * Math.PI / 180; 16 // カメラに写る範囲の横幅 17 const a = 2 * z / Math.tan(t); 18 19 /* オブジェクトを移動する */ 20 AFRAME.registerComponent('move-object', { 21 init: function () { 22 document.addEventListener('click', (e) => { 23 let rect = document.querySelector('body').getBoundingClientRect(); 24 25 // カメラに写る幅とスクリーン幅の比 26 const d = a / rect.width; 27 const x = (e.clientX - rect.width / 2) * d; 28 const y = -(e.clientY - rect.height / 2) * d; 29 30 // オブジェクトを配置 31 const obj = document.querySelector("a-sphere"); 32 obj.object3D.position.set(x, y, -z); 33 }) 34 } 35 }); 36 </script> 37 38 <a-scene vr-mode-ui="enabled: false;" move-object> 39 <a-sphere radius="0.5" id="obj" color="red" position="0 0 -10"></a-sphere> 40 <a-camera position="0 0 0"></a-camera> 41 </a-scene> 42</body> 43 44</html> 45
試したこと
上記コードのスクリプトの内容です。
A-Frameのカメラコンポートは、画角がデフォルトで80度なので、
カメラとz=-10の位置でのスクリーン面を横から見て二等辺三角形として、
スクリーンの幅を求めて、実際のスクリーン幅との比を求めています。
この比をクリックされた座標に適用してオブジェクトの移動先を求めようとしたのですが、
クリック位置とオブジェクトの位置に差があります。
補足情報(FW/ツールのバージョンなど)
A-Frame ver.0.9.2
最新版です。
あなたの回答
tips
プレビュー