私は OpenGL を学んでおり、人々が高度な形状をどのように作成しているかに興味があります。人物モデルを例にとってみましょう。誰かが OpenGL で人物を描いた場合、実際に座って頂点をプロットし、三角形をすべて手作業で作成して人物を作成する必要がありますか? OpenGL を使用してビデオ ゲームを作成し、すべての 3D モデルの頂点をプロットしているとは想像できませんか? あなたは本当にこれをしなければなりませんか?より自動化された方法はありますか?
2 に答える
ビデオ ゲームなどの 3D アプリケーションのコンテキストでは、OpenGL は 3D アプリケーション自体とグラフィック カード ドライバ間のインターフェイスです。OpenGL に対して発行するコマンドは、ある意味で変換されてドライバーに渡されます。ドライバーは、ソフトウェアの世界とグラフィック カードの間のインターフェイスになります。通常、完全な 3D アプリケーションを本当に興味深いものにするためには、他の多くのソフトウェア コンポーネントが必要です。ゲームにとって最も重要なのは、確かにアセットシステムです。画像、効果音、3D モデルなど (ゲーム レベルを含む場合もあります)。これらの芸術的なもの、またはアセットは、専用のソフトウェア パッケージを使用してアーティストによって作成されます。3D モデルの場合、最も人気のあるモデリング アプリケーションには、Blender、Maya、Max、Lightwave などがあります。これらのパッケージはそれぞれ独自のドキュメント形式を定義しています、アセットをディスクに保存するために使用されます。形式がわかっている場合は、ファイルを読み取り、適切なコマンドを OpenGL に発行してシーンをレンダリングするプログラムを作成できます。最も基本的なレベルでは、頂点が保存されているファイル内の場所を見つけ、OpenGL を使用してそれらを描画する必要があります。私の知る限り、これを実際に行うエンジンはありません。つまり、モデリング アプリケーションのドキュメントの内容を読み取ります。これらは非常に複雑な形式であり、ドキュメント化されていない場合もあるためです。
代わりに、ゲーム エンジンの開発者は通常、一対のプログラムを無料で作成、購入、またはダウンロードします。
- エクスポーターは、3D ドキュメントから関連情報を抽出してファイルに保存するプログラムです。これは、スタンドアロン プログラムにすることも、3D アプリケーション自体のプラグインにすることもできます。例として、Blender は通常、Python で記述されたプラグインを使用します。その中にはエクスポーター プラグインがあります。
- 通常、インポーターはゲーム エンジンにリンクするライブラリであり、エクスポーターによってエクスポートされたファイルをメモリにロードできます。このデータ構造をメモリにロードしたら、そのフィールドを反復処理して、適切なコマンドを OpenGL に送信できます。
これは Blender を使った非常に単純な例です。頂点の位置をエクスポートするには、次の Python スクリプトで十分です。通常、興味深いものをエクスポートできるようにするには、面 (三角形) の情報もエクスポートする必要があります。
import bpy
object = bpy.data.objects['Cube']
mesh = object.to_mesh(scene = bpy.context.scene, apply_modifiers = True, settings = 'PREVIEW')
file = open('/Users/Damix/Cube.txt', 'w')
for v in mesh.vertices:
file.write("%f %f %f\n" % (v.co[0], v.co[1], v.co[2]))
file.close()
実際のキューブの場合、上記のスクリプトは次のようなファイルを出力します。
1.000000 1.000000 -1.000000
1.000000 -1.000000 -1.000000
-1.000000 -1.000000 -1.000000
-1.000000 1.000000 -1.000000
1.000000 0.999999 1.000000
0.999999 -1.000001 1.000000
-1.000000 -1.000000 1.000000
-1.000000 1.000000 1.000000
次のようなものを使用して、このファイルをゲームに読み込むことができます (C 言語の場合):
float x, y, z;
FILE *file;
file = fopen("/Users/Damix/Cube.txt", "r");
while (fscanf(file, "%f %f %f", &x, &y, &z))
{
glVertex3f(x, y, z);
}
fclose(file);
最新の OpenGL では、代わりにglVertex3fを使用せず、属性バッファーを構築します。
実際のゲーム エンジンでは、テクスチャ座標、法線情報、マテリアル設定、そして最も恐ろしいアニメーション データ (アニメーションがある場合) もエクスポートする必要があります。また、3D モデリング アプリケーションは OpenGL とは異なる 3D 規則を持つ可能性があるため、データを変換する必要があります。たとえば、Blender は OpenGL で書かれているにもかかわらず、Z 軸が上を指す参照フレームを使用します。
通常は、3D モデリング パッケージ用のインポーターとエクスポーターが既に存在する、よく知られた交換形式を使用するのが賢明です。Blender は、Alias Wavefront .OBJ のエクスポートを標準でサポートしています。これは非常に単純な形式であり、インポーターを作成するのはそれほど難しくありません。他の輸出業者もありますが、私はそれらの品質を認識しておらず、実際に使用したことはありません. 調査を行い、適切な形式を選択する必要があります。