初めに
はじめましての人は初めまして。
個人でいろんなものを作ってる学生のCroと申します。
今回は、私が自作した3Dオブジェクトレンダリングエンジン"OWLs"の話をさせていただこうと思います。
制作背景
そもそも、なぜこんなものを作ろうと思ったのかについてです。
初めは、長期休暇中にUnityでクソゲーを製作していた時でした。
ProBuilderを使って仮組の部屋を製作していたのですが、なかなかに難しくて、面倒でした。
特に、ベクトル移動で移動させても、思っている高さじゃなかったり、移動しすぎたり...
かなり小回りが利きにくく感じており、イライラして作業が滞ってしまっていました。
そんな時です。天の声が聞こえてきました。
私 : なんでオブジェクト配置って、移動だけでこんな面倒なんや...
天の声: お困りのようですね。
私 : !?
天の声: 既存のものが使いにくいのなら、自作してしまえばいいじゃないですか。(?)
私 : ...確かにそうやな!(?)
こんなことがあり、長期休暇にもかかわらず自分に課せている大規模プロジェクトもなかったので、企画を考えてみることにしました。
企画内容
今回自分に課したのは、だれでも簡単にオブジェクトの配置ができるエディタの制作です。
今回のエンジンでは、エンジンコア・エンジン・エディタをC#、計算処理をC++で実装しています。
まず初めに、どうすれば簡単に移動でき、かつ細かな部分まで調整できるのかを考えました。
そこで、自分の中で出てきた答えが、"グリッド"でした。
移動はWASDや十字キーに任せ、高さの変化はShiftを押しながらの操作にすることでわかりやすく。
さらに、回転や座標移動もできるようにしてあげれば、これで移動の基礎は完成です。
そして、細かな操作をどう実現するのかですが、これはグリッドというものの特徴を活用することにしました。
制作するグリッドは二種類。
1つ目は、描画用グリッドです。
これは、目に見えるグリッドを描画し、その上にオブジェクトをのせて描画することで、移動の距離やグリッド幅を分かりやすくしています。
2つ目は、オブジェクト用グリッドです。
こちらは、オブジェクトを配置する際に使用し、ベクトル操作や回転などの座標変更、位置変更やその情報取得に使用します。
2つに分割することで、グリッド座標に対して、+(プラス)キーやー(マイナス)キーを活用して、移動できる距離をグリッドサイズごと変更します。
これによって、グリッド移動であっても、細かな動作や高さの調整、直観的かつ複雑な配置を実現できます。
また、インスペクターやヒエラルキーも製作する必要があります。
インスペクターでは現状、オブジェクトの座標、回転、サイズ、名前、そしてグリッドのサイズ変更用コンボボックスを描画させています。
ヒエラルキーでは、現在グリッド上に描画されているオブジェクトの名前、そして親子構造の作成、解除ができます。
インポートとエクスポートも作成しており、現状、objファイルのみ読み込みが可能となっています。
しかし、MLTファイルの読み込みがうまくいっておらず、色調は一色のみしか取得できていません。
ここまでが、私の制作したレンダリングエディタのおおよその機能です。
次の項では、どのように作成したのかについて説明していきます。
作成方法
まず、今回は完全自作を目指したため、エンジンコアを制作する必要があります。
今回は、C#を使いVectorを2つ製作して、描画用と、移動用にカスタムする方法を用いることにします。
しかし、描画時に複数の関数を活用する関係上、大量のオブジェクトを読み込んだ際に動作がスムーズに実行できるのかに不安を覚えたため、C++を勉強して計算軸に組み込みました。
まず、大まかな流れとして、以下のような流れになっています。
- エンジンコアを作成
- エンジン作成
- エディタ作成
- 細かな調整
- いったん完成
- 不定期で更新
・ エンジンコア制作 (C#)
まず、私はエンジンコアを"DOESUE"( (3)D Object Easily Set Up Engine )と名付け、制作に取り掛かりました。
このエンジンコアには、Vectorが2つ制作されており、各Vectorの特徴は、上記のとおり(描画・オブジェクト用)です。
しかし、このコアにはグリッドも何も実装されておらず、完全な基礎部分です。
・ エンジン・エディタ制作 (C#)
次に、エンジンの制作です。こいつには""OWL_Engine""と名付け、制作に取り掛かりました。
こいつは実装内容が一番多く、複雑になっています。
大まかな実装物は以下の通りです。
- カメラ
- 移動
- 基本オブジェクト
- 3DRender処理
- インプット受け取り
- アウトプット呼び出し
- 保存
- Inspector
- Hierarchy
- グリッド処理
- ショートカット各種
- その他
・ 処理層制作 (C++)
こいつは、勉強と挙動の快適性のためにC++を利用する目的で制作しました。
名前を""OWL_Native""とし、主に計算処理などの動作が重くなりやすいものを重点的に任せています。
- 外部からのobj取り込み
- 法線生成などの計算処理
- 外部への出力用バッファの制作
- 各情報のC#部分とのやり取りをするための処理
などを実装しています。
細かな調整
ここでは、実際に動かして動作確認をしたうえでの不満点や動作不良を治していきました。
例としては、
- ショートカットキーの実装
- 選択したオブジェクトのサイズをやや大きくする
- 色を付けることで選択されているオブジェクトが分かりやすくなるようにする
などですね。
ほかにも様々な調整をしましたが、現在も続けており、きりがないため割愛させていただきます。
いったん完成
これでやっと、いったん『完成』としました。
ここまでで約一カ月半くらいかかりましたね。
学んだことのないC++を使用する際など、細かな部分でAIを活用することもありましたが、基本的に調べて書いての繰り返しで、先人たちの知恵を見て学び楽しかったです。
ただ、毎日最低でも6時間程度、曜日換算では"月月火水木金金"のペースでこいつの制作に時間を割いていたため、ゲーム制作の方は滞りまくり、結局企画を破棄して別のゲームを制作しています。
その話はまたゲーム完成時や、きりがよくなった際に話させていただきます。
また今回のエンジンの記事についても、あまりにも長くなるため実装内容(コード等)は次の記事で書かせていただきます。
今回紹介させていただいたエンジンはGitHubにて公開させていただいていますので、URLを貼り付けておきます。
「こうしたほうがいい」、「もっと効率のいい処理方法がある」などございましたらぜひプロのニキネキさんたちにご教授いただけると幸いです。