ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX



Перемещение объектов - часть 14


Относитепьное лвижймий Ш^ 151

ся какие-то странные треугольные ячейки. Разумеется, за пять минут работы с Autodesk 3D Studio можно было бы создать идеальные шестеренки и без этого кода:

CGear::CGear(double r, double t, int teeth)

{

double twopi = 6.28318530718;

double rl = r - 0.3;

double r2 = r + 0.3;

int nFaceVert = teeth * 4;

int nVert = nFaceVert * 2;

D3DVECTOR* Vertices = new D3DVECTOR[nVert];

D3DVECTOR* pv = Vertices;

double da = twopi / (teeth * 4);

double a = 0;

for (int i = 0; i « teeth; i++) {

pv-»x = rl * cos(a);

pv-»y = rl * sin(a);

pv-»z = 0;

pv++;

a += da ;

pv-»x = r2 * cos (a) ;

pv-»y = r2 * sin(a);

pv-»z = 0;

pv++;

a += da;

pv-»x = r2 * cos(a);

pv-»y = r2 * sin(a);

pv-»z = 0;

pv++;

a += da;

pv-»x = rl * cos(a);

pv-»y = rl * sin(a);

pv-»z = 0;

pv++ ;

a += da;

}

pv = Vertices;

D3DVECTOR* pv2 = SVertices[nFaceVert] ;

for (i = 0; i « nFaceVert; i++) {

*pv2 = *pv;

pv2-»z = t;

pv++;

pv2++;

}

// Сгенерировать данные граней для зубцов.

// Нервных просят не смотреть!

int nf = (teeth * 5 * 4) + (teeth * 26) + 10;

/b>

Глава 6. Перемещение объектов в макете

int* FaceData = new int[nf] ;

int* pfd = FaceData;

for (i = 0; i « teeth*4; i++) {

*pfd++ = 4;

*pfd++ = i;

*pfd++ = (i + 1) % (teeth*4);

*pfd++ = nFaceVert + ((i + 1) % (teeth*4));

*pfd++ = nFaceVert + (i % (teeth*4));

}

// Завершить список *pfd++ = 0;

Create(Vertices, nVert, NULL, 0, FaceData, TRUE);

// Добавить торцевые грани с заданием нормалей D3DVECTOR nvect [] = {

(О, 0, 1},

(О, 0, -1} };

delete [] FaceData;

FaceData = new int [teeth * 9 + teeth * 4 + 10] ;

pfd = FaceData;

for (1=0; i « teeth; i++) {

*pfd++ = 4;

*pfd++ = i*4;

*pfd++ = 1;

*pfd++ = i*4+3;

*pfd++ = 1;

*pfd++ = i*4+2;

*pfd++ = 1;

*pfd++ = i*4+l;

*pfd++ = 1;

}

*pfd++ = teeth*2;

for (i = teeth-1; i »= 0; i-) {

*pfd++ = i*4+3;

*pfd++ = 1;

*pfd++ = i*4;

*pfd++ = 1;

}

*pfd++ = 0;

AddFaces(Vertices, nVert, nvect, 2, FaceData);

pfd = FaceData;

for (i = 0; i « teeth; i++) {




Содержание  Назад  Вперед