[ログ・ページ/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(手持ち武器)