Created
June 17, 2021 11:58
-
-
Save adegard/b8ff46954cb7934d1ccfdef30e772a95 to your computer and use it in GitHub Desktop.
threeExample.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<style> | |
html, body { | |
margin: 0; | |
height: 100%; | |
} | |
#c { | |
width: 100%; | |
height: 100%; | |
display: block; | |
} | |
</style> | |
</head> | |
<body> | |
<canvas id="c"></canvas> | |
<script type="module"> | |
import * as THREE from 'https://threejsfundamentals.org/threejs/resources/threejs/r127/build/three.module.js'; | |
import {OrbitControls} from 'https://threejsfundamentals.org/threejs/resources/threejs/r127/examples/jsm/controls/OrbitControls.js'; | |
import {OBJLoader} from 'https://threejsfundamentals.org/threejs/resources/threejs/r127/examples/jsm/loaders/OBJLoader.js'; | |
import {MTLLoader} from 'https://threejsfundamentals.org/threejs/resources/threejs/r127/examples/jsm/loaders/MTLLoader.js'; | |
function main() { | |
const canvas = document.querySelector('#c'); | |
const renderer = new THREE.WebGLRenderer({canvas}); | |
const fov = 45; | |
const aspect = 2; // the canvas default | |
const near = 0.1; | |
const far = 100; | |
const camera = new THREE.PerspectiveCamera(fov, aspect, near, far); | |
camera.position.set(0, 10, 20); | |
const controls = new OrbitControls(camera, canvas); | |
controls.target.set(0, 5, 0); | |
controls.update(); | |
const scene = new THREE.Scene(); | |
scene.background = new THREE.Color('black'); | |
{ | |
const planeSize = 40; | |
const loader = new THREE.TextureLoader(); | |
const texture = loader.load('https://threejsfundamentals.org/threejs/resources/images/checker.png'); | |
texture.wrapS = THREE.RepeatWrapping; | |
texture.wrapT = THREE.RepeatWrapping; | |
texture.magFilter = THREE.NearestFilter; | |
const repeats = planeSize / 2; | |
texture.repeat.set(repeats, repeats); | |
const planeGeo = new THREE.PlaneGeometry(planeSize, planeSize); | |
const planeMat = new THREE.MeshPhongMaterial({ | |
map: texture, | |
side: THREE.DoubleSide, | |
}); | |
const mesh = new THREE.Mesh(planeGeo, planeMat); | |
mesh.rotation.x = Math.PI * -.5; | |
scene.add(mesh); | |
} | |
{ | |
const skyColor = 0xB1E1FF; // light blue | |
const groundColor = 0xB97A20; // brownish orange | |
const intensity = 1; | |
const light = new THREE.HemisphereLight(skyColor, groundColor, intensity); | |
scene.add(light); | |
} | |
{ | |
const color = 0xFFFFFF; | |
const intensity = 1; | |
const light = new THREE.DirectionalLight(color, intensity); | |
light.position.set(5, 10, 2); | |
scene.add(light); | |
scene.add(light.target); | |
} | |
{ | |
const mtlLoader = new MTLLoader(); | |
mtlLoader.load('https://threejsfundamentals.org/threejs/resources/models/windmill/windmill.mtl', (mtl) => { | |
mtl.preload(); | |
const objLoader = new OBJLoader(); | |
objLoader.setMaterials(mtl); | |
objLoader.load('https://threejsfundamentals.org/threejs/resources/models/windmill/windmill.obj', (root) => { | |
scene.add(root); | |
}); | |
}); | |
} | |
function resizeRendererToDisplaySize(renderer) { | |
const canvas = renderer.domElement; | |
const width = canvas.clientWidth; | |
const height = canvas.clientHeight; | |
const needResize = canvas.width !== width || canvas.height !== height; | |
if (needResize) { | |
renderer.setSize(width, height, false); | |
} | |
return needResize; | |
} | |
function render() { | |
if (resizeRendererToDisplaySize(renderer)) { | |
const canvas = renderer.domElement; | |
camera.aspect = canvas.clientWidth / canvas.clientHeight; | |
camera.updateProjectionMatrix(); | |
} | |
renderer.render(scene, camera); | |
requestAnimationFrame(render); | |
} | |
requestAnimationFrame(render); | |
} | |
main(); | |
</script> | |
</body> | |
</html> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment