Chapter 07. XV3 モデルの表示

このチュートリアルは、XV3 モデル (.xv3) を読み込みを解説します。

1. 準備

サンプルファイル

Chapter 07 で使用するサンプルファイルをご用意致しましたので、ダウンロードして下さい。 Excel ファイルを開きます。開く際に警告が表示された場合は、マクロを有効にする、を選択して下さい。もし、マクロを無効に してしまった場合は、Excel ファイルを一旦閉じ、もう一度開いて今度はマクロを有効にする、を選択して下さい。

ライブラリの準備でダウンロードできる sgl35.zip の中の Source ディレクトリの中に XV3 モデルがございますので、お使い下さい。このチュートリアルでは、 その raptor.xv3sample.xv3 の XV3 を使用します。sample.xv3 は、テクスチャーとして、sample_1.jpg、sample_a.jpg、sample_check.jpg を使用して います。このチュートリアルで使用するのは以下の 5 つです。


2. 読み込む

XV3 モデルの読み込みは、SGLXReadXV3() 関数を用います。 この関数は、引数に XV3 モデルのファイル名を指定します。XV3 モデル (.xv3) は、SGLXInit() 関数 の引数で指定されたパス以下に、設置して下さい。では、例を示します。SGLXInit() 関数を以下のように呼び出したとします。

// 区切り文字「\」は「\\」のように、2 つ要ります
SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\7");

SGLXInit() 関数の引数で指定されたパスは「C:\\Users\\Akito\\Documents\\MediaDesign3D\\7」ですので、 このパス以下に、先ほどの 5 つの XV3 モデルやテクスチャーを置きます。置いた後の、ファイルの絶対パスは 以下のようになります。

SGLXInit() 関数の引数には、空白(半角、全角含む)を指定しないで下さい。Windows XP をお使いの方、例えば C:\Documents and Settings\〜のように ディレクトリ名に半角が入るものがありますが、このようなパスを指定しないで下さい。申し訳ありませんが、空白の無いパスの位置に、XV3 モデルを設置して下さい。

SGLXInit() 関数には、赤字の部分を引数にします。SGLXReadXV3() 関数は、緑字の部分を引数にします。以下に示します。

SGLXReadXV3("raptor.xv3");
SGLXReadXV3("sample.xv3");

SGLXReadXV3() 関数は、SGModel* 型へのポインタを返します。 では、その変数を用意し、SGLXReadXV3() 関数の戻り値を受けましょう。

SGModel* model1;
SGModel* model2;
model1 = SGLXReadXV3("raptor.xv3");
model2 = SGLXReadXV3("sample.xv3");

sgl.h 内で、SGModel* 型は SGXV3 型とも定義されています。そのため、以下のように書くことも可能です。どちらを使用して 下さっても構いません。

SGXV3 model1;
SGXV3 model2;
model1 = SGLXReadXV3("raptor.xv3");
model2 = SGLXReadXV3("sample.xv3");

では、ここまでのコードです。Chapter 01 のコードに付け足した形です。

#include "sfcglx.h"

SGModel* model1; // SGXV3 model1; でも良いです
SGModel* model2; // SGXV3 model2; でも良いです

void display(){
  BGColor(200, 200, 200); 	
  SGBeginEdit();
  SGEndEdit();
  SGSwapFrames();
}

int main(int argc, char** argv){  
    SGInit(argc, argv); // SGL の初期化

    // SGLX の初期化
    SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\7");

    // XV3 ファイルを読み込む
    model1 = SGLXReadXV3("raptor.xv3");
    model2 = SGLXReadXV3("sample.xv3");

    // 3D を描画するモードに切り替えます
    SG3DMode();
    
    SGOpenWindow(0,0,500,500); // 500x500のウィンドウ
    SGSetDisplay(display); // 描画
    SGCallBack(); // コールバック関数を登録

    return 0;
}

3. 表示する

読み込んだだけでは、残念ながら表示されません。XV3 モデル (.xv3) を表示するには、SGL ライブラリの SGDrawXV3() 関数を使用します。 SGDrawXV3() 関数の引数には、SGLXReadXV3() 関数の戻り値を受けた変数を指定します。また、 SGDrawXV3() 関数は、SGSetDisplay() 関数で指定された描画関数の中で呼びましょう。では、ソースコードを全文載せます。

#include "sfcglx.h"

SGModel* model1;
SGModel* model2;

void display(){
  BGColor(200, 200, 200); 	
  SGBeginEdit();
      // XV3 モデルを表示する
      SGDrawXV3(model1);
      SGDrawXV3(model2);
  SGEndEdit();
  SGSwapFrames();
}

int main(int argc, char** argv){  
    SGInit(argc, argv); // SGL の初期化

    // SGLX の初期化
    SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\7");

    // XV3 モデルを読み込む
    model1 = SGLXReadXV3("raptor.xv3");
    model2 = SGLXReadXV3("sample.xv3");

    // 3D を描画するモードに切り替えます
    SG3DMode();
    
    SGOpenWindow(0,0,500,500); // 500x500のウィンドウ
    SGSetDisplay(display); // 描画
    SGCallBack(); // コールバック関数を登録

    return 0;
}

実行画面を以下に載せます。

ワイヤーフレーム

何が何だか分かりませんね(笑) 3D の描画は、デフォルトでワイヤフレームで描画されるように設定されています。 ワイヤフレームモードは、WireFrameMode(); という関数を呼び出すことで設定することが出来ます。引数はありません。 先ほどのコードの display() 関数は、以下の display() 関数と同じ処理を行っています。

void display(){
  BGColor(200, 200, 200); 	
  SGBeginEdit();
      // ワイヤフレームモード
      WireFrameMode();
      // XV3 モデルを表示する
      SGDrawXV3(model1);
      SGDrawXV3(model2);
  SGEndEdit();
  SGSwapFrames();
}
他に、FlatShadeMode()、SmoothShadeMode()があります。設定してみましょう。
void display(){
  BGColor(200, 200, 200); 	
  SGBeginEdit();
      // FlatShadeMode();      // フラットシェードモード
      SmoothShadeMode();    // スムーズシェードモード
      // XV3 モデルを表示する
      SGDrawXV3(model1);
      SGDrawXV3(model2);
  SGEndEdit();
  SGSwapFrames();
}

スムーズシェードモードでの実行画面を以下に載せます。


近すぎて全貌が見えません。少しカメラを後退させましょう。Translate() 関数を使って、z軸方向に下がります。以下にコード全文を 載せます。

#include "sfcglx.h"

SGModel* model1;
SGModel* model2;

void display(){
  BGColor(200, 200, 200); 	
  SGBeginEdit();
      // 少し後退します。
      Translate(0,0, -7);
      // FlatShadeMode();   // ワイヤフレームモード
      SmoothShadeMode(); // スムーズシェードモード

      // XV3 モデルを表示する
      SGDrawXV3(model1);
      SGDrawXV3(model2);
  SGEndEdit();
  SGSwapFrames();
}

int main(int argc, char** argv){  
    SGInit(argc, argv); // SGL の初期化

    // SGLX の初期化
    SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\7");

    // XV3 モデルを読み込む
    model1 = SGLXReadXV3("raptor.xv3");
    model2 = SGLXReadXV3("sample.xv3");

    // 3D を描画するモードに切り替えます
    SG3DMode();
    
    SGOpenWindow(0,0,500,500); // 500x500のウィンドウ
    SGSetDisplay(display); // 描画
    SGCallBack(); // コールバック関数を登録

    return 0;
}

実行画面を、以下に載せます。


講義の過程で、以下のようなツルツルしたモデルを表示する方法も教えてもらえるのでお楽しみに。


Chapter 07 は以上です。お疲れ様でした。