1

特にiPhone開発ではなくPC用に、MAYAなどの3DモデリングソフトウェアからOpenGLに3Dモデルをインポートするにはどうすればよいですか?

4

2 に答える 2

11

これはあなたを驚かせるかもしれませんが、OpenGLには「モデル」のようなものはありません。OpenGLが行うことは、大量のデータを受け入れ、OpenGLにこのデータへのアクセスを許可して、そのデータに対して実行する操作が画面上にきれいな画像になるようにすることです。

それで、その紹介の後、あなたが立方体のようなモデルを手に入れたとしましょう。立方体は、それぞれ4つの角を持つ6つの面で構成されます。各コーナーの位置はそれぞれ3つの面で共有されますが、面の方向、いわゆる法線は、見ている面によってそのコーナーで大きく異なります。位置、法線、およびその他のいくつかの属性は、頂点と呼ばれるものを形成します。したがって、立方体の場合、6 * 4 = 24個の頂点があります(資本位置、通常より低い)

X,   Y,  Z,  x,  y,  z
-1, -1, -1, -1,  0,  0
-1, -1,  1, -1,  0,  0
-1,  1,  1, -1,  0,  0
-1,  1, -1, -1,  0,  0
 1, -1, -1,  1,  0,  0
 1, -1,  1,  1,  0,  0
 1,  1,  1,  1,  0,  0
 1,  1, -1,  1,  0,  0
…

などなど、あなたがアイデアを得ることを願っています。各線は頂点ベクトルを形成します。このベクトルの形式は任意です。これらの属性(Position、Normalなど)を1つの共通のインターリーブ配列に配置することも、独自の配列の各属性に複数の配列を使用することもできます。ただし、インターリーブされた配列の方が効率的であることがよくあります。

頂点のリストと一緒に、面のリスト、つまり、面の場合は頂点インデックスのタプルもあります。したがって、立方体の場合、これらのタプルは、四辺形を指定します。

0, 1, 2, 3
4, 5, 6, 7
...
20, 21, 22, 23

モデルのロードとは、モデルファイル形式からデータを読み取るプログラムを作成することを意味します(できれば、文書化されたもの、または自分で作成してモデリングプログラムのエクスポーターを作成したもの)。次に、読み取られたデータは、OpenGLがそれを利用できるように、上記のような方法でメモリに配置されます。

次に、このデータをOpenGLに提供します。2つのオプションがあります。データをプログラムのプロセスアドレス空間(クライアント側の頂点配列)に保持するか、データをOpenGLバッファーオブジェクト(頂点バッファーオブジェクト)にアップロードします。

次に、OpenGLにジオメトリデータをフェッチするように指示します。

クライアント側の頂点アレイの場合、これは次の方法で行われます。

GLenum primitive_mode;
GLfloat *vertex_data;
GLushort *indices_data;
int face_count;


void load_model(...)
{
    /* ... */
    read_vertex_data_from_file(&vertex_data, 
                               &indices_data, 
                               &face_count, 
                               &primitive_mode, ...);

}

/*...*/

void draw_model()
{
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    glVertexPointer(
                    3, /* we're supplying vectors of which the 3 first elements are to be used for vertex position */
                    GL_FLOAT, /* the type of each vector element is GLfloat */
                    sizeof(GLfloat)*6, /* the beginnings of vectors in vertex_data are 6 * sizeof(GLfloat) apart */
                    vertex_data + 0 /* the pointer to the data, positions are offset 0 */
    );

    glNormalPointer( /* normals always have 3 elements, no size given */
                    GL_FLOAT, /* the type of each vector element is GLfloat */
                    sizeof(GLfloat)*6, /* the beginnings of vectors in vertex_data are 6 * sizeof(GLfloat) apart */
                    vertex_data + 3 /* the pointer to the data, normals are offset 3 */
    );

    glDrawElements(primitive_mode, face_count, GL_UNSIGNED_SHORT, indices_data);

}

モデルローダーを自分で実装するか、このタスクにサードパーティのライブラリを使用する必要があります。

于 2011-08-20T11:09:18.447 に答える
1

Mayaはさまざまな形式にエクスポートできます。現在、多くのアートパッケージでサポートされているため、主にFBXが使用されています。

C ++でアプリケーションを作成している場合は、fbxファイルの読み取りに使用できるFBX Apiがあります:http: //usa.autodesk.com/adsk/servlet/index? siteID = 123112&id = 7478532

XNAは、コンテンツパイプラインのバックグラウンドでこのSDKを使用していると思います。(xnaに精通している場合)

fbxファイルから必要なデータだけを抽出するのに便利なPythonライブラリもあります:http://download.autodesk.com/us/fbx/20112/FBX_SDK_HELP/files/WS73099cc142f48755-751de9951262947c01c-6dc7.htm

Pythonを使用してMayaで独自のエクスポートスクリプトを作成することもできますが、これは簡単な作業ではないことに注意してください。

少しググると、他のフォーマットのインポーターも見つかると思います.obj。これも一般的に使用されています。

于 2011-08-20T10:44:23.630 に答える