Codels
1,4 mil tris6,22 × 6,28 × 5,88 m
Módulo ES autocontido — depende apenas do three. Chame a factory e adicione o grupo à sua cena.
/**
 * Sun — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the model (it floats — pickups, planets)
 * Triangles: 1,356 · Size (W × H × D): 6.22 × 6.28 × 5.88 m
 *
 * Usage:
 *   import { createSun } from './sun.js';
 *   
 *   const model = createSun();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

export function createSun() {
  const root = new THREE.Group();
  root.name = 'Sun';

  // Materials
  const coreMat = new THREE.MeshStandardMaterial({ name: 'core', color: 0xffe066, roughness: 0.6, emissive: 0xffb800, emissiveIntensity: 1.2, flatShading: true });
  const spotMat = new THREE.MeshStandardMaterial({ name: 'spot', color: 0xd8641a, roughness: 0.8, emissive: 0xd8641a, emissiveIntensity: 0.5, flatShading: true });
  const rayMat = new THREE.MeshStandardMaterial({ name: 'ray', color: 0xffa62b, roughness: 0.5, emissive: 0xff7a10, emissiveIntensity: 1.2, flatShading: true });
  const rayDeepMat = new THREE.MeshStandardMaterial({ name: 'rayDeep', color: 0xff7a10, roughness: 0.5, emissive: 0xff7a10, flatShading: true });
  const flareMat = new THREE.MeshStandardMaterial({ name: 'flare', color: 0xff5a14, roughness: 0.5, emissive: 0xff5a14, emissiveIntensity: 1.3, flatShading: true });
  const coronaMat = new THREE.MeshStandardMaterial({ name: 'corona', color: 0xffb43c, roughness: 0.8, emissive: 0xffb800, emissiveIntensity: 0.8, transparent: true, opacity: 0.3 });

  // Parts
  const sun = new THREE.Group();
  sun.name = 'sun';
  sun.scale.setScalar(4);
  root.add(sun);
  const core = new THREE.Mesh(new THREE.IcosahedronGeometry(0.5, 2), coreMat);
  core.name = 'core';
  sun.add(core);
  const sunspot1 = new THREE.Mesh(new THREE.SphereGeometry(0.506, 10, 2, 0, Math.PI * 2, 0, 0.1774), spotMat);
  sunspot1.name = 'sunspot1';
  sunspot1.rotation.set(deg(-88.9636), deg(-30.7497), deg(31.2838));
  sun.add(sunspot1);
  const sunspot2 = new THREE.Mesh(new THREE.SphereGeometry(0.507, 10, 2, 0, Math.PI * 2, 0, 0.2212), spotMat);
  sunspot2.name = 'sunspot2';
  sunspot2.rotation.set(deg(26.7629), deg(7.1531), deg(29.4425));
  sun.add(sunspot2);
  const sunspot3 = new THREE.Mesh(new THREE.SphereGeometry(0.508, 10, 2, 0, Math.PI * 2, 0, 0.2199), spotMat);
  sunspot3.name = 'sunspot3';
  sunspot3.rotation.set(deg(-126.0224), deg(42.207), deg(-22.2395));
  sun.add(sunspot3);
  const sunspot4 = new THREE.Mesh(new THREE.SphereGeometry(0.509, 10, 2, 0, Math.PI * 2, 0, 0.2348), spotMat);
  sunspot4.name = 'sunspot4';
  sunspot4.rotation.set(deg(20.5173), deg(-27.1604), deg(-106.3162));
  sun.add(sunspot4);
  const prominence1 = new THREE.Group();
  prominence1.name = 'prominence1';
  prominence1.position.set(0.0344, 0.2829, -0.3924);
  prominence1.rotation.set(deg(121.413), deg(46.9884), deg(-174.0248));
  sun.add(prominence1);
  const loop = new THREE.Mesh(new THREE.TorusGeometry(0.1134, 0.025, 4, 10, Math.PI), flareMat);
  loop.name = 'loop';
  prominence1.add(loop);
  const prominence2 = new THREE.Group();
  prominence2.name = 'prominence2';
  prominence2.position.set(-0.1255, -0.0404, 0.4667);
  prominence2.rotation.set(deg(88.3332), deg(23.2768), deg(16.3571));
  sun.add(prominence2);
  const loop2 = new THREE.Mesh(new THREE.TorusGeometry(0.1207, 0.025, 4, 10, Math.PI), flareMat);
  loop2.name = 'loop';
  prominence2.add(loop2);
  const prominence3 = new THREE.Group();
  prominence3.name = 'prominence3';
  prominence3.position.set(0.136, -0.3637, -0.2906);
  prominence3.rotation.set(deg(48.1069), deg(-29.4449), deg(-161.2202));
  sun.add(prominence3);
  const loop3 = new THREE.Mesh(new THREE.TorusGeometry(0.1104, 0.025, 4, 10, Math.PI), flareMat);
  loop3.name = 'loop';
  prominence3.add(loop3);
  const ray1 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.4025, 5), flareMat);
  ray1.name = 'ray1';
  ray1.position.set(0.1413, 0.6357, 0);
  ray1.rotation.set(deg(7.0935), deg(29.0628), deg(-14.3688));
  sun.add(ray1);
  const ray2 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1646, 5), rayMat);
  ray2.name = 'ray2';
  ray2.position.set(-0.1457, 0.4943, 0.1335);
  ray2.rotation.set(deg(-27.2746), deg(67.115), deg(44.7289));
  sun.add(ray2);
  const ray3 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2932, 5), rayDeepMat);
  ray3.name = 'ray3';
  ray3.position.set(0.0247, 0.5256, -0.2812);
  ray3.rotation.set(deg(-25.1437), deg(51.7182), deg(-3.8289));
  sun.add(ray3);
  const ray4 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3848, 5), flareMat);
  ray4.name = 'ray4';
  ray4.position.set(0.2161, 0.5353, 0.2818);
  ray4.rotation.set(deg(29.1658), deg(3.9214), deg(-19.7013));
  sun.add(ray4);
  const ray5 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1543, 5), rayMat);
  ray5.name = 'ray5';
  ray5.position.set(-0.3211, 0.4142, -0.0568);
  ray5.rotation.set(deg(-32.4861), deg(28.5279), deg(43.8929));
  sun.add(ray5);
  const ray6 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2896, 5), rayDeepMat);
  ray6.name = 'ray6';
  ray6.position.set(0.3386, 0.439, -0.2154);
  ray6.rotation.set(deg(29.3984), deg(49.9739), deg(-62.2712));
  sun.add(ray6);
  const ray7 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3377, 5), flareMat);
  ray7.name = 'ray7';
  ray7.position.set(-0.1162, 0.4273, 0.4323);
  ray7.rotation.set(deg(42.1779), deg(16.0612), deg(11.2689));
  sun.add(ray7);
  const ray8 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1721, 5), rayMat);
  ray8.name = 'ray8';
  ray8.position.set(-0.1893, 0.3446, -0.3644);
  ray8.rotation.set(deg(-49.3224), deg(7.1773), deg(20.8447));
  sun.add(ray8);
  const ray9 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.3212, 5), rayDeepMat);
  ray9.name = 'ray9';
  ray9.position.set(0.4609, 0.3635, 0.1683);
  ray9.rotation.set(deg(57.2185), deg(24.952), deg(-56.3559));
  sun.add(ray9);
  const ray10 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3479, 5), flareMat);
  ray10.name = 'ray10';
  ray10.position.set(-0.4826, 0.3417, 0.1992);
  ray10.rotation.set(deg(-25.1009), deg(33.9865), deg(68.871));
  sun.add(ray10);
  const ray11 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1726, 5), rayMat);
  ray11.name = 'ray11';
  ray11.position.set(0.1969, 0.2681, -0.4207);
  ray11.rotation.set(deg(-36.0776), deg(42.7677), deg(-30.0005));
  sun.add(ray11);
  const ray12 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2965, 5), rayDeepMat);
  ray12.name = 'ray12';
  ray12.position.set(0.1597, 0.2706, 0.5091);
  ray12.rotation.set(deg(61.9379), deg(-0.2385), deg(-15.4805));
  sun.add(ray12);
  const ray13 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3557, 5), flareMat);
  ray13.name = 'ray13';
  ray13.position.set(-0.4967, 0.2541, -0.2879);
  ray13.rotation.set(deg(-59.2318), deg(8.1453), deg(53.0567));
  sun.add(ray13);
  const ray14 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1971, 5), rayMat);
  ray14.name = 'ray14';
  ray14.position.set(0.5004, 0.1959, -0.11);
  ray14.rotation.set(deg(32.1752), deg(21.532), deg(-78.7264));
  sun.add(ray14);
  const ray15 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2777, 5), rayDeepMat);
  ray15.name = 'ray15';
  ray15.position.set(-0.322, 0.1823, 0.4581);
  ray15.rotation.set(deg(8.6472), deg(52.877), deg(64.9784));
  sun.add(ray15);
  const ray16 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3597, 5), flareMat);
  ray16.name = 'ray16';
  ray16.position.set(-0.0781, 0.165, -0.6028);
  ray16.rotation.set(deg(-83.4515), deg(50.6102), deg(11.2704));
  sun.add(ray16);
  const ray17 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1603, 5), rayMat);
  ray17.name = 'ray17';
  ray17.position.set(0.396, 0.1136, 0.3337);
  ray17.rotation.set(deg(92.5353), deg(17.9474), deg(-51.729));
  sun.add(ray17);
  const ray18 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.3125, 5), rayDeepMat);
  ray18.name = 'ray18';
  ray18.position.set(-0.5972, 0.101, 0.0247);
  ray18.rotation.set(deg(-54.817), deg(9.2074), deg(86.4032));
  sun.add(ray18);
  const ray19 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3831, 5), flareMat);
  ray19.name = 'ray19';
  ray19.position.set(0.4515, 0.0764, -0.4493);
  ray19.rotation.set(deg(-41.8546), deg(32.1432), deg(-56.2215));
  sun.add(ray19);
  const ray20 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1999, 5), rayMat);
  ray20.name = 'ray20';
  ray20.position.set(-0.0253, 0.0393, 0.5479);
  ray20.rotation.set(deg(82.7125), deg(50.3211), deg(4.1381));
  sun.add(ray20);
  const ray21 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.3022, 5), rayDeepMat);
  ray21.name = 'ray21';
  ray21.position.set(-0.385, 0.0143, -0.4614);
  ray21.rotation.set(deg(-87.0126), deg(-1.4511), deg(39.8465));
  sun.add(ray21);
  const ray22 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3616, 5), flareMat);
  ray22.name = 'ray22';
  ray22.position.set(0.625, -0.015, 0.0841);
  ray22.rotation.set(deg(33.2627), deg(-7.1637), deg(-86.9499));
  sun.add(ray22);
  const ray23 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1825, 5), rayMat);
  ray23.name = 'ray23';
  ray23.position.set(-0.4431, -0.0387, 0.3083);
  ray23.rotation.set(deg(7.8327), deg(35.037), deg(89.6062));
  sun.add(ray23);
  const ray24 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2757, 5), rayDeepMat);
  ray24.name = 'ray24';
  ray24.position.set(0.1281, -0.07, -0.5694);
  ray24.rotation.set(deg(-81.8276), deg(49.5427), deg(-19.6237));
  sun.add(ray24);
  const ray25 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3593, 5), flareMat);
  ray25.name = 'ray25';
  ray25.position.set(0.3087, -0.1049, 0.5387);
  ray25.rotation.set(deg(92.5011), deg(-14.7619), deg(-30.4616));
  sun.add(ray25);
  const ray26 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1981, 5), rayMat);
  ray26.name = 'ray26';
  ray26.position.set(-0.5109, -0.1177, -0.163);
  ray26.rotation.set(deg(-35.7134), deg(-21.4773), deg(90.0397));
  sun.add(ray26);
  const ray27 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2964, 5), rayDeepMat);
  ray27.name = 'ray27';
  ray27.position.set(0.5241, -0.1567, -0.2422);
  ray27.rotation.set(deg(37.2641), deg(10.5752), deg(-116.9703));
  sun.add(ray27);
  const ray28 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3428, 5), flareMat);
  ray28.name = 'ray28';
  ray28.position.set(-0.2281, -0.1923, 0.5451);
  ray28.rotation.set(deg(89.7365), deg(40.5018), deg(28.8674));
  sun.add(ray28);
  const ray29 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1912, 5), rayMat);
  ray29.name = 'ray29';
  ray29.position.set(-0.1725, -0.1949, -0.4795);
  ray29.rotation.set(deg(-105.341), deg(-19.4899), deg(19.5936));
  sun.add(ray29);
  const ray30 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2489, 5), rayDeepMat);
  ray30.name = 'ray30';
  ray30.position.set(0.465, -0.2325, 0.2444);
  ray30.rotation.set(deg(79.2809), deg(-30.5016), deg(-69.9579));
  sun.add(ray30);
  const ray31 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3605, 5), flareMat);
  ray31.name = 'ray31';
  ray31.position.set(-0.5435, -0.2851, 0.1433);
  ray31.rotation.set(deg(-43.2283), deg(-9.4934), deg(119.0328));
  sun.add(ray31);
  const ray32 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1837, 5), rayMat);
  ray32.name = 'ray32';
  ray32.position.set(0.2538, -0.2709, -0.3947);
  ray32.rotation.set(deg(-75.7664), deg(54.7913), deg(-54.3285));
  sun.add(ray32);
  const ray33 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2457, 5), rayDeepMat);
  ray33.name = 'ray33';
  ray33.position.set(0.0812, -0.3137, 0.4724);
  ray33.rotation.set(deg(127.0569), deg(22.916), deg(-8.851));
  sun.add(ray33);
  const ray34 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3318, 5), flareMat);
  ray34.name = 'ray34';
  ray34.position.set(-0.3913, -0.3666, -0.303);
  ray34.rotation.set(deg(-128.1879), deg(-14.4462), deg(40.9991));
  sun.add(ray34);
  const ray35 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1775, 5), rayMat);
  ray35.name = 'ray35';
  ray35.position.set(0.4113, -0.3464, -0.0341);
  ray35.rotation.set(deg(41.0709), deg(-26.1424), deg(-121.749));
  sun.add(ray35);
  const ray36 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.3198, 5), rayDeepMat);
  ray36.name = 'ray36';
  ray36.position.set(-0.2996, -0.4211, 0.3238);
  ray36.rotation.set(deg(2.3817), deg(48.7043), deg(131.8986));
  sun.add(ray36);
  const ray37 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3858, 5), flareMat);
  ray37.name = 'ray37';
  ray37.position.set(0.0021, -0.4745, -0.4337);
  ray37.rotation.set(deg(-137.393), deg(43.1412), deg(-0.2584));
  sun.add(ray37);
  const ray38 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1546, 5), rayMat);
  ray38.name = 'ray38';
  ray38.position.set(0.2192, -0.4143, 0.2416);
  ray38.rotation.set(deg(133.5186), deg(-31.4582), deg(-29.159));
  sun.add(ray38);
  const ray39 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.2756, 5), rayDeepMat);
  ray39.name = 'ray39';
  ray39.position.set(-0.3235, -0.4898, -0.03);
  ray39.rotation.set(deg(-11.4225), deg(-21.3397), deg(143.7772));
  sun.add(ray39);
  const ray40 = new THREE.Mesh(new THREE.ConeGeometry(0.0509, 0.3788, 5), flareMat);
  ray40.name = 'ray40';
  ray40.position.set(0.241, -0.5633, -0.1829);
  ray40.rotation.set(deg(4.256), deg(30.2604), deg(-154.1257));
  sun.add(ray40);
  const ray41 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.1567, 5), rayMat);
  ray41.name = 'ray41';
  ray41.position.set(-0.0351, -0.4906, 0.1929);
  ray41.rotation.set(deg(152.9616), deg(55.5581), deg(6.7454));
  sun.add(ray41);
  const ray42 = new THREE.Mesh(new THREE.ConeGeometry(0.0694, 0.3051, 5), rayDeepMat);
  ray42.name = 'ray42';
  ray42.position.set(-0.0696, -0.5882, -0.1106);
  ray42.rotation.set(deg(-165.8319), deg(-27.809), deg(7.5051));
  sun.add(ray42);
  const halo = new THREE.Mesh(new THREE.SphereGeometry(0.6, 18, 12), coronaMat);
  halo.name = 'halo';
  sun.add(halo);

  root.traverse((o) => {
    if (o.isMesh) {
      o.castShadow = true;
      o.receiveShadow = true;
    }
  });
  return root;
}

export default createSun;

Avaliações e comentários

—
Nenhuma avaliação ainda — seja o primeiro.
5
0
4
0
3
0
2
0
1
0

Entre para avaliar e comentar.

0 comentário

Nenhum comentário ainda. Conte como você usou este modelo ou o que poderia melhorar.

Modelos relacionados

Mesma categoria ou tags parecidas