[Lv3] cub3d

【cub3Dってどう実装するの?実装例】
フルスクラッチでなく、ちょっと便利なライブラリが提供されます。:blue_book:

0.【Windowsの人】
ですが、そのライブラリは、MAC(課題添付)かLinux(下記)しかありません。Linuxで動くように環境を整えます。その方法は2つ。
https://github.com/ilkou/minilibx
https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html
1) WSL(Windows for Linux)を入れるとコンパイルできます。

2) もしくはVM環境立てると、もともとLinuxが入っていてコンパイルできます。
ちなみにVM環境は、課題を進める上では必要ないです。レビューをこの環境でやる、というだけ。
https://discordapp.com/channels/691903146909237289/696582568270757929/736982829749239879
先人の知恵、次の2点まで整えてようやくストレスなく使えるかも。
1) ローカルとの共有フォルダを作る
2) 右クリックでコピペできるようにする
https://qiita.com/LemonLeaf/items/ac12404e277ff9bb3a65
この手順をもろもろし、VM再起動。
ショートカットにCDアイコンがあるのでOpen。
ファイル内でターミナルを開いて、

bash autorun.sh

で実行後、再起動でコピペ可能。

3) valgrindいれる。
入れた後は、下記で実行可能。

./a.exe なんちゃら valgrind --leak-check=full --show-leak-kinds=all

0.【MACの人】
レビューはVM環境=Linuxでの実施なので、課題提出時にLinuxのライブラリで動かすことを頭の片隅に。

1.ライブラリ機能でWindowにお絵描き。まず写経します。
https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html
mlx_init:全てをつかさどるポインタがとれる。
mlx_window:描画するwindowのポインタがとれる。
pixel_put:windowにpixel単位で描画できる。
だけど、windowに直接pixel_putするのは処理重なので、imageにpixel_putして、出来上がった一枚絵をwindowに渡す実装にする。

mlx_loop:ゲームのloop処理が始まる。
loopは事前に_hookした処理を繰り返す。
ということで、hookを作るのがメインタスクだと悟る。

(2021/02/15)mlxの終了ステータスが更新されたようです。17でなく33かも。
旧 : mlx_hook(img.win, 17, 1L<<17, [exitするfunction], &img);
新 : mlx_hook(img.win, 33, 1L<<17, [exitするfunction], &img);


Q.いざmain書いて動かしてみるとSegmentation fault なんですが?
まず
minilibx_linux/test/mlx-test
このテストファイルが動くか。
うまくいくとグラフィックが表示される。

KOだったので、
https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html
Getting a screen on WSL(2)にある2つのコマンド

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0

もしくは
export DISPLAY=localhost:0.0

これしたらグラフィック出るようになった。
exportは環境変数の設定コマンド。

2.次に写経します。さっそく3Dの壁が描画できます。
サンプル固有の変数・関数は、書き換える必要があります。(ex, 関数verlineは、mlx_pixel_putを線分描画するのと同じ働きなので置き換え等)
https://lodev.org/cgtutor/raycasting.html
https://lodev.org/cgtutor/files/quickcg/quickcg.h

DDAおよびRaycastingの概念理解のためにyoutube見てました。
仕組みが分かってもコード実装には結びつきませんでしたが、納得感あって気持ちが楽になります。
Maaaaath:face_with_symbols_over_mouth:
https://www.youtube.com/watch?v=gYRrGTC7GtA&feature=emb_rel_end
https://www.youtube.com/watch?v=TOEi6T2mtHo
アプローチが少し違うとどう進めればいいか迷うので、アプローチ資料は1つに絞るべき。

3.2の次ページを写経します。textureとspriteを実装すれば、必須描画パート終了。
創作というよりかは、先人の知恵を理解して使いこなす。Bonus触ってるうちに理解が深まる感じ。実装ありきで知識が増える感じ。

4.渡されたcubファイルの解析はGNL力:muscle: 、エラー処理や変数管理はprintf力:muscle: 。mapがclosedかを判定するのは、dfs(深さ優先探索)ですぐ実装できるかも。
・問題違うけど課題と同じアルゴリズム、二次元グリッドDFS問題の解答例(mapのsからgに行けるか判定)
https://atcoder.jp/contests/atc001/submissions/16052148

5."--save"コマンドでbmp作る。まさかの手書き実装。write関数の処理はとても重いので、write数減らすと地球にやさしい:earth_asia:
http://www.umekkii.jp/data/computer/file_format/bitmap.cgi
画像データの入力は、左下から右に、下から上に行う。

7    8    9   
4    5    6    
1rgb 2rgb 3rgb

【なんとなくわかった気になれるraycasting】
①自分から光をたくさん出して、壁にあてます。(400*300のウィンドウなら、400本の光を出します)
②それぞれの光について、壁に当たった点と、自方向の垂線との距離を求めます。

画像1

③それぞれの光について、②距離が短いほど長く、長いほど短い線分を描画すると、3D壁が生まれます。

画像2


この記事が気に入ったらサポートをしてみませんか?