По сути, стратегия состоит в том, чтобы развернуть профиль, заданный пользователем, вокруг заданной оси и сгенерировать серию треугольных полос, соединяющих смежные слои.
Предположим, что пользователь нарисовал многоугольник в плоскости XZ.Далее, предположим, что пользователь намеревается развернуться вокруг оси Z (т. Е. Линии X = 0), чтобы создать тело вращения, и что один край многоугольника лежит на этой оси (вы можете обобщить позже, когда у вас будет этот упрощенный случайрабочий).
Для достаточно простой геометрии вы можете рассматривать периметр многоугольника как функцию x = f (z), то есть предположить, что для каждого значения Z существует уникальное значение X.Когда мы переходим в 3D, эта функция становится r = f (z), то есть радиус уникален по длине объекта.
Теперь предположим, что мы хотим приблизить тело с M "кусочками"каждый охват 2 * пи / м радиан.Мы также будем использовать N «стеков» (выборок в Z-измерении).Для каждого такого среза мы можем построить треугольную полосу, соединяющую точки на одном срезе (i) с точками на срезе (i + 1).Вот некоторый псевдо-код, описывающий процесс:
double dTheta = 2.0 * pi / M;
double dZ = (zMax - zMin) / N;
// Iterate over "slices"
for (int i = 0; i < M; ++i) {
double theta = i * dTheta;
double theta_next = (i+1) * dTheta;
// Iterate over "stacks":
for (int j = 0; j <= N; ++j) {
double z = zMin + i * dZ;
// Get cross-sectional radius at this Z location from your 2D model (was the
// X coordinate in the 2D polygon):
double r = f(z); // See above definition
// Convert 2D to 3D by sweeping by angle represented by this slice:
double x = r * cos(theta);
double y = r * sin(theta);
// Get coordinates of next slice over so we can join them with a triangle strip:
double xNext = r * cos(theta_next);
double yNext = r * sin(theta_next);
// Add these two points to your triangle strip (heavy pseudocode):
strip.AddPoint(x, y, z);
strip.AddPoint(xNext, yNext, z);
}
}
Это основная идея.Как сказал sje697, вам, возможно, потребуется добавить заглушки, чтобы сохранить геометрию закрытой (т. Е. Твердый объект, а не оболочка).Но это должно дать вам достаточно, чтобы вы пошли.Это можно легко обобщить и на тороидальные формы (хотя в этом случае у вас не будет взаимно-однозначной функции r = f (z)).