Самоучитель по 3dsmax 7

         

Так что наиболее подходящий метод выбирайте сами


Так что наиболее подходящий метод выбирайте сами.

В завершение осталось только привести процедуру для отсечения полигона произвольной плоскостью: // вычитание векторов float vecsub(vertex *result, vertex a, vertex b) { result->x = a.x - b.x; result->y = a.y - b.y; result->z = a.z - b.z; } // скалярное умножение векторов float vecmul(vertex a, vertex b) { return a.x * b.x + a.y * b.y + a.z * c.z; } // dst - массив для сохранения вершин результата // src - массив вершин исходного полигона // num - число вершин исходного полигона // n - нормаль к плоскости // o - точка, лежащая в плоскости // функция возвращает число вершин результата int clipPlane(vertex *dst, vertex *src, int num, vertex n, vertex o) { int i, r; vertex p1, p2, tmp; float t1, t2; float k; r = 0; for (i = 0; i < num; i++) { p1 = src[i]; p2 = src[(i + 1) % num]; vecsub(&tmp, p1, o); t1 = vecmul(tmp, n); vecsub(&tmp, p2, o); t2 = vecmul(tmp, n); if (t1 >= 0) { // если начало лежит в области dst[r++] = p1; // добавляем начало } // если ребро пересекает границу // добавляем точку пересечения if (((t1 > 0) && (t2 < 0)) || ((t2 >= 0) && (t1 < 0))) { k = 1 - vecmul(p1, n) / vecmul(p2, n); dst[r].x = p1.x + k * (p2.x - p1.x); dst[r].y = p1.y + k * (p2.y - p1.y); dst[r].z = p1.z + k * (p2.z - p1.z); dst[r].u = p1.u + k * (p2.u - p1.u); dst[r].v = p1.v + k * (p2.v - p1.v); r++; } } return r; }

Содержание раздела