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