Loading...
Loading...
Stand up a three.js scene: import maps and the three/addons path, the Scene/PerspectiveCamera/WebGLRenderer trio, the setAnimationLoop render loop, responsive resize, and OrbitControls. Use when starting or debugging a three.js app — when the user mentions three.js, THREE.Scene, WebGLRenderer, PerspectiveCamera, the render loop, resizing, or OrbitControls. For models use threejs-gltf-loading; for materials/lights use threejs-materials-lighting.
npx skill4agent add gamedev-skills/awesome-gamedev-agent-skills threejs-scene-setupOrbitControlspackage.jsonthreeimport * as THREE from 'three'.gltf.glbthreejs-gltf-loadingthreejs-materials-lightingpixijs-rendering'three''three/addons/'three/addons/...ScenePerspectiveCamera(fov, aspect, near, far)WebGLRendererdomElementpixelRationew Mesh(geometry, material)scene.add(mesh)threejs-materials-lightingrenderer.setAnimationLoop(fn)requestAnimationFrameClockcamera.aspectupdateProjectionMatrix()renderer.setSize(...)OrbitControls<canvas id="c"></canvas>
<script type="importmap">
{
"imports": {
"three": "https://cdn.jsdelivr.net/npm/three@0.184.0/build/three.module.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/three@0.184.0/examples/jsm/"
}
}
</script>
<script type="module" src="./main.js"></script>npm i threeimport// main.js
import * as THREE from 'three';
const canvas = document.querySelector('#c');
const renderer = new THREE.WebGLRenderer({ canvas, antialias: true });
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); // cap for perf
renderer.setSize(window.innerWidth, window.innerHeight);
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x101018);
const camera = new THREE.PerspectiveCamera(
60, // vertical field of view (degrees)
window.innerWidth / window.innerHeight, // aspect
0.1, // near
100 // far
);
camera.position.set(3, 2, 5);
camera.lookAt(0, 0, 0);
const cube = new THREE.Mesh(
new THREE.BoxGeometry(1, 1, 1),
new THREE.MeshNormalMaterial() // unlit; shows orientation without a light
);
scene.add(cube);const clock = new THREE.Clock();
renderer.setAnimationLoop(() => {
const dt = clock.getDelta(); // seconds since last frame
cube.rotation.x += dt; // frame-rate independent
cube.rotation.y += dt * 0.7;
renderer.render(scene, camera);
});
// renderer.setAnimationLoop(null); // stop the loopfunction onResize() {
const w = window.innerWidth, h = window.innerHeight;
camera.aspect = w / h;
camera.updateProjectionMatrix(); // required after changing aspect
renderer.setSize(w, h);
}
window.addEventListener('resize', onResize);import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // inertial feel
controls.target.set(0, 0, 0);
renderer.setAnimationLoop(() => {
controls.update(); // needed every frame when damping is on
renderer.render(scene, camera);
});Failed to resolve module specifier "three""three""three/addons/"/MeshStandardMaterialMeshNormalMaterialMeshBasicMaterialrenderer.rendersetAnimationLoopcamera.aspectupdateProjectionMatrix()renderer.setPixelRatio(...)enableDamping = truecontrols.update()<script src="three.min.js">type="module"GroupObject3DOrthographicCamerareferences/scene-graph.mdthreejs-materials-lightingthreejs-gltf-loadingpixijs-renderingfps-shooter