ゲームエンジン基礎
ゲームエンジンは、ゲームシステムを作るときによく使う各種演算処理ライブラリの提供=ゲームエンジンと、そのライブラリでコンピュータプログラムを作るためのツール
をまとめたもの。
コンピュータプログロムの基礎知識がある方が習得しやすい。
1.コンピュータ知識
コンピュータは、扱う情報を0,1(無いか在るか)のディジットの組合せで表すことで、情報を正確に高速に処理することができる。
0か1のどちらかを表す1単位ビットを、時系列に順番に処理する。
複雑なパターンの情報を表すには多数のビットが必要になるので、8ビット、16ビットなど一回にまとめて処理する。
- ビット 2進法(1bit) 0,1 2^1=2種類の値(0か1)を選んで示せる。
- 16進法(4bit) 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 2^4=16種類の値を選んで示せる。
- バイト(8bit) 0-255, 00-ff 2^8=256種類の値を選んで示せる。アルファベット、数字、記号などを番号で示せるので、初期のコンピュータで普及。
- 2バイト(16bit) 0000-ffff 2^16=65536種類の値を選んで示せる。
コンピュータで0,1(無いかあるか)の羅列による情報を記憶しておく場所をメモリという。
プログラム自体もメモリに記録された情報の一つになる。
メモリ内で指定場所を表す通し番号である番地をメモリアドレスという。
データの複雑さによってそれをメモリに格納するための長さが変わるので、扱う対象によって情報を格納する変数の”型”を変える。
情報を格納する変数の種類
- character(バイト文字または1バイト整数)
- integer(整数、2バイト、4バイト)
- float(浮動小数点数、2バイトから16バイト)
- word(コンピュータ/OSによる一回の処理ビット)
- string(バイト文字列)
- 構造体=変数の組合せ集合体メモリ上に格納された変数の開始アドレスを、ポインタという。
画像情報
点(ピクセル)の明るさの強さを、幅W×高さHの羅列で記録する。
点の明るさはRGBの3原色の強さで表す。
RGB各色を1バイト(256段階)=3バイト24ビットで表すことが多いが、コンピュータのwordが32ビット、64ビットの場合に空席ができるので、4バイト目に透明度情報をアルファ・チャンネルとして追加する場合が多い。RGBA
人間の目には各色256段階で表せば十分足りるが、中間映像処理を行う素材として使う場合には256段階では劣化が問題となるのでさらに分解能を上げる。
- white #ffffff RGB(255,255,255)
- アルファチャンネルRGBA(255,255,255,0)
HDRP(High-Definition-Render-Pipeline)Unityの高画質映像表現機能
コンピュータ映像は、最終的に画面の明るさ諧調で表現されるので、コンピュータプログラム内でも、かつては画面の明るさ諧調を表すのと同じ数を使って表現していた。
しかし、これでは最終的な見栄えをわかって作業を進めなくてはならず、人によって考え方が変わる。
そこで、物理世界の光と同じように、光を表し光学的に正しい物理量で記述表現するようになった。
こうしておけば、グラフィクス処理のハード、ソフトの性能や特性が変化しても、扱う数字は変わらない。
扱う人に依存せず数字が決定されるので分かりやすい。
Unityは、エディタにビルドインされているのも物理レンダラーだが、HDRPでは記述単位が物理量に変わっている。
人間の皮膚を透過、拡散する光を計算しているので、HDRPサンプルでは逆光の人物の耳たぶが赤く透けて見える。
音声情報
音(気圧変化)の強さを一定周期時間置きに羅列して記録する。
チャンネル数×分解能×サンプリング周波数
音楽CDでは毎秒、2ch×16bit×44.1kHzの連続データ
インタラクティブアプリケーションでは、作った世界の中でリアルタイムに発生する音を再現するため、小さく区切った音源データをいつでも再生できる準備しておいて、指定したタイミングと音量で再生する。準備しておくスロットが512、1024と多数あれば沢山の音が同時に鳴っても対応できる。
3D空間での音の再現は、音源の方向と距離によって主観位置に届くまでに壁などの途中の遮蔽や反射などを計算し、立体感のある音響としている。
入出力装置
初期のコンピュータは、ビット情報をスイッチの並びで入力し、ビット情報をランプの光やパンチ穴の並びで出力していたが、
その後、入力はキーボードで入力するようになり、出力はプリンターからテキスト文字を表示するスクリーンに代わった。
ミニコン(日本ではオフコン)時代に、現在のデスクトップPCのような形のスクリーンとキーボードを備えるターミナル(端末)が普及した。
ターミナルにはプロンプト(入力待ち記号)が表示され、そこにコマンドを打ち込むと、文字で出力が戻るという形となった。
現在のPCは、ミニコン時代のマルチユーザー・マルチタスクのO/Sを始祖に持つためターミナルという考えが残っている。
ターミナルにコマンドを対話的に都度打ち込むのではなく、予め実行したい手順を書いて(スクリプト)それを入力して実行させる方法が使われた。
スクリプトを解釈して実行するものがシェルであり、Cシェルで使われたスクリプトを元に生まれたコンピュータ言語のC言語から、Java、C#などのスクリプト言語が現在使われている。Unityでは、手順の記述にC#を使う。
2.プログラミング知識
最近はプログラミング言語を記述するコーディングを(表で)行わないノンコードプログラミングが増えている。
UNITYではC#スプリプトを用いるが、ノードベースのVisualSprictingが2021からビルドインされた。
また、C#スプリプトでも変数をPublicで外に出しておけば、Unityエディタから変数の値を直接入力できる。
C#スクリプトを読み解いたり書き換える時に、C#またはC、C++の知識が少しはあると便利。
C言語系の基本として、コンピュータ処理コマンドの基本は関数の呼び出しで行われる。
左辺の変数 = 右側の関数(引数);
右側の関数が、引数に値を入れて呼び出されると、所定の処理を実行して、戻り値を返し、左辺の変数に戻り値が書き込まれる。
global, private
スクリプト全体で見えるglobalと、関数記述内だけで見えるprivate
INPUT(コード入力)とState(接点状態)
文字列や数値、ボタンが押されたかどうかを入力情報として得たい場合はInput=入力値を確認する
今まさにキーが押されているのか、センサーの現在値はどうかなどを得たい場合は、State=状態を確認する
フローチャートとイベントループ
スタートからエンドまで、順番に処理を進めていく。選択分岐やジャンプはあるが、基本的に処理の流れはつながっていくのでフローチャートで表現できる。
リアルタイム、インタラクティブ系のプログラムでは、どんな順番で何が実行されるか都度変わり動くまで判らない。
何が有ったら何をする。という条件を多数決めて置いて、何か起きるまで監視を続ける無限ループを回す。
終了条件が満たされた場合に、定められた終了手順を実行してプログラムは終わる。
3.3D知識
3Dアプリケーションのプログラムとは、3次元座標計算を大量に行う計算処理である。
ただし、行列計算等の3次元座標計算の中身を直接指示する必要は無く、関数の呼び出し、構造体の値の確認だけでよい。
- デカルト座標系
x,y,zの3軸が原点(0,0,0)で直交する座標系。
- オイラー角
x軸、y軸、z軸を中心にそれぞれ回転する角度をまとめたもの。
順番で結果が変わるため、Unityの場合は必ずZ→X→Yの順番に回転する。
- Vector2 x,yの2次元値を格納する構造体
- Vector3 x,y,zの3次元値を格納する構造体
- Vector4 Quaternion 構造体 回転軸の向きと回転角(4次元)
- transform.LookAt 一点を決めて、そこに向くように回転させる。
4.3Dモデリング知識
一般的な3DCADは3D図形を数学表現で表すが、DCCツール、ゲームエンジンでは、3D図形を点の繋がりで作った図形の集合として表す。
- ポイント、カーブ、サーフェース、ポリゴン
- ノーマル
法線方向を表すベクトル。 点を繋いだ直線や平面にノーマル情報を与えることで面の張りを表現する。ノーマルを連続的に変化させれば、視覚的には角がなく滑らかに連続しているように見える。
サーフェスには単色で塗りつぶして色付けを行うほかに、表面の見え方を画像を張り付けて表現する。
- マテリアル、テクスチャ
マテリアル=素材情報は、色や透明度、光沢などモノの見え方を表す情報だが、摩擦率や密度、衝突時の反発係数なども一緒に含める場合もある。
テクスチャ=肌ざわりは、モノの見え方の中で表面の状態をビットマップイメージにした情報。模様だけでなく、シワ、傷、粗さ、光沢ムラなどの凹凸情報などもある。
サーフェスに色情報として写真を貼るだけだと印刷したような見え方になる。そこで、写真から凹凸情報を分析してビットマップイメージ情報としてに与える。
- ノーマルマップ
法線ベクトルの方向をビットマップにしたもの。垂直線が傾いているものとして光学計算するので、視覚的には傾いて見える。
- アルファマップ
透明度分布をビットマップにしたもの。透明〜不透明。
- 粗さマップ
光沢情報分布をビットマップにしたもの。鏡面〜すりガラス状
- バンプマップ
高さ情報をビットマップにしたもの。凹凸があるように表示する。
- UV
サーフェスにビットマップを貼るテクスチャ座標。空間座標のx,y,zと区別するためベクトル成分をU, V, Wで示す。通常2次元なのでUVを使う。
- シャドウマップ
シーン内の陰影情報をビットマップに焼きこみ(ベイク)して、テクスチャとして扱うことで陰影処理の再計算を省略し処理速度を上げる。光源が移動する場面では陰影が固定化されると不自然になることがあるので、固定された背景やプロップに限定して使うことで計算負荷とリアリティを両立させる。
- 環境マップ
環境マップは、プローブ位置で360°撮影を行い。それを周辺のサーフェースに貼りこむことで、鏡面へ周囲の風景が映りこんだように見せる。
レイトレ―シングよりスピードが速いが、視点が動くときに光の流れが不自然になりがち。プローブ位置と数を調整し不自然感を無くすように工夫する。
5.アプリケーションで創る世界感
- Screen (2D) projection 真横から眺めたシーン
- Bird's eye view 真上・(斜め上)から眺めたシーン 航空写真、衛星写真のような遠隔からズームカメラで狙った絵作り。
- Fly Through カメラが、鳥やドローンの様に空間内を自由に移動する。
- Walk Through 人の目の高さの視点カメラで空間を移動する。
- FPS 第一人称視点射撃 主人公の目の位置のカメラで世界を眺める
- TPS 第三人称視点射撃 主人公のについていくカメラマンの視点で世界を眺める
主人公には、ボールや玉などの物体、車や飛行機、人などがある。
工場バーチャルレビューは、主人公が人(オペレーター)のTPSシーン。
FPS視点を、VRゴーグルやHololensを使って目の前で映すと仮想現実に没入体験できる。
- NPC non player characterは、操作している人間が実際にはいないプログラムによって動く対戦相手やモブキャラなどの登場人物。
- AI 最近では、物理演算の効率化や画像認識、音声認識など機械学習したAI機能との連携を意味してAIという言葉を使うことも増えたが、ゲームエンジンでAIという言葉は、NPCの自然な動きを制御するプログラムを差して使われていた。
参考シーン⇒
Unity Standard Assets
Unity でのモデル読み込み
キャラクターモデルの変更
return