deep-sea-abyss.ts 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. import type { Scene } from "./_helpers";
  2. export const deepSeaAbyss: Scene = {
  3. name: "Deep Sea Abyss",
  4. description:
  5. "Bioluminescent deep ocean. Pitch black with glowing jellyfish-like creatures.",
  6. spec: {
  7. root: "scene",
  8. elements: {
  9. scene: {
  10. type: "Group",
  11. props: { position: null, rotation: null, scale: null },
  12. children: [
  13. "cam",
  14. "env",
  15. "fog",
  16. "ambient",
  17. "jelly-1-pulse",
  18. "jelly-2-pulse",
  19. "jelly-3-pulse",
  20. "light-1",
  21. "light-2",
  22. "light-3",
  23. "tentacles-1",
  24. "tentacles-2",
  25. "tentacles-3",
  26. "sparkles-1",
  27. "sparkles-2",
  28. "controls",
  29. ],
  30. },
  31. cam: {
  32. type: "PerspectiveCamera",
  33. props: {
  34. position: [0, 1, 6],
  35. fov: 55,
  36. makeDefault: true,
  37. },
  38. children: [],
  39. },
  40. env: {
  41. type: "Environment",
  42. props: {
  43. preset: "night",
  44. background: false,
  45. blur: 1,
  46. intensity: 0.05,
  47. },
  48. children: [],
  49. },
  50. fog: {
  51. type: "Fog",
  52. props: { color: "#000510", near: 2, far: 18 },
  53. children: [],
  54. },
  55. ambient: {
  56. type: "AmbientLight",
  57. props: { color: "#001133", intensity: 0.15 },
  58. children: [],
  59. },
  60. "jelly-1-pulse": {
  61. type: "Pulse",
  62. props: {
  63. position: [0, 1, 0],
  64. rotation: null,
  65. scale: null,
  66. speed: 0.6,
  67. min: 0.85,
  68. max: 1.15,
  69. },
  70. children: ["jelly-1-spin"],
  71. },
  72. "jelly-1-spin": {
  73. type: "Spin",
  74. props: {
  75. position: null,
  76. rotation: null,
  77. scale: null,
  78. speed: 0.2,
  79. axis: "y",
  80. },
  81. children: ["jelly-1-body"],
  82. },
  83. "jelly-1-body": {
  84. type: "DistortSphere",
  85. props: {
  86. position: null,
  87. rotation: null,
  88. scale: null,
  89. castShadow: null,
  90. receiveShadow: null,
  91. radius: 1,
  92. widthSegments: 64,
  93. heightSegments: 32,
  94. color: "#00ccff",
  95. speed: 2,
  96. distort: 0.5,
  97. metalness: 0,
  98. roughness: 0.2,
  99. },
  100. children: [],
  101. },
  102. "jelly-2-pulse": {
  103. type: "Pulse",
  104. props: {
  105. position: [-4, -1, -3],
  106. rotation: null,
  107. scale: null,
  108. speed: 0.8,
  109. min: 0.8,
  110. max: 1.2,
  111. },
  112. children: ["jelly-2-spin"],
  113. },
  114. "jelly-2-spin": {
  115. type: "Spin",
  116. props: {
  117. position: null,
  118. rotation: null,
  119. scale: null,
  120. speed: -0.3,
  121. axis: "y",
  122. },
  123. children: ["jelly-2-body"],
  124. },
  125. "jelly-2-body": {
  126. type: "DistortSphere",
  127. props: {
  128. position: null,
  129. rotation: null,
  130. scale: null,
  131. castShadow: null,
  132. receiveShadow: null,
  133. radius: 0.7,
  134. widthSegments: 64,
  135. heightSegments: 32,
  136. color: "#cc44ff",
  137. speed: 2.5,
  138. distort: 0.6,
  139. metalness: 0,
  140. roughness: 0.2,
  141. },
  142. children: [],
  143. },
  144. "jelly-3-pulse": {
  145. type: "Pulse",
  146. props: {
  147. position: [3, 0.5, -5],
  148. rotation: null,
  149. scale: null,
  150. speed: 0.5,
  151. min: 0.9,
  152. max: 1.1,
  153. },
  154. children: ["jelly-3-spin"],
  155. },
  156. "jelly-3-spin": {
  157. type: "Spin",
  158. props: {
  159. position: null,
  160. rotation: null,
  161. scale: null,
  162. speed: 0.15,
  163. axis: "y",
  164. },
  165. children: ["jelly-3-body"],
  166. },
  167. "jelly-3-body": {
  168. type: "DistortSphere",
  169. props: {
  170. position: null,
  171. rotation: null,
  172. scale: null,
  173. castShadow: null,
  174. receiveShadow: null,
  175. radius: 0.5,
  176. widthSegments: 64,
  177. heightSegments: 32,
  178. color: "#ff44aa",
  179. speed: 1.5,
  180. distort: 0.4,
  181. metalness: 0,
  182. roughness: 0.3,
  183. },
  184. children: [],
  185. },
  186. "light-1": {
  187. type: "PointLight",
  188. props: {
  189. position: [0, 0, 0],
  190. rotation: null,
  191. scale: null,
  192. color: "#00ccff",
  193. intensity: 20,
  194. distance: 12,
  195. decay: 2,
  196. castShadow: null,
  197. },
  198. children: [],
  199. },
  200. "light-2": {
  201. type: "PointLight",
  202. props: {
  203. position: [-4, -1, -3],
  204. rotation: null,
  205. scale: null,
  206. color: "#cc44ff",
  207. intensity: 15,
  208. distance: 10,
  209. decay: 2,
  210. castShadow: null,
  211. },
  212. children: [],
  213. },
  214. "light-3": {
  215. type: "PointLight",
  216. props: {
  217. position: [3, 0.5, -5],
  218. rotation: null,
  219. scale: null,
  220. color: "#ff44aa",
  221. intensity: 10,
  222. distance: 8,
  223. decay: 2,
  224. castShadow: null,
  225. },
  226. children: [],
  227. },
  228. "tentacles-1": {
  229. type: "Float",
  230. props: {
  231. position: [0, -1, 0],
  232. rotation: null,
  233. scale: null,
  234. speed: 0.3,
  235. rotationIntensity: 0.5,
  236. floatIntensity: 0.8,
  237. enabled: true,
  238. },
  239. children: ["t1-s1", "t1-s2", "t1-s3", "t1-s4", "t1-s5", "t1-s6"],
  240. },
  241. "t1-s1": {
  242. type: "GlassSphere",
  243. props: {
  244. position: [0.3, -0.5, 0],
  245. rotation: null,
  246. scale: null,
  247. castShadow: null,
  248. receiveShadow: null,
  249. radius: 0.12,
  250. widthSegments: 16,
  251. heightSegments: 8,
  252. color: "#00ccff",
  253. transmission: 0.9,
  254. thickness: 0.3,
  255. roughness: 0.1,
  256. chromaticAberration: 0.1,
  257. ior: 1.5,
  258. distortion: 0,
  259. distortionScale: null,
  260. temporalDistortion: null,
  261. samples: 6,
  262. resolution: 128,
  263. },
  264. children: [],
  265. },
  266. "t1-s2": {
  267. type: "GlassSphere",
  268. props: {
  269. position: [-0.2, -1.2, 0],
  270. rotation: null,
  271. scale: null,
  272. castShadow: null,
  273. receiveShadow: null,
  274. radius: 0.1,
  275. widthSegments: 16,
  276. heightSegments: 8,
  277. color: "#00ccff",
  278. transmission: 0.9,
  279. thickness: 0.3,
  280. roughness: 0.1,
  281. chromaticAberration: 0.1,
  282. ior: 1.5,
  283. distortion: 0,
  284. distortionScale: null,
  285. temporalDistortion: null,
  286. samples: 6,
  287. resolution: 128,
  288. },
  289. children: [],
  290. },
  291. "t1-s3": {
  292. type: "GlassSphere",
  293. props: {
  294. position: [0.4, -1.9, 0],
  295. rotation: null,
  296. scale: null,
  297. castShadow: null,
  298. receiveShadow: null,
  299. radius: 0.08,
  300. widthSegments: 16,
  301. heightSegments: 8,
  302. color: "#00ccff",
  303. transmission: 0.9,
  304. thickness: 0.3,
  305. roughness: 0.1,
  306. chromaticAberration: 0.1,
  307. ior: 1.5,
  308. distortion: 0,
  309. distortionScale: null,
  310. temporalDistortion: null,
  311. samples: 6,
  312. resolution: 128,
  313. },
  314. children: [],
  315. },
  316. "t1-s4": {
  317. type: "GlassSphere",
  318. props: {
  319. position: [-0.3, -2.5, 0],
  320. rotation: null,
  321. scale: null,
  322. castShadow: null,
  323. receiveShadow: null,
  324. radius: 0.07,
  325. widthSegments: 16,
  326. heightSegments: 8,
  327. color: "#00ccff",
  328. transmission: 0.9,
  329. thickness: 0.3,
  330. roughness: 0.1,
  331. chromaticAberration: 0.1,
  332. ior: 1.5,
  333. distortion: 0,
  334. distortionScale: null,
  335. temporalDistortion: null,
  336. samples: 6,
  337. resolution: 128,
  338. },
  339. children: [],
  340. },
  341. "t1-s5": {
  342. type: "GlassSphere",
  343. props: {
  344. position: [0.1, -3.0, 0],
  345. rotation: null,
  346. scale: null,
  347. castShadow: null,
  348. receiveShadow: null,
  349. radius: 0.06,
  350. widthSegments: 16,
  351. heightSegments: 8,
  352. color: "#00ccff",
  353. transmission: 0.9,
  354. thickness: 0.3,
  355. roughness: 0.1,
  356. chromaticAberration: 0.1,
  357. ior: 1.5,
  358. distortion: 0,
  359. distortionScale: null,
  360. temporalDistortion: null,
  361. samples: 6,
  362. resolution: 128,
  363. },
  364. children: [],
  365. },
  366. "t1-s6": {
  367. type: "GlassSphere",
  368. props: {
  369. position: [-0.1, -3.4, 0],
  370. rotation: null,
  371. scale: null,
  372. castShadow: null,
  373. receiveShadow: null,
  374. radius: 0.05,
  375. widthSegments: 16,
  376. heightSegments: 8,
  377. color: "#00ccff",
  378. transmission: 0.9,
  379. thickness: 0.3,
  380. roughness: 0.1,
  381. chromaticAberration: 0.1,
  382. ior: 1.5,
  383. distortion: 0,
  384. distortionScale: null,
  385. temporalDistortion: null,
  386. samples: 6,
  387. resolution: 128,
  388. },
  389. children: [],
  390. },
  391. "tentacles-2": {
  392. type: "Float",
  393. props: {
  394. position: [-4, -2.5, -3],
  395. rotation: null,
  396. scale: null,
  397. speed: 0.4,
  398. rotationIntensity: 0.5,
  399. floatIntensity: 0.8,
  400. enabled: true,
  401. },
  402. children: ["t2-s1", "t2-s2", "t2-s3", "t2-s4", "t2-s5"],
  403. },
  404. "t2-s1": {
  405. type: "GlassSphere",
  406. props: {
  407. position: [0.3, -0.5, 0],
  408. rotation: null,
  409. scale: null,
  410. castShadow: null,
  411. receiveShadow: null,
  412. radius: 0.1,
  413. widthSegments: 16,
  414. heightSegments: 8,
  415. color: "#cc44ff",
  416. transmission: 0.9,
  417. thickness: 0.3,
  418. roughness: 0.1,
  419. chromaticAberration: 0.1,
  420. ior: 1.5,
  421. distortion: 0,
  422. distortionScale: null,
  423. temporalDistortion: null,
  424. samples: 6,
  425. resolution: 128,
  426. },
  427. children: [],
  428. },
  429. "t2-s2": {
  430. type: "GlassSphere",
  431. props: {
  432. position: [-0.2, -1.1, 0],
  433. rotation: null,
  434. scale: null,
  435. castShadow: null,
  436. receiveShadow: null,
  437. radius: 0.08,
  438. widthSegments: 16,
  439. heightSegments: 8,
  440. color: "#cc44ff",
  441. transmission: 0.9,
  442. thickness: 0.3,
  443. roughness: 0.1,
  444. chromaticAberration: 0.1,
  445. ior: 1.5,
  446. distortion: 0,
  447. distortionScale: null,
  448. temporalDistortion: null,
  449. samples: 6,
  450. resolution: 128,
  451. },
  452. children: [],
  453. },
  454. "t2-s3": {
  455. type: "GlassSphere",
  456. props: {
  457. position: [0.4, -1.7, 0],
  458. rotation: null,
  459. scale: null,
  460. castShadow: null,
  461. receiveShadow: null,
  462. radius: 0.06,
  463. widthSegments: 16,
  464. heightSegments: 8,
  465. color: "#cc44ff",
  466. transmission: 0.9,
  467. thickness: 0.3,
  468. roughness: 0.1,
  469. chromaticAberration: 0.1,
  470. ior: 1.5,
  471. distortion: 0,
  472. distortionScale: null,
  473. temporalDistortion: null,
  474. samples: 6,
  475. resolution: 128,
  476. },
  477. children: [],
  478. },
  479. "t2-s4": {
  480. type: "GlassSphere",
  481. props: {
  482. position: [-0.3, -2.2, 0],
  483. rotation: null,
  484. scale: null,
  485. castShadow: null,
  486. receiveShadow: null,
  487. radius: 0.05,
  488. widthSegments: 16,
  489. heightSegments: 8,
  490. color: "#cc44ff",
  491. transmission: 0.9,
  492. thickness: 0.3,
  493. roughness: 0.1,
  494. chromaticAberration: 0.1,
  495. ior: 1.5,
  496. distortion: 0,
  497. distortionScale: null,
  498. temporalDistortion: null,
  499. samples: 6,
  500. resolution: 128,
  501. },
  502. children: [],
  503. },
  504. "t2-s5": {
  505. type: "GlassSphere",
  506. props: {
  507. position: [0.1, -2.6, 0],
  508. rotation: null,
  509. scale: null,
  510. castShadow: null,
  511. receiveShadow: null,
  512. radius: 0.05,
  513. widthSegments: 16,
  514. heightSegments: 8,
  515. color: "#cc44ff",
  516. transmission: 0.9,
  517. thickness: 0.3,
  518. roughness: 0.1,
  519. chromaticAberration: 0.1,
  520. ior: 1.5,
  521. distortion: 0,
  522. distortionScale: null,
  523. temporalDistortion: null,
  524. samples: 6,
  525. resolution: 128,
  526. },
  527. children: [],
  528. },
  529. "tentacles-3": {
  530. type: "Float",
  531. props: {
  532. position: [3, -1, -5],
  533. rotation: null,
  534. scale: null,
  535. speed: 0.35,
  536. rotationIntensity: 0.5,
  537. floatIntensity: 0.8,
  538. enabled: true,
  539. },
  540. children: ["t3-s1", "t3-s2", "t3-s3", "t3-s4"],
  541. },
  542. "t3-s1": {
  543. type: "GlassSphere",
  544. props: {
  545. position: [0.3, -0.5, 0],
  546. rotation: null,
  547. scale: null,
  548. castShadow: null,
  549. receiveShadow: null,
  550. radius: 0.09,
  551. widthSegments: 16,
  552. heightSegments: 8,
  553. color: "#ff44aa",
  554. transmission: 0.9,
  555. thickness: 0.3,
  556. roughness: 0.1,
  557. chromaticAberration: 0.1,
  558. ior: 1.5,
  559. distortion: 0,
  560. distortionScale: null,
  561. temporalDistortion: null,
  562. samples: 6,
  563. resolution: 128,
  564. },
  565. children: [],
  566. },
  567. "t3-s2": {
  568. type: "GlassSphere",
  569. props: {
  570. position: [-0.2, -1.0, 0],
  571. rotation: null,
  572. scale: null,
  573. castShadow: null,
  574. receiveShadow: null,
  575. radius: 0.07,
  576. widthSegments: 16,
  577. heightSegments: 8,
  578. color: "#ff44aa",
  579. transmission: 0.9,
  580. thickness: 0.3,
  581. roughness: 0.1,
  582. chromaticAberration: 0.1,
  583. ior: 1.5,
  584. distortion: 0,
  585. distortionScale: null,
  586. temporalDistortion: null,
  587. samples: 6,
  588. resolution: 128,
  589. },
  590. children: [],
  591. },
  592. "t3-s3": {
  593. type: "GlassSphere",
  594. props: {
  595. position: [0.4, -1.5, 0],
  596. rotation: null,
  597. scale: null,
  598. castShadow: null,
  599. receiveShadow: null,
  600. radius: 0.06,
  601. widthSegments: 16,
  602. heightSegments: 8,
  603. color: "#ff44aa",
  604. transmission: 0.9,
  605. thickness: 0.3,
  606. roughness: 0.1,
  607. chromaticAberration: 0.1,
  608. ior: 1.5,
  609. distortion: 0,
  610. distortionScale: null,
  611. temporalDistortion: null,
  612. samples: 6,
  613. resolution: 128,
  614. },
  615. children: [],
  616. },
  617. "t3-s4": {
  618. type: "GlassSphere",
  619. props: {
  620. position: [-0.1, -1.9, 0],
  621. rotation: null,
  622. scale: null,
  623. castShadow: null,
  624. receiveShadow: null,
  625. radius: 0.05,
  626. widthSegments: 16,
  627. heightSegments: 8,
  628. color: "#ff44aa",
  629. transmission: 0.9,
  630. thickness: 0.3,
  631. roughness: 0.1,
  632. chromaticAberration: 0.1,
  633. ior: 1.5,
  634. distortion: 0,
  635. distortionScale: null,
  636. temporalDistortion: null,
  637. samples: 6,
  638. resolution: 128,
  639. },
  640. children: [],
  641. },
  642. "sparkles-1": {
  643. type: "Sparkles",
  644. props: {
  645. position: [0, 0, -3],
  646. rotation: null,
  647. scale: [15, 10, 15],
  648. count: 300,
  649. speed: 0.1,
  650. opacity: 0.4,
  651. color: "#00aaff",
  652. size: 1,
  653. noise: 3,
  654. },
  655. children: [],
  656. },
  657. "sparkles-2": {
  658. type: "Sparkles",
  659. props: {
  660. position: [0, -2, 0],
  661. rotation: null,
  662. scale: [12, 6, 12],
  663. count: 150,
  664. speed: 0.05,
  665. opacity: 0.2,
  666. color: "#8844ff",
  667. size: 0.8,
  668. noise: 2,
  669. },
  670. children: [],
  671. },
  672. controls: {
  673. type: "OrbitControls",
  674. props: {
  675. enableDamping: true,
  676. dampingFactor: null,
  677. enableZoom: true,
  678. enablePan: null,
  679. enableRotate: true,
  680. minDistance: 3,
  681. maxDistance: 18,
  682. minPolarAngle: null,
  683. maxPolarAngle: null,
  684. autoRotate: true,
  685. autoRotateSpeed: 0.15,
  686. },
  687. children: [],
  688. },
  689. },
  690. },
  691. };