JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdn.jsdelivr.net/npm/three@0.141/build/three.min.js"></script>
JavaScript
let clock;
let scene, camera, renderer, mixer;
init();
animate();
function init() {
scene = new THREE.Scene();
//
camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(4, 4, 4);
camera.lookAt(scene.position);
//
const axesHelper = new THREE.AxesHelper();
scene.add(axesHelper);
//
const geometry = new THREE.ConeGeometry(0.5, 2);
geometry.rotateX(Math.PI * 0.5)
const material = new THREE.MeshNormalMaterial();
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
// set up rotation about x axis
const xAxis = new THREE.Vector3(0, 1, 0);
const q1 = new THREE.Quaternion().setFromAxisAngle(xAxis, 0);
const q2 = new THREE.Quaternion().setFromAxisAngle(xAxis, Math.PI);
const q3 = new THREE.Quaternion().setFromAxisAngle(xAxis, Math.PI * 2);
const quaternionKF = new THREE.QuaternionKeyframeTrack('.quaternion', [0, 1, 2], [q1.x, q1.y, q1.z, q1.w, q2.x, q2.y, q2.z, q2.w, q3.x, q3.y, q3.z, q3.w]);
const clip = new THREE.AnimationClip('Action', 3, [quaternionKF]);
mixer = new THREE.AnimationMixer(mesh);
const clipAction = mixer.clipAction(clip);
clipAction.play();
//
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
//
clock = new THREE.Clock();
//
window.addEventListener('resize', onWindowResize);
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function animate() {
requestAnimationFrame(animate);
render();
}
function render() {
const delta = clock.getDelta();
if (mixer) {
mixer.update(delta);
}
renderer.render(scene, camera);
}