ログ・ページ/y04/後期PS2班/2007-02-03

ログ・ページ/y04/後期PS2班/2007-02-03

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

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

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

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

# ノードとなる構造体

1
2
3
4
5
6
7
typedef struct part {
   OBJECT *obj;
   struct part *next;
   struct part *parent, *child;
   int    model;
   int    col_d;  //当たり判定
} Part, *PartPtr;

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

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

# ツリーの操作

  • ノードの生成
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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)を引数として受け取る。

  • 子の追加
1
2
3
4
5
6
7
void insert_child (PartPtr parent, PartPtr child)
{
   if (parent && child){
       parent->child = child;
       child->parent = parent;
   }
}
  • 兄弟の追加
1
2
3
4
5
6
7
void insert_brother (PartPtr old, PartPtr young)
{
   if (old && young){
       old->next = young;
       young->parent = old->parent;
   }
}
  • 子の削除
1
2
3
4
5
6
void delete_child (PartPtr parent)
{
   if (parent){
       parent->child = NULL;
   }
}
  • 兄弟の削除
1
2
3
4
5
6
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(手持ち武器)
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy