VRエンジン作成日記

ひたすらVRエンジンを作っていきます

destroyメソッドを追加

画面からオブジェクトを破棄するためにdestroyメソッドを追加した。WebGLの仕様が十分に理解できていないため、1カ所問題が解消できていないところがある。MeshRendererでVBOをdeleteBufferで消したのと同じ描画フレームで、他のオブジェクトを描画しようと…

オブジェクトの情報をJSON形式で出力

画面に登録されているオブジェクトの情報をJSON形式で出力できるようにし始めた。まだ完全にはできていない。これができると、プログラムでオブジェクトの作成工程を全て書くのではなくて、JSON形式であらかじめ用意しておいた情報を使って画面を復元するこ…

Skyboxを表示できるようにした

Skyboxを表示できるようにした。背景のクリア時に使うことができる。 この画像はUnityのアセットストアからお借りした。画像はリポジトリには含めていない。 assetstore.unity.com 背景をSkyboxにするだけできちんと画像を描いている感じが出てくる。今のと…

Rigidbodyを実装し始めた

Rigidbodyを実装し始めた。今のところ重力と外力を加えるくらいしかできない。衝突判定は実装していない。2Dの簡単な物理シミュレーションは実装したことがあるけど、3Dは実装したことがないので難しい。 ・関連するコミット add Rigidbody class · hikipuro…

Vector3クラスを修正

Vector3クラスを修正した。未実装のメソッドの実装とテストケースの追加を行った。なぜ実装していないメソッドがあったのかというと、実装内容が想像できなかったから。単純に難しかった。Quaternion等を実装していく中で、Vector3の実装が難しいメソッドの…

マウスホイールに対応

マウスホイールに対応する処理を追加した。 あとは、MonoBehaviourと同じような動きをするクラスにawakeとlateUpdateを追加した。今日はほとんど進まなかった。 ・関連するコミット add mouse wheel support · hikipuro/tea.js@27da47e · GitHub

シャドウマップを修正した

シャドウマップを修正しないまま1週間くらい放置していたので、見栄えがする程度に修正してみた。解像度を上げればそれなりに使いどころはありそう。今のところ、セルフシャドウのかかりかたとエッジが滑らかになっていないところが気になってはいる。あと、…

ライティングの調整

ライティングの処理を調整した。今までは平行光源だけを実装していたけど、点光源とスポットライトを追加した。スポットライトは今のところフラグメントシェーダで処理した方がいいところを頂点シェーダで処理してしまっているので、表示に不自然さが残って…

OBB同士の衝突判定を追加

OBB同士の衝突判定だけど、昨日コミットするところまで行かなかったので修正してコミットしておいた。マルペケさんのサイトを見なかったら、おそらく実装できていなかっただろうと思う。 あと、Color.white とかの固定の値を static readonly にしていた。毎…

OBB同士の衝突判定を追加しようとした

OBB同士の衝突判定を追加しようとしたけど、今日中にはできなかった。マルペケさんのサイトで詳しく解説されてるから、理解してから実装しようと思ったら理解するのが難しかった。 その13 OBBとOBBの衝突 他には、さらに最適化を入れようとしたけど失敗した…

OBJファイルの読み込み処理を修正

OBJファイルの読み込み処理を修正した。わりと複雑なモデルも読み込めるようになった。 画像のドラゴンのモデルは 871,306 ポリゴンもあるようだ。読み込み処理自体は数秒かかるものの、画面に表示する時はタスクマネージャで確認するとCPU負荷は増えていな…

OBBとRayの衝突判定を追加

OBBとRayの衝突判定を追加した。ようやく画面内のオブジェクトをマウスで綺麗にクリック判定できるようになった。OBB同士の衝突判定を追加すれば、簡単なゲームなら作れるようになったのではないかと思う。 あと、今日も実行速度の最適化処理を念入りに追加…

実行速度を最適化した3

今日も実行速度を最適化していた。キャッシュは今のところできる限り書いたように思える。あとは、Vector3クラスの初期化時等のタイミングで、x: number = 1 と書いていたところを、x: number = 1.0 というような書き方に変えたりしていた。整数型から浮動小…

実行速度を最適化した2

今日も実行速度を最適化していた。1回計算すれば使いまわせる行列が1フレームに何度も作られていたりとか、無駄のある箇所を削ったりしていた。簡単な最適化を入れたつもりでも、コードの読みやすさが劇的に下がってしまう。メンテナンス性とバランスを取…

マウスのクリック位置とオブジェクトの衝突判定処理を追加

マウスのクリック位置とオブジェクトの衝突判定処理を追加した。処理内容としては、カメラからマウスのクリック位置方向へ線をまっすぐ作って、その線とオブジェクトを囲む箱とが衝突するか判定する処理を書いた。次のサイトを参考にさせて頂いた。 その18 …

実行速度を最適化した

実行速度を最適化した。JavaScriptでは、C言語だとコンパイラが最適化してくれそうな箇所で最適化が入らなかったりする。最適化の一般的なお話でいうと、次のような項目は効果があると言えそう。 ・関数のインライン展開 ・複数回参照される項目を変数にキャ…

バンプマッピングを実装してみた

バンプマッピングを実装してみた。考え方については分かっていたものの、具体的にコードで考えるのは難しかった。下の画像の地面の部分と、カプセルのオブジェクトから文字が飛び出しているように見えるところがバンプマッピングの処理。 次のサイトを参考に…

視錐台カリングを実装してみた

今日は視錐台カリングを実装した。実装したけど、考え方をきちんと理解しているわけではない。次のサイトに書かれている内容を参考にさせて頂いて、なんとなくで書いた。 edom18.hateblo.jp 描画オブジェクトが多い場合は違いが分かりそうだけど、今のところ…

親子関係にあるオブジェクトの座標2

シャドウマップがうまくいっていないことも気になってるんだけど、そもそもフォンシェーディングも綺麗にできていなかった。さらに考えると、親子関係のオブジェクトの位置関係もUnityと見比べると違う結果になっていた。 親子関係のオブジェクトは、 ・親オ…

シャドウマップを実装しようとした

シャドウマップを使って影を描く処理を実装しようとしたけど、難しくて今日中に終えることができなかった。 毎日1個ペースで機能を増やそうと思ってたけど、何日か考える必要がある箇所がこれからもたびたび出てきそうな予感。以前に考えたことがある内容で…

RenderTextureの追加

今日はRenderTextureを追加した。いつものことながら、今のところ雑に追加したままになっている。 地面に敷いた、四角形の領域でRenderTextureを使用している。この機能があると、他のカメラでレンダリングした映像を再度画面に配置して、2次元のテクスチャ…

パーティクルシステムを作り始めた

パーティクルシステムというのは、小さな点が次々に飛び出してくるような機能。 雪が降っているシーン、星が奥から飛び出してきて光速移動しているように見えるシーン、シューティングゲームの爆発効果とかで使うことができる。この機能があると、様々な用途…

objフォーマットの対応

objファイルの読み込み機能を修正した。objファイルの読み込み機能は数週間前に作ってはいたんだけど、頂点データくらいしか読み込めていなかった。今回は三角形のインデックスと法線、UVとテクスチャを読み込むようにした。objファイルが正常に読み込めるよ…

立体視用の機能を追加

ようやくVRっぽい機能を1つ追加できた。 立体映像の表示方法にはいくつか種類がある。基本的にはどれも、左右の目で別々の画像を表示する構成になっている。例えば次のような種類がある。 ・サイドバイサイド (side by side) ・トップアンドボトム (top and…

シェーダ関連機能の追加

今日はシェーダに関連する機能を追加していた。昨日書いたように、シェーダ言語では設定しきれないけどレンダリングに必要な項目がいくつかある。UnityではShaderLabのPassブロックの中で、レンダリングステートとして設定できるようになっている。この辺り…

Material.renderQueueの追加

今日は細々と気になっていたことを修正した。落ち着いて衝突判定の処理を書き進めていきたいところだけど、積もってきた未処理の作業を減らしておかないと落ち着いて考えることができなさそうだった。 今日やったことは主にMaterial.renderQueueの部分。rend…

FPSの表示機能を追加した

今日はFPS(画面描画回数の単位。フレーム毎秒)の表示機能を追加していた。画面の右上あたりでデバッグ情報とかを表示する窓みたいなものなんだけど。ゲーム開発者の間では一般的にStatsというらしい。以前、Flashでコンテンツを作っている時に、よく誰かが実…

親子関係にあるオブジェクトの座標

今日は画面に表示されるオブジェクトの親子関係の座標についての実装を変更していた。今まではObject3Dというクラスに座標を格納していて、positionというメンバ変数に保存していた。座標を変えたい場合は次のように書く。 obj.position.x = 10; こうすると…

とりあえずの目標

Unityほど便利でないとしても、ひとまず動くようにしたい。あと、ライブラリだけじゃなくてグラフィカルなエディタもセットで作りたい。そこまでいくと1人でできないかもしれないけど、できるだけ目標に向けて作っていく予定。 今日はゲームエンジンアーキ…

猛烈にVRエンジンが作りたくなった

最近VTuberとか流行ってるし、時代はVRだと思いこんでVRエンジンを作ることにした。ちょうど数学の勉強もしたかったので、幾何を覚えたら得をするのではないかという目論見もある。 何から手をつけていいやら分からないので、とりあえず基礎からしっかり覚え…