2023-11-30 19:31:13 +03:00
|
|
|
import * as THREE from 'three';
|
2023-12-07 12:56:12 +03:00
|
|
|
import { FontLoader } from 'three/addons/loaders/FontLoader.js';
|
|
|
|
import { TextGeometry } from 'three/addons/geometries/TextGeometry.js';
|
2023-11-30 19:31:13 +03:00
|
|
|
|
2023-12-07 12:56:12 +03:00
|
|
|
const calculateSpiralGeometry = (spiralHeight) => {
|
2023-11-30 19:31:13 +03:00
|
|
|
let pointsOfCurve = [];
|
2023-12-07 12:56:12 +03:00
|
|
|
const number = 1000;
|
|
|
|
for (let i = 0; i <= number; i++) {
|
2023-11-30 19:31:13 +03:00
|
|
|
let p = i / number;
|
|
|
|
|
|
|
|
let x = Math.cos(p * 2 * Math.PI);
|
|
|
|
let y = p * spiralHeight;
|
|
|
|
let z = Math.sin(p * 2 * Math.PI);
|
|
|
|
|
|
|
|
pointsOfCurve.push(new THREE.Vector3(x, y, z));
|
|
|
|
}
|
|
|
|
|
|
|
|
let curve = new THREE.CatmullRomCurve3(pointsOfCurve);
|
2023-12-07 12:56:12 +03:00
|
|
|
return new THREE.TubeGeometry(curve, 400, 0.1, 900, false);
|
|
|
|
};
|
2023-11-30 19:31:13 +03:00
|
|
|
|
2023-12-07 12:56:12 +03:00
|
|
|
const loader = new FontLoader();
|
|
|
|
|
|
|
|
const loadFont = () => {
|
|
|
|
let resolve, reject;
|
|
|
|
let promise = new Promise((res, rej) => {
|
|
|
|
resolve = res;
|
|
|
|
reject = rej;
|
|
|
|
});
|
|
|
|
loader.load('fonts/helvetiker_regular.typeface.json', (font) => {
|
|
|
|
resolve(font);
|
|
|
|
}, () => {}, (error) => {reject(error)})
|
|
|
|
return promise;
|
|
|
|
};
|
|
|
|
|
|
|
|
const font = await loadFont();
|
|
|
|
const calculateTextGeometry = (string) => {
|
|
|
|
return new TextGeometry(string, {
|
|
|
|
font,
|
|
|
|
size: 0.5,
|
|
|
|
height: 0.2,
|
|
|
|
curveSegments: 6,
|
|
|
|
bevelEnabled: true,
|
|
|
|
bevelThickness: 0.03,
|
|
|
|
bevelSize: 0.02,
|
|
|
|
bevelOffset: 0,
|
|
|
|
bevelSegments: 4
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const spiralGeometry = calculateSpiralGeometry(2)
|
2023-12-05 03:17:38 +03:00
|
|
|
|
2023-11-30 19:31:13 +03:00
|
|
|
export class SpiralSegment {
|
2023-12-05 03:17:38 +03:00
|
|
|
constructor(year, height, material) {
|
|
|
|
this.year = year;
|
2023-12-07 12:56:12 +03:00
|
|
|
this.segment = new THREE.Mesh(spiralGeometry, material);
|
|
|
|
this.text = new THREE.Mesh(calculateTextGeometry(`${this.year}`), material);
|
2023-11-30 19:31:13 +03:00
|
|
|
}
|
|
|
|
|
2023-12-07 12:56:12 +03:00
|
|
|
getSegment() {
|
|
|
|
return this.segment;
|
2023-11-30 19:31:13 +03:00
|
|
|
}
|
2023-12-07 12:56:12 +03:00
|
|
|
|
|
|
|
getText() {
|
|
|
|
return this.text;
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|