ログ・ページ/y04/後期PS2班?

2006年中に行ったこと その2 (編集者:045719B 小野裕作)

PS2上への人型キャラクターの表示

キャラクターを表示し、歩行などの動作を行わせる場合にはキャラクターを部位毎(胴体、腕など)に分けてXMLファイルを作成し、ツリー構造を用いることで一つのモデルとして表示する。

ノードとなる構造体

typedef struct part {
   OBJECT *obj;
   struct part *next;
   struct part *parent, *child;
   int    model;
   int    col_d;  //当たり判定
} Part, *PartPtr;

next はこのノードと同階層にあるノード(兄弟)のうち、このノードの次に生成されたノードを指す。

model はこのノードがキャラクターのどの部位なのかを示す。

ツリーの操作

  • ノードの生成
    PartPtr create_node (char *objName, int m)
    {
       PartPtr new;
       void *free_addr;
    
       malloc_align16(&free_addr, &new, sizeof(Part));
       if (new == NULL){
           return NULL;
       }
    
       new->obj = ps2util_obj_Create_fromXML (objName);
       new->next = NULL;
       new->parent = NULL;
       new->child = NULL;
       new->model = m;
    
       return new;
    }

XMLファイル名(objName)と部位を示す値(m)を引数として受け取る。

  • 子の追加
    void insert_child (PartPtr parent, PartPtr child)
    {
       if (parent && child){
           parent->child = child;
           child->parent = parent;
       }
    }
  • 兄弟の追加
    void insert_brother (PartPtr old, PartPtr young)
    {
       if (old && young){
           old->next = young;
           young->parent = old->parent;
       }
    }
  • 子の削除
    void delete_child (PartPtr parent)
    {
       if (parent){
           parent->child = NULL;
       }
    }
  • 兄弟の削除
    void delete_brother (PartPtr old) 
    {
       if (old) {
           old->next = NULL;
       }
    }

部位の種類

今回作成した部位のうち、各キャラクターに共通するものを以下に示す。

  • body(胴体)
  • waist(腰)
  • r_arm(二の腕:右)
  • r_arm2(腕:右)
  • l_arm(二の腕:左)
  • l_arm2(腕:左)
  • r_leg(太もも:右)
  • r_leg2(膝から足まで:右)
  • l_leg(太もも:左)
  • l_leg2(膝から足まで:左)
  • saber(手持ち武器)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-03-10 (土) 18:37:42 (2827d)