DeviceOrientationEvent.requestPermissionはiOS系だけ必要で、ユーザーアクションによって発火したイベントの中でしか呼び出せない。
DeviceOrientationEventで返ってくる情報は、分かりやすい図入りの仕様書がW3Cにある。
alphaだけ左に回し、X軸周りにbetaだけ起こし、Y軸周りにgammaだけ右へ傾ける
alphaだけ回転すると、デバイスの座標系がそれだけ回転するので、デバイスのX軸はワールド座標系と一致しなくなる→そのままrotXすることができない
alphaだけ回しました
alphaだけ回転したように見えるでしょう
betaだけ端末を起こせば、あなたからは外の世界にあるモノすべてが下へbetaだけ回転したように見えます
gammaだけ端末を右へ傾ければあなたからは外の世界にあるモノすべてが左へgammaだけ傾いたように見えます
rotZ・rotX・rotYの順に回転させれば、デバイス座標系に変換できる
evdoにとっておく
draw関数を呼べば、evdoから端末の姿勢を得て、座標変換行列を計算して、描画してくれる
Mat4.prodに渡す順序は逆になることに注意
requestAnimationFrameで描画する処理が入っている
requestAnimationFrameを使っているのは、フレームよりも速い速度でデバイスオリエンテーションイベントが発生する環境があるため
requestDrawingが呼び出された時にdrawingがfalseならば、requestAnimationFrameを呼び出してdrawingをtrueにする
drawingが既にtrueだった場合は何もしない
drawingをfalseに戻す
drawを呼び出した時点で最新のevdoが使われることになる
betaにnullが設定されることがある
slの下に追い出したので、URLを見るとgl/slというディレクトリになっている
fetchShaderにURLを指定すると、fetchしてコンパイルまでしてくれる
fetchなので戻り値はプロミスで、解決するとVanillaGLProgramになる
fetchしてPromise.allで読み込み終了待ち
Promise.allの解決値をvとすると、v[0]がVSの、v[1]がFSのVanillaGLProgramになっている
(x??{}).y=z
e?.innerText = sでeが未定義の場合、e?.innerTextも未定義となる(この時点ではエラーにならない)
.はタダの演算子に過ぎない(プロパティアクセサー)ので、左項にカッコが付いていても使える
eの値がundefinedならe = {}; e.innerText = s; e = undefined;のような振る舞いになる
eが定義されていてinnerTextがないのならeにinnerTextプロパティができる
eそのものが定義されていない場合はエラーになるので注意
setupDeviceOrientationEventにまとめた
checkedとかdisabledとか)時には第2引数を使う
requestAnimationFrameの呼び出しはクラスにまとめる
v=>f(...v)
Promise.allの解決値は配列だが、色々な種類の解決値が混ざってくるとコードが見づらくなる
const vs = v[0]; const fx = v[1];と代入していってもいいが、面倒
const v = { vs: v[0], ... }のようにしてもよいが、アクセスの時に必ずv.が必要
Promise.all().then(v => ((vs, fs, --snip--){ })(...v))とも書けるが、関数本体が大きくなるとスプレッド構文がすごく後ろに離れた位置になってしまい、パッと見で何をしているか分かりづらい
$X = (v, f) => f(...v);として、Promise.all().then($v => $X($v, (vs, fs, --snip--) => { })とする方法もある
promise_allがPromise.all専用なのに対し、$Xは使いまわせる
| 19 Jul 2024 | 初稿 |
Copyright (C) 2024 akamoz.jp