spiral_calendar/view/spiral.js

69 lines
1.8 KiB
JavaScript
Raw Normal View History

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;
2024-01-24 20:03:41 +03:00
let x = 5*Math.cos(p * 2 * Math.PI);
let y = 1 * p * spiralHeight;
let z = 5*Math.sin(p * 2 * Math.PI);
2023-11-30 19:31:13 +03:00
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)
2024-01-29 00:57:46 +03:00
// spiralGeometry.setAttribute('position', new THREE.BufferAttribute( linePositions, 3 ));
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;
}
};