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