JSFiddle - React, Tailwind, and code Playground
HTML
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/three@0.157/build/three.module.js",
"three/addons/": "https://unpkg.com/three@0.157/examples/jsm/"
}
}
</script>
CSS
body {
margin: 0px;
}
JavaScript
import * as THREE from 'three';
import { TrackballControls } from 'three/addons/controls/TrackballControls.js';
let renderer, scene, scene2D, camera, camera2D, controls;
init();
loop();
function init() {
renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor( 0xffffff, 0 );
renderer.autoClear = false;
document.body.appendChild(renderer.domElement);
window.addEventListener('resize', onWindowResize, false);
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(3.8, 3.8, 3.8);
scene2D = new THREE.Scene();
camera2D = new THREE.OrthographicCamera(0, window.innerWidth, 0, window.innerHeight, 1, 1000);
camera2D.position.z = 2;
setupControls(renderer);
init3d();
init2d();
renderScene();//render after init
}
function renderScene() {
renderer.clear();
renderer.render(scene, camera);
renderer.clearDepth();
renderer.render(scene2D, camera2D);
}
function loop() {
requestAnimationFrame(loop);
controls.update();
// renderScene();//not render in loop cause alpha failed
}
function setupControls() {
controls = new TrackballControls(camera, renderer.domElement);
controls.rotateSpeed = 3.0;
controls.zoomSpeed = 2;
controls.panSpeed = 0.8;
controls.noZoom = false;
controls.noPan = false;
controls.staticMoving = false;
controls.dynamicDampingFactor = 0.2;
controls.target.set(0, 1.5, 0);
controls.update();
controls.addEventListener('change', renderScene);//render after control change
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
camera2D.right = window.innerWidth;
camera2D.bottom = window.innerHeight;
...