English
PROGRAMMER'S GUIDEVDP1ライブラリ
戻る進む
VDP1ライブラリ

3.VDP1 3Dガイド


3.1 目的

VDP1拡張処理ライブラリを用いて3Dのスプライト表示を行うことを目的とします。
以下にその特長を示します。

3.2 3Dの座標系と表示モデル

 [座標系]

 視点からスクリーンまでの距離は 1.0 に固定。

 [表示モデル]
表示モデルはポリゴンの集まりであるオブジェクトを以下のようにクラスタとして階層構造に接続したものです。クラスタは親子の関係にあり、子クラスタのオブジェクトの位置は親クラスタのボディ座標系に配置されます。したがって、親クラスタが移動すると下に接続される全子クラスタが移動します。

┏━━━━━━━┓   ┏━━━━━━━┓            
┃オブジェクト0┃   ┃オブジェクト1┃            
┗━━━━━━━┛   ┗━━━━━━━┛            
   :           :                 
   :        ┌───────┐            
   :      ┌─┤クラスタ 10│            
   :      │ └───────┘            
   :      │                      
┌───────┐ │ ┌───────┐            
│クラスタ 00├─┼─┤クラスタ 11│            
└───────┘ │ └───────┘   ┌───────┐
 ルートクラスタ  │           ┌─┤クラスタ 20│
          │ ┌───────┐ │ └───────┘
          └─┤クラスタ 12├─┤          
            └───────┘ │ ┌───────┐
                      └─┤クラスタ 21│
                        └───────┘

3.3 プログラム記述例

C言語による実際のプログラム例を以下に示します。

#include <machine.h>
#define  _SPR3_                        /*     スプライト3D表示ライブラリの使用   */
#define  SPR_3USE_DOUBLE_BUF           /*     ダブルバッファ指定                */
#include "sega_spr.h"
#include "sega_scl.h"
#include "sega_int.h"

SprCluster model0;
SprCluster model1;

#define COMMAND_MAX        1000        /*     最大コマンド数                   */
#define GOUR_TBL_MAX       1000        /*     最大グーローテーブル数          */
#define LOOKUP_TBL_MAX     1000        /*     最大ルックアップテーブル数        */
#define CHAR_MAX           100         /*     最大キャラクタ数             */
#define DRAW_PRTY_MAX      256         /*     最大描画プライオリティブロック数   */
SPR_2DefineWork(work2d, COMMAND_MAX, GOUR_TBL_MAX,
                                 LOOKUP_TBL_MAX, CHAR_MAX, DRAW_PRTY_MAX)
                                       /*     2Dワークエリア定義           */
#define OBJ_SURF_MAX       16          /*     オブジェクト内最大面数          */
#define OBJ_VERT_MAX       16          /*     オブジェクト内最大頂点数         */
SPR_3DefineWork(work3d, OBJ_SURF_MAX, OBJ_VERT_MAX)
                                       /*     3D表示ワークエリア定義         */

extern void vbStart(void);             /*     V-BLANK IN割り込みルーチン         */
extern void vbEnd(void);               /*     V-BLANK OUT割り込みルーチン        */ 
main()
{
     set_imask(0);                     /*     割り込み可にします                 */

     SCL_Vdp2Init();                   /*     スクロールとプライオリティの初期化  */
     SCL_SetPriority(SCL_SP0|SCL_SP1|SCL_SP2|SCL_SP3|SCL_SP4|
                              SCL_SP5|SCL_SP6|SCL_SP7,7);
     SCL_SetSpriteMode(SCL_TYPE1,SCL_MIX,SCL_SP_WINDOW);

     SPR_2Initial(&work2d);            /*     2Dスプライト表示初期化             */

     SPR_3Initial(&work3d);            /*     3Dスプライト表示初期化             */

     INT_ChgMsk(INT_MSK_NULL, INT_MSK_VBL_IN | INT_MSK_VBL_OUT);
                                       /*     V-BLANK割り込みをディセーブル      */
     INT_SetFunc(INT_SCU_VBLK_IN, &vbStart);
                                       /*     V-BLANK IN割り込みルーチンの登録   */
     INT_SetFunc(INT_SCU_VBLK_OUT, &vbEnd);
                                       /*     V-BLANK OUT割り込みルーチンの登録  */
     INT_ChgMsk( INT_MSK_VBL_IN | INT_MSK_VBL_OUT, INT_MSK_NULL);
                                       /*     V-BLANK割り込みをイネーブル        */

     SPR_2FrameChgIntr(0xffff);        /*     フレームチェンジインターバルを不定  */
                                       /*     モードにセット            */

     SPR_3SetTexture(texture);         /*     3D用テクスチャデータのセット     */

     for(;;) {
           ---------------             /*     スクロールデータセット        */

          SPR_3SetLight(...);          /*     3D光源のセット                  */
          SPR_3SetView(...);           /*     3D視点のセット                  */

          SPR_2OpenCommand(SPR_2DRAW_PRTY_ON); 
                                       /*     スプライトコマンド書き込みのオープン*/
          SPR_2SysClip(SPR_2MOST_FAR,&xy);
                                       /*     システムクリップエリアコマンド    */
          SPR_2LocalCoord(SPR_2MOST_FAR,&xy); 
                                       /*     ローカル座標コマンド               */

          SPR_3moveCluster(model0,...);/*     3Dモデル0のルートクラスタを移動   */
          SPR_3DrawModel(model0,...);  /*     3Dモデル0の登録           */

          SPR_3moveCluster(model1,...);/*     3Dモデル1のルートクラスタを移動   */
          SPR_3DrawModel(model1,...);  /*     3Dモデル1の登録           */
                            .
                            .
                            .
          SPR_3Flush();                /*     3Dスプライトコマンドセット      */
          SPR_2CloseCommand();         /*     スプライトコマンド書き込みのクローズ*/
          SCL_DisplayFrame();          /*     V-BLANK割り込みを待ち、         */
                                       /*     スプライト表示とスクロール動作を行う*/
      }
}

−Vブランク処理ルーチン(上記メインとは別ソースファイル)−

#include <machine.h>
#include "sega_spr.h"
#include "sega_scl.h"

#pragma  interrupt(VbStart)
#pragma  interrupt(VbEnd)

void VbStart(void)
{
     SCL_VblankStart();           /*     Vブランク開始VDP割り込み処理              */
     --------                     /*     その他Vブランク開始処理                  */
 }

void VbEnd(void)
{
     SCL_VblankEnd();            /*     Vブランク終了VDP割り込み処理              */
      --------                    /*     その他Vブランク終了処理                 */
}

 スプライト3D表示ライブラリの視点座標系におけるポリゴンのZソートはVDP1拡張処理ライブラリ(2Dライブラリ)のスプライトコマンドプライオリティ描画機能を用いて行うので、ポリゴンのZソートを行うには SPR_2OpenCommand() ルーチンでプライオリティ描画オン(SPR_2DRAW_PRTY_ON)にする必要があります。

3.4 オブジェクト間接続ポリゴンオブジェクト

 下図のようにObject1の動きに合わせObject2を変形させて表示したい場合に、Object0とObject1の間のポリゴンであるObject2をオブジェクト間接続ポリゴンオブジェクトとして定義することで自動的に変形描画ができます。

 クラスタ、オブジェクト、オブジェクト間接続ポリゴン情報の各テーブルは以下のように接続します。

                  Child                  
┌──────────────────┐ ┌──────────────────┐
│     Cluster0     │→│     Cluster1     │
└──────────────────┘ └──────────────────┘
     :         :          :         :    
     ↓         ↓          ↓         ↓    
┌─────────┐┌───────┐ ┌─────────┐┌───────┐
│InbetInf0││Object0│ │InbetInf1││Object1│
└─────────┘└───────┘ └─────────┘└───────┘
                                    :    
                                    ↓    
                                ┌───────┐
                                │Object2│
                                └───────┘

 [オブジェクト間接続ポリゴンオブジェクトの処理]

  1. オブジェクトの描画順番は、親クラスタから子クラスタの順に描画され、クラスタに複数のオブジェクトが接続されている場合は接続順に描画されます。
    前記例では、Object0, Object1, Object2の順に描画されます。

  2. 描画の際、クラスタにオブジェクト間接続ポリゴン情報が接続されていた場合に、視点座標系への座標変換済み頂点データを指定テーブルに従い、対応するオブジェクト間接続ポリゴンオブジェクトの頂点データテーブルに設定します。
    グーローシェーディングありの場合は、オブジェクト間接続ポリゴンオブジェクトの頂点法線データテーブルに計算済み頂点輝度を設定します。
    前記例では、InbetInf0がObject0の視点座標系頂点データ(0,1,2,3)をObject2の頂点データ(4,5,6,7)に設定し、InbetInf1がObject1の視点座標系頂点データ(4,5,6,7)をObject2の頂点データ(0,1,2,3)に設定します。

  3. 描画オブジェクトがオブジェクト間接続ポリゴンオブジェクトの場合、視点座標系への変換済み頂点より各面の法線ベクトルを求め、描画モードに従い描画します。
    前記例では、Object2がオブジェクト間接続ポリゴンオブジェクトです。

  4. オブジェクト間接続ポリゴンオブジェクトの設定条件

    • クラスタに複数のオブジェクトの1つとして接続する場合は、オブジェクトチェインの最後に接続します。

    • オブジェクトテーブル内の面法線ベクトルの計算補正値はマイナス値として設定します。


戻る進む
PROGRAMMER'S GUIDEVDP1ライブラリ
Copyright SEGA ENTERPRISES, LTD., 1997