JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdn.jsdelivr.net/npm/three@0.129.0/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.129.0/examples/js/loaders/GLTFLoader.js"></script>
JavaScript
let camera, scene, renderer, clock, model, target;
const rotationMatrix = new THREE.Matrix4();
const targetQuaternion = new THREE.Quaternion();
const speed = 2;
init();
animate();
function init() {
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.01, 20);
camera.position.set(0, 3, 12);
camera.lookAt(0, 1, 0);
clock = new THREE.Clock();
scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);
const light = new THREE.HemisphereLight(0xbbbbff, 0x444422);
light.position.set(0, 1, 0);
scene.add(light);
const helper = new THREE.GridHelper();
scene.add(helper);
const loader = new THREE.GLTFLoader();
loader.load('https://threejs.org/examples/models/gltf/Soldier.glb', function(gltf) {
model = gltf.scene;
model.children[0].rotation.z = Math.PI;
scene.add(model);
generateTarget();
});
const targetGeometry = new THREE.SphereGeometry(0.2);
const targetMaterial = new THREE.MeshBasicMaterial({
color: 0xff0000
});
target = new THREE.Mesh(targetGeometry, targetMaterial);
scene.add(target);
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.outputEncoding = THREE.sRGBEncoding;
document.body.appendChild(renderer.domElement);
}
function animate() {
requestAnimationFrame(animate);
const delta = clock.getDelta();
if (model !== undefined && !model.quaternion.equals(targetQuaternion)) {
const step = speed * delta;
model.quaternion.rotateTowards(targetQuaternion, step);
}
renderer.render(scene, camera);
}
function generateTarget() {
// generate a random point on a sphere
target.position.x = -5 + (10 * Math.random());
target.position.z = -5 + (10 * Math.random());
// compute target rotation
if (model !== undefined) {
rotationMatrix.lookAt(target.position, model.position, model.up);
...