JSFiddle - React, Tailwind, and code Playground
CSS
body {
margin: 0;
}
canvas {
display: block;
}
JavaScript
import * as THREE from 'https://cdn.jsdelivr.net/npm/three@0.120.1/build/three.module.js';
import { TransformControls } from 'https://cdn.jsdelivr.net/npm/three@0.120.1/examples/jsm/controls/TransformControls.js';
var cameraPersp, cameraOrtho, currentCamera;
var scene, renderer, control, orbit;
init();
render();
function init() {
renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
const aspect = window.innerWidth / window.innerHeight;
cameraPersp = new THREE.PerspectiveCamera( 50, aspect, 0.01, 30000 );
cameraOrtho = new THREE.OrthographicCamera( - 600 * aspect, 600 * aspect, 600, - 600, 0.01, 30000 );
currentCamera = cameraPersp;
currentCamera.position.set( 1000, 500, 1000 );
currentCamera.lookAt( 0, 200, 0 );
scene = new THREE.Scene();
scene.add( new THREE.GridHelper( 1000, 10, 0x888888, 0x444444 ) );
var geometry = new THREE.BoxBufferGeometry( 200, 200, 200 );
var material = new THREE.MeshBasicMaterial();
control = new TransformControls( currentCamera, renderer.domElement );
control.showY = false;
control.showZ = false;
control.addEventListener( 'change', render );
var mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );
control.attach( mesh );
scene.add( control );
window.addEventListener( 'resize', onWindowResize, false );
window.addEventListener( 'keydown', function ( event ) {
switch ( event.keyCode ) {
case 81: // Q
control.setSpace( control.space === "local" ? "world" : "local" );
break;
case 16: // Shift
control.setTranslationSnap( 100 );
control.setRotationSnap( THREE.MathUtils.degToRad( 15 ) );
control.setScaleSnap( 0.25 );
break;
case 87: // W
control.setMode( "translate" );
break;
case 69: // E
control.setMode( "rotate" );
break;
case 82: // R
control.setMode( "scale" );
break;
case...