1 line
25 KiB
Plaintext
1 line
25 KiB
Plaintext
|
|
{"version":3,"file":"RollerCoaster.cjs","sources":["../../src/misc/RollerCoaster.js"],"sourcesContent":["import { BufferAttribute, BufferGeometry, Color, Quaternion, Raycaster, Vector3 } from 'three'\n\nclass RollerCoasterGeometry extends BufferGeometry {\n constructor(curve, divisions) {\n super()\n\n const vertices = []\n const normals = []\n const colors = []\n\n const color1 = [1, 1, 1]\n const color2 = [1, 1, 0]\n\n const up = new Vector3(0, 1, 0)\n const forward = new Vector3()\n const right = new Vector3()\n\n const quaternion = new Quaternion()\n const prevQuaternion = new Quaternion()\n prevQuaternion.setFromAxisAngle(up, Math.PI / 2)\n\n const point = new Vector3()\n const prevPoint = new Vector3()\n prevPoint.copy(curve.getPointAt(0))\n\n // shapes\n\n const step = [\n new Vector3(-0.225, 0, 0),\n new Vector3(0, -0.05, 0),\n new Vector3(0, -0.175, 0),\n\n new Vector3(0, -0.05, 0),\n new Vector3(0.225, 0, 0),\n new Vector3(0, -0.175, 0),\n ]\n\n const PI2 = Math.PI * 2\n\n let sides = 5\n const tube1 = []\n\n for (let i = 0; i < sides; i++) {\n const angle = (i / sides) * PI2\n tube1.push(new Vector3(Math.sin(angle) * 0.06, Math.cos(angle) * 0.06, 0))\n }\n\n sides = 6\n const tube2 = []\n\n for (let i = 0; i < sides; i++) {\n const angle = (i / sides) * PI2\n tube2.push(new Vector3(Math.sin(angle) * 0.025, Math.cos(angle) * 0.025, 0))\n }\n\n const vector = new Vector3()\n const normal = new Vector3()\n\n function drawShape(shape, color) {\n normal.set(0, 0, -1).applyQuaternion(quaternion)\n\n for (let j = 0; j < shape.length; j++) {\n vector.copy(shape[j])\n vector.applyQuaternion(quaternion)\n vector.add(point)\n\n vertices.push(vector.x, vector.y, vector.z)\n normals.push(normal.x, normal.y, normal.z)\n colors.push(color[0], color[1], color[2])\n }\n\n normal.set(0, 0, 1).applyQuaternion(quaternion)\n\n for (let j = shape.length - 1; j >= 0; j--) {\n vector.copy(shape[j])\n vector.applyQuaternion(quaternion)\n vector.add(point)\n\n vertices.push(vector.x, vector.y, vector.z)\n normals.push(normal.x, normal.y, normal.z)\n colors.push(color[0], color[1], color[2])\n }\n }\n\n const vector1 = new Vector3()\n const vector2 = new Vector3()\n const vector3 = new Vector3()\n const vector4 = new Vector3()\n\n const normal1 = new Vector3()\n const normal2 = new Vector3()\n const normal3 = new Vector3()\n const normal4 = new Vector3()\n\n function extrudeShape(shape, offset, color) {\n for (let j = 0, jl = shape.length; j < jl; j++) {\n const point1 = shape[j]\n const point2 = shape[(j + 1) % jl]\n\n vector1.copy(point1).add(offset)\n vector1.applyQuaternion(quaternion)\n vector1.add(point)\n\n vector2.copy(point2).add(offset)\n vector2.applyQuaternion(quaternion)\n vector2.add(point)\n\n vector3.copy(point2).add(offset)\n vector3.applyQuaternion(prevQuaternion)\n vector3.add(prevPoint)\n\n vector4.copy(point1).add(offset)\n vector4.applyQuaternion(prevQuaternion)\n vector4.add(prevPoint)\n\n vertices.push(vector1.x, vector1.y, vector1.z)\n vertices.push(vector2.x, vector2.y, vector2.z)\n vertices.push(vector4.x, vector4.y, vector4.z)\n\n vertices.push(vector2.x, vector2.y, vector2.z)\n vertices.push(vector3.x, vector3.y, vector3.z)\n vertices.push(vector4.x, vector4.y, vector4.z)\n\n //\n\n normal1.copy(point1)\n normal1.applyQuaternion(quaternion)\n normal1.normalize()\n\n normal2.copy(point2)\n normal2.applyQuaternion(quaternion)\n normal2.normalize()\n\n normal3.copy(point2)\n normal3.applyQuaternion(prevQuaternion)\n normal3.normalize()\n\n normal4.copy(point1)\n normal4.applyQuaternion(prevQuaternion)\n
|