JSFiddle - React, Tailwind, and code Playground
HTML
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/[email protected]/build/three.module.js",
"three/addons/": "https://unpkg.com/[email protected]/examples/jsm/"
}
}
</script>
CSS
body{
overflow: hidden;
margin: 0;
}
JavaScript
import * as THREE from "three";
import {
OrbitControls
} from "three/addons/controls/OrbitControls.js";
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera(45, innerWidth / innerHeight, 1, 100);
camera.position.set(0, 0, 10);
let renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);
window.addEventListener("resize", event => {
camera.aspect = innerWidth / innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(innerWidth, innerHeight);
})
let controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
let light = new THREE.DirectionalLight(0xffffff, Math.PI);
light.position.set(1, 0.25, 1);
scene.add(light, new THREE.AmbientLight(0xffffff, Math.PI * 0.5));
let g = new THREE.SphereGeometry(5, 100,50);
let pos = g.attributes.position;
for(let i = 0; i < pos.count; i++){
let x = pos.getX(i);
let y = pos.getY(i);
let z = pos.getZ(i);
let r = Math.hypot(x, z);
let yCurr = y;
if(y < 0 && r > 4){
yCurr = -Math.sqrt(1 - THREE.MathUtils.clamp(r - 4, 0, 1) ** 2);
} else if (y < 0 && r <= 4){
yCurr = -1;
}
pos.setY(i, yCurr);
}
g.computeVertexNormals();
let m = new THREE.MeshLambertMaterial({color: "magenta", side: THREE.BackSide});
let o = new THREE.Mesh(g, m);
scene.add(o);
renderer.setAnimationLoop(() => {
controls.update();
renderer.render(scene, camera);
});