Параметрические поверхности позволяют описывать сложные 3D-объекты с
помощью функций, задающих координаты точек через два параметра (u) и
(v). В Three.js для их создания используется класс
THREE.ParametricGeometry (или
THREE.ParametricBufferGeometry в современных версиях),
который принимает функцию параметризации и количество сегментов по
параметрам.
const geometry = new THREE.ParametricBufferGeometry(func, slices, stacks);
func(u, v, target) — функция,
задающая координаты точки на поверхности.
u и v — значения параметров в диапазоне
[0, 1].target — объект типа THREE.Vector3, в
который записываются координаты точки.slices — количество сегментов по
оси u.
stacks — количество сегментов по
оси v.
Пример функции для плоскости:
function plane(u, v, target) {
const width = 10;
const height = 10;
target.set((u - 0.5) * width, (v - 0.5) * height, 0);
}
const geometry = new THREE.ParametricBufferGeometry(plane, 20, 20);
u и v нормализованы. Любое
преобразование к нужному диапазону выполняется внутри функции.target, а
не через return. Это повышает производительность за счет
прямой работы с буферами.Параметрические поверхности позволяют строить различные формы: цилиндры, сферы, тора, Möbius-полосы и произвольные математические поверхности.
function sphere(u, v, target) {
const radius = 5;
const theta = u * Math.PI * 2;
const phi = v * Math.PI;
const x = radius * Math.sin(phi) * Math.cos(theta);
const y = radius * Math.sin(phi) * Math.sin(theta);
const z = radius * Math.cos(phi);
target.set(x, y, z);
}
const sphereGeometry = new THREE.ParametricBufferGeometry(sphere, 32, 16);
function torus(u, v, target) {
const R = 5; // радиус тора
const r = 2; // радиус трубки
const theta = u * Math.PI * 2;
const phi = v * Math.PI * 2;
const x = (R + r * Math.cos(phi)) * Math.cos(theta);
const y = (R + r * Math.cos(phi)) * Math.sin(theta);
const z = r * Math.sin(phi);
target.set(x, y, z);
}
const torusGeometry = new THREE.ParametricBufferGeometry(torus, 64, 32);
Параметрические геометрии можно использовать с любыми материалами Three.js:
const material = new THREE.MeshStandardMaterial({
color: 0x3399ff,
side: THREE.DoubleSide,
wireframe: false
});
const mesh = new THREE.Mesh(sphereGeometry, material);
scene.add(mesh);
Для визуализации сетки параметрической поверхности удобно
использовать THREE.WireframeGeometry:
const wireframe = new THREE.WireframeGeometry(sphereGeometry);
const line = new THREE.LineSegments(wireframe, new THREE.LineBasicMaterial({ color: 0xffffff }));
scene.add(line);
Параметрические поверхности легко анимировать, изменяя параметры функции в каждом кадре. Например, можно создавать “волны” на плоскости:
function wave(u, v, target, time) {
const x = (u - 0.5) * 10;
const y = (v - 0.5) * 10;
const z = Math.sin((u + time) * 5) * Math.cos((v + time) * 5);
target.set(x, y, z);
}
// Обновление геометрии в анимационном цикле
geometry.attributes.position.needsUpdate = true;
Для этого потребуется обновлять буферы позиции и
вызывать geometry.computeVertexNormals() при необходимости
пересчета нормалей для корректного освещения.
slices и
stacks сверх необходимого, иначе производительность
падает.InstancedMesh позволяет
рендерить множество копий параметрических объектов без дополнительной
нагрузки на CPU.Параметрические поверхности можно интегрировать с Three.js helperами, такими как OrbitControls для управления камерой, dat.GUI для изменения параметров времени или радиусов в реальном времени. Это позволяет создавать интерактивные учебные и визуализационные приложения.
Понимание принципов параметрических поверхностей обеспечивает гибкость при создании любых форм: от простых плоскостей и сфер до сложных научных моделей и анимаций.