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




Создание фигур - часть 14


Давайте посмотрим, как работает функция C3dShape::CreateRSolid. Приведенный ниже фрагмент взят из библиотеки 3dPlus:

// Создание тел вращения

BOOL CBdShape::CreateRSolid(double zl, double z2, double dz, BOOL bClosedl, BOOL bClosed2, SOLIDRFN pfnRad, void* pArg, int nFacets) (

New () ;

ASSERT(pfnRad) ;

ASSERT(dz != 0) ;

int iZSteps = (int)((z2 - zl) / dz);

if (iZSteps « 1) return FALSE;

int iRSteps = nFacets;

if (iRSteps « 8) iRSteps = 8;

double da = _twopi / iRSteps;

// Создать массив для вершин int iVertices °= (iZSteps + 1) * iRSteps;

D3DVECTOR* Vertices = new D3DVECTOR [iVertices];

D3DVECTOR* pv - Vertices;

// Создать массив для данных граней.

// Каждая грань имеет 4 вершины, за исключением торцов.

int iFaces = iZSteps * iRSteps;

int iFaceEntries = iFaces * 5 + 1;

if (bClosedl) iFaceEntries += iRSteps + 1;

if (bClosed2) iFaceEntries += iRSteps + 1;

int* FaceData = new int [iFaceEntries] ;

int* pfd = FaceData;

// Заполнить координаты вершин double z = zl;

/b> ¦¦¦¦1' Глава 4. Создание фигур

double r, a;

for (int iZ = 0; iZ «= iZSteps; iZ++) { r = pfnRadfz, pArg) ;

a = 0;

for (int iR = 0; iR « iRSteps; iR++) {

pv-»x = D3DVAL(r * sin(a));

pv-»y = D3DVAL(r * cos(a));

pv-»z = D3DVAL(z) ;

pv++;

a += da;

} z += dz;

}

// Заполнить список граней

int iFirst = iRSteps;

for (iZ = 0; iZ « iZSteps; iZ++) {

for (int iR = 0; iR « iRSteps; iR++) {

*pfd++ =4; //No. of vertices per face

*pfd++ = iFirst + iR;

*pfd++ = iFirst + ((iR + 1) % iRSteps);

*pfd++ = iFirst - iRSteps +

((iR + 1) % iRSteps) ;

*pfd++ = iFirst - iRSteps + iR;

} iFirst += iRSteps;

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

// Создать круговую поверхность с автоматической // генерацией нормалей

BOOL b = Create(Vertices, iVertices, NULL, 0, FaceData, TRUE) ;

delete [] FaceData;

FaceData = new int [iRSteps * 2 + 2] ;

D3DVECTOR nvect [] = { {0, 0, 1}, {О, 0, -1}

};

if (bClosedl) { pfd = FaceData;

*pfd++ = iRSteps;

for (int iR = 0; iR « iRSteps; iR++) (

*pfd++ = iR;

*pfd++ = 1;




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