three-stdlib
Version:
stand-alone library of threejs examples
65 lines (64 loc) • 2.13 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const THREE = require("three");
class ParametricGeometry extends THREE.BufferGeometry {
constructor(func = (u, v, target) => target.set(u, v, Math.cos(u) * Math.sin(v)), slices = 8, stacks = 8) {
super();
this.type = "ParametricGeometry";
this.parameters = {
func,
slices,
stacks
};
const indices = [];
const vertices = [];
const normals = [];
const uvs = [];
const EPS = 1e-5;
const normal = new THREE.Vector3();
const p0 = new THREE.Vector3(), p1 = new THREE.Vector3();
const pu = new THREE.Vector3(), pv = new THREE.Vector3();
const sliceCount = slices + 1;
for (let i = 0; i <= stacks; i++) {
const v = i / stacks;
for (let j = 0; j <= slices; j++) {
const u = j / slices;
func(u, v, p0);
vertices.push(p0.x, p0.y, p0.z);
if (u - EPS >= 0) {
func(u - EPS, v, p1);
pu.subVectors(p0, p1);
} else {
func(u + EPS, v, p1);
pu.subVectors(p1, p0);
}
if (v - EPS >= 0) {
func(u, v - EPS, p1);
pv.subVectors(p0, p1);
} else {
func(u, v + EPS, p1);
pv.subVectors(p1, p0);
}
normal.crossVectors(pu, pv).normalize();
normals.push(normal.x, normal.y, normal.z);
uvs.push(u, v);
}
}
for (let i = 0; i < stacks; i++) {
for (let j = 0; j < slices; j++) {
const a = i * sliceCount + j;
const b = i * sliceCount + j + 1;
const c = (i + 1) * sliceCount + j + 1;
const d = (i + 1) * sliceCount + j;
indices.push(a, b, d);
indices.push(b, c, d);
}
}
this.setIndex(indices);
this.setAttribute("position", new THREE.Float32BufferAttribute(vertices, 3));
this.setAttribute("normal", new THREE.Float32BufferAttribute(normals, 3));
this.setAttribute("uv", new THREE.Float32BufferAttribute(uvs, 2));
}
}
exports.ParametricGeometry = ParametricGeometry;
//# sourceMappingURL=ParametricGeometry.cjs.map
;