ついにOpenXRを使ってVR空間上に1つのポリゴンを表示することに成功した!
本当にただの三角形でしかないのだが、リアルタイムにHMDで視点の位置がフィードバックされるだけでかなりの存在感が感じられる。すごい。てけとーに座標を打ったら死ぬほどでかい三角形になった。
HMD越しに見ないとまあ当然わからないのだが、「すぐそこにある」「バカでかい物体」といった印象をちゃんと感じるのがすごい。普通は画面の中の世界の物体に対して比較対象もないのに「でけー」とはならんと思うのだが、HMD越しだからこそ「視点を動かす自分自身の大きさ」「立体視によるサイズ感」といった要素がしっかり認知に入ってくる。それゆえに視覚的には比較対象などどこにもないのに「でけー」となる。とても面白い。
次はblenderでなんかちゃんとしたポリゴンデータを用意してそれを表示させてみる所存。その前にテクスチャ表示のテストもしないとな。
線形代数周りの実装はhello_xrの実装をほとんどそのままパクってしまった。この辺はなんかglmとかで置換したい。
今回の実装はVulkanを用いた開発の良い練習にもなった。「やっていくVulkan入門」では設計部分に重きを置かないため、全面的にmain関数にベタ書きしてしまっているが、今回はちゃんとした設計としていろいろクラスに分けた。Vulkanはかなり色々なオブジェクトが相互に絡まりあうので、どこを切ってどこを繋げて一つのクラスとして切り出すかみたいな部分を考えるのがだいぶ難しい。
まず「描画対象」的なものとして、
- image
- imageView
- swapchain
- frameBuffer
などがある。
また「描画プロセス」的なものとして、
- pipeline
- pipelineLayout
- renderpass
などがある。これに加えて「描画処理の実行装置」的なものとしてコマンドバッファやキューなどもある。
「実行装置」的なものに「描画プロセス」的なものと「描画対象」的なものを指定して実行するといい感じになる、といった感じで行けるとうれしいし実際大枠としてはそんな感じなのだが、実際のところrenderpassはswapchainから得られる情報に依存しているしframeBufferはrenderpassに依存している。「描画対象」的なものと「描画プロセス」的なものを分けるのが難しいので今のところ分けることが出来ていないし、分けるのが最善なのかも微妙に怪しい。この辺はさらなる試行錯誤と知見の蓄積が待たれるところ。
今日解いた競プロの問題。
ARC143-A: まず直感的にすぐわかることとして、「全部同じ」または「大きい数値2つが同じ」場合は自明にいけることが分かる。なので問題なのは「上位2つが異なる数値」の場合。
1番大きい数値を2番目に大きい数値と同じ値まで下げられたら勝ちなので、1番大きい数値と1番小さい数値に対して1を引く操作をやっていく。その途中で1番小さい数値から引けなくなったらアウト。
線形代数的にも考えられる。
$\begin{pmatrix} 1 & 1 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 0 & 1 & 1 & 1 \end{pmatrix}\begin{pmatrix} x_{12} \\ x_{13} \\ x_{23} \\ x_{123} \end{pmatrix} = \begin{pmatrix} A \\ B \\ C \end{pmatrix}$
これを変形していくとこうなる。
$\begin{pmatrix} 1 & 0 & -1 & 0 \\ 0 & 1 & -1 & 0 \\ 0 & 0 & 2 & 1 \end{pmatrix}\begin{pmatrix} x_{12} \\ x_{13} \\ x_{23} \\ x_{123} \end{pmatrix} = \begin{pmatrix} A – B \\ A – C \\ C+B-A \end{pmatrix}$
A,B,Cは入れ替えて良いはずなのでAを最大の数値とする。こうすると$A-B,A-C\geq 0$になる。
$x_{12},x_{13},x_{23},x_{123}\geq 0$なので、$C+B-A\geq 0$でなければならない。またコスト的に$x_{123}$を最大化したいはずなので、$x_{23}$は0にするのが良いと考えられる。そうすると全ての未知数が確定する。最終的に「$C+B-A<0$なら不可、そうでなければ可能で最小コストは$(A-B)+(A-C)+(B+C-A)=A$」ということになる。
Categories: 未分類