Arei's blog

model-viewerの色々な座標を取得する


<model-viewer>はかんたんに使える。だからちょっと低レイヤーなことをすると面倒になる。

THREE.jsのAxesHelperを入れるとまあ、わかりやすくなる。

Sceneを取得

まずはここから。ドキュメントにも書いてある。

cosnt modelViewer = document.querySelector("model-viewer");
modelViewer[Object.getOwnPropertySymbols(mvElement).find(e => e.description === 'scene')];

VRモード

これはかんたんだ。

読み込んだモデルは、scene.target

座標は(0,0,0)に固定されて、z+を向いている

カメラはscene.camera

普通に座標を取得すればよい

なぜなら、シーンは動かないから、カメラもモデルもローカルの座標系が同じだからだ。

APIを使えばもっと楽だ

modelViewer.getCametaOrbit()getCameraTargetが使えるだろう

ARモード(webXR APIの場合)

これはやっかいだった。

第一、APIに存在しない

読み込んだモデルは同じく scene.target

こちらも座標は(0,-(モデルの高さ/2),0)、z+を向いている

##シーンが親になっている。##

カメラはscene.xrcamera

##xrcameraには親が居ない##

カメラを動かせばxrcameraが動く

モデルを動かすと##sceneが動く##

モデルを回すと##sceneが回る##

モデルの座標は動かない。

よって、モデルのワールド座標を取得するには、scene.position + target.position が必要である。

ところで、THREE.jsobject3dのメソッドgetWorldPositionとかは、うまく動かない。オーバーライドされているし、それが未定義参照でエラーになるから。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です