}
Тела вращения тЩ^ 109
*pfd = 0;
m_hr = m_pIMeshBld-»AddFaces(iVertices, Vertices, 2, nvect,
ULONG*)FaceData, NULL) ;
ASSERT(SUCCEEDED(m_hr)) ;
}
if (bClosed2) { pfd = FaceData;
*pfd++ = iRSteps;
iFirst = iRSteps * iZSteps;
for (int iR = 0; iR « iRSteps; iR++) (
*pfd++ = iRSteps - 1 - iR + iFirst;
*pfd++ = 0;
}
*pfd = 0;
m hr = m pIMeshBld-»AddFaces (iVertices, Vertices, 2, nvect,
(ULONG*)FaceData, NULL) ;
ASSERT(SUCCEEDED(m_hr)) ;
}
delete [] Vertices;
delete [] FaceData;
m strMame = "Solid of revolution";
return b;
}
На первом этапе, после выполнения инициализации, по функции радиуса заполняется список вершин. Затем генерируются данные боковых граней и создается исходная форма. Если при вызове функции были заданы замкнутые концы фигуры, создается новый набор данных для граней-торцов, однако на этот раз с нормалями, управляющими процессом закраски, чтобы торцы фигуры казались плоскими. Новые грани добавляются к существующей фигуре.
Возможно, вы обратили внимание на то, что фигуре присваивается имя (в данном случае — Solid of Revolution, хранящееся в переменной m_strName). Когда мы будем заниматься выбором объектов в макете, имя сообщит пользователю, какая фигура выбрана им в настоящий момент.
Мы очень кратко пробежались по большому фрагменту программы, и у вас наверняка осталось много вопросов по поводу его работы и назначению отдельных функций. Если вы хотите понять, как устроена функция CreateRSolid, возьмите лист бумаги в клетку, сверните его в трубку и затем представьте себе, что вам потребовалось описать каждое продольное ребро и каждую грань этой решетки. Именно это и происходит в приведенном выше фрагменте, а эксперимент с трубкой описывает мой подход к его написанию. Во фрагменте присутствуют несколько вызовов функции интерфейсов DirecQD, назначение которых можно узнать в документации по DirectX 2 SDK. Заодно найдите в SDK макрос D3DVAL и посмотрите, что он делает.
/b> ЩЦУ Глава 4. Создание фигур
В главе 5 мы научимся преобразовывать фигуры, применяя к ним операции вращения, переноса и масштабирования. После прочтения этой главы можете модифицировать функцию CreateRSolid так, чтобы при ее вызове можно было бы задать координаты конечных точек фигуры — функция станет более полезной.