actorGeomС актером связано довольно много при работе с МоКапом. ? если ставить эксперименты, то может понадобится вовсе собрать например своего актера. О сборке альтернативного актера я расскажу чуть позже, сейчас поделюсь как извлечь геометрию частей тела актера в отдельный файл и как потом это все рисовать в виде отдельного объекта.

?звлечение геометрии

Ниже представлен код по извлечению геометрии объекта и записи в отдельный файл (с именем этого объекта и расширением *.msh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
FBModelList lModelList;

FBGetSelectedModels( lModelList );

for (int model=0; modelName );

FBGeometry lGeom(lActorModel);

FBMesh lMesh(lActorModel);

FBString strFileName("C:\\");

strFileName = strFileName + lActorModel->Name;

strFileName = strFileName + ".msh";

FILE *f = fopen( strFileName, "w" );

if (f == NULL) return;

fseek(f, 0, 0);

fprintf(f, "01\n" ); // file version

fprintf(f, "%s\n", (char*) lActorModel->Name );

// extract geometry (vertices)

FBVertex vertex;

FBNormal normal;

fprintf(f, "%d\n", lGeom.VertexCount() );

for (int i=0; i

{

vertex = lGeom.VertexGet(i);

normal = lGeom.VertexNormalGet(i);

fprintf( f, "%f %f %f\n", vertex[0], vertex[1], vertex[2] );

fprintf( f, "%f %f %f\n", normal[0], normal[1], normal[2] );

}

// extract mesh (polygons)

fprintf( f, "%d\n", lMesh.PolygonCount() );

for (int i=0; i

{

fprintf( f, "%d\n", lMesh.PolygonVertexCount(i) );

for (int j=0; j

fprintf( f, "%d\n", lMesh.PolygonVertexIndex(i, j) );

}

fclose(f);

}

Несколько уточнений к приложенному выше алгоритму:

1) прежде всего мы получаем список выделенных объектов в сцене и затем запускаем главный цикл по каждому такому объекту

1
2
3
4
5
6
7
8
9
FBModelList lModelList;

FBGetSelectedModels( lModelList );

for (int model=0; modelName );

FBGeometry lGeom(lActorModel);

FBMesh lMesh(lActorModel);

3) класс FBGeometry дает нам информацию о наборе вершин каркаса

lGeom.VertexCount() — общее количество вершин

lGeom.VertexGet(i) — возвращает вершину с индексом i

lGeom.VertexNormalGet(i) — возвращает нормаль для вершины с индексом i

4) класс FBMesh дает нам информацию о наборе полигонов каркаса

lMesh.PolygonCount() — общее количество полигонов на каркас

lMesh.PolygonVertexCount(i) — количество вершин в полигоне с индексом i

lMesh.PolygonVertexIndex(i, j)  — индекс j-й вершины полигона с индексом i

Модель с геометрией

Теперь для того чтобы отрисовать свою модель с геометрией актера, привожу код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
HFBModel pModel = new FBModel (mBodyName);

FBString fileName("c:\\actor\\");

fileName = fileName + (char*)mBodyName;

fileName = fileName + ".msh";

FILE *f = fopen( fileName, "r" );

if (f == NULL) return;

fseek( f, 0, 0 );

HFBGeometry lGeom =  pModel->Geometry;

HFBMesh< pMesh = (HFBMesh) lGeom; if (!pMesh) { FBMesh lMesh(pModel); pMesh = &lMesh; } char buffer[2048]; int count; memset(buffer,0,sizeof(char)*2048); fgets(buffer, 2048, f); // check file version if ( (buffer[0] != '0') || (buffer[1] != '1') ) return; // skip fgets(buffer, 2048, f); // mesh name memset(buffer,0,sizeof(char)*2048); fgets( buffer, 2048, f ); sscanf( buffer, "%d", &count ); bool res; res = pMesh->GeometryBegin();

pMesh->VertexInit(count);

// step 1: create vertices

float x,y,z,  p,q,w;

for (int i=0; iVertexNormalSet( (double)p, (double)q, (double)w, i );

pMesh->VertexSet( (double)x, (double)y, (double)z, i );

}

// step 2: create polygons

int ndx, pCount=0;

memset(buffer,0,sizeof(char)*2048);

fgets( buffer, 2048, f );

sscanf( buffer, "%d", &count );

for (int i=0; iPolygonBegin();

for (int j=0; jPolygonVertexAdd(ndx);

}

pMesh->PolygonEnd();

}

pMesh->GeometryEnd();

pModel->Show = true;

pModel->ResetDisplayList();

Теперь некоторые пояснения по вышеприложенному коду:

1) создается новая пустая модель в сцене довольно просто

1
HFBModel pModel = new FBModel (mBodyName);

где mBodyName — имя модели

2) ?значально модель не содержит геометрический каркас, поэтому его нужно назначить

1
2
3
FBMesh lMesh(pModel);

pMesh = &lMesh;

Тем самым мы создали для модели новый каркас геометрии и его можно заполнять данными по вершинам, нормалям и полигонам.

3) В конце работы с геометрией и моделью важно эту модель показать и обновить дисплейные списки, иначе ничего в сцене не увидим

1
2
3
pModel->Show = true;

pModel->ResetDisplayList();

Вот собственно и все на сегодня, до новых встреч!

?звлечение геометрии актера
Метки:                

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *