3Dグラフィックスのプラットフォームを使ってプログラムを書く時に、まず最初に確認するのがコレ
vanilla-gl.jsにまとめてしまった
getUniformLocationするのが面倒なので関数にしておく
setUniformでZの値を変えて確認してみるとよい。Z=0ならば常に出力される。
アフィン変換で並行移動は以下のような式になる
[ 1, 0, 0, 0.5, ..., -0.5, 0, 0, 1 ]という配列を与えて、右(正方向)に動けば0.5が、左(Xの負方向)に動けば-0.5が効いている
gl.vertexAtrrib...で与えた値になり、そのデフォルトはZ=0・W=1
gl.uniformMatrix...なので、setMatrix関数を作っておく
つまり、GLの行列は
に対して、\(a_{14}\)が-0.5の位置ということだから、
[
a11, a21, a31, a41,
a12, a22, a32, a42,
a13, a23, a33, a43,
a14, a24, a34, a44
]
と並んでいることになる。
uniformMatrix4fvに転置するための引数があるが「falseにしとけ」とMDNに書いてある
uMat*aPosをaPos*uMatと書き換えても、数学的に普通に行列の計算が行われる
この場合、行ベクトルの形で
という計算が行われていることになるが、その場合も行列の格納方法は変わらないため、\(t_x\)は配列の4番目の要素になる。
window.devicePixelRatioで補正する
window.devicePixelRatioをかけたものをキャンバスのwidthとheightに設定すればよいが、このときにキャンバスのCSSサイズが設定されていないとCSSサイズの方も変わってしまう。CSSサイズを明示的に指定しておく(上の例)か、キャンバスのCSSサイズ(つまりcanvas.widthではなく、canvas.style.width)もJS側から明示的に設定する(MDNの「キャンバスの最適化」のページに例が載っている)。
viewport関数でビューポートを設定し直す。
resizeイベントをひっかけて、ウィンドウサイズが変わっても荒くなったり、はみ出したりしないようにした例
02 Jul 2024: 初稿
Copyright (C) 2024 akamoz.jp