ソースを参照

Examples: Integrate `lookAt()` into the `rotateTowards()` demo. (#31063)

Michael Herzog 8 ヶ月 前
コミット
2ec52a455b

+ 0 - 1
examples/files.json

@@ -534,7 +534,6 @@
 		"misc_exporter_usdz",
 		"misc_exporter_exr",
 		"misc_exporter_ktx2",
-		"misc_lookat",
 		"misc_raycaster_helper"
 	],
 	"css2d": [

+ 0 - 145
examples/misc_lookat.html

@@ -1,145 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<title>three.js misc - lookAt</title>
-		<meta charset="utf-8">
-		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
-		<link type="text/css" rel="stylesheet" href="main.css">
-		<style>
-			body {
-				background-color: #fff;
-				color: #444;
-			}
-
-			a {
-				color: #08b;
-			}
-		</style>
-	</head>
-	<body>
-		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - Object3D.lookAt() example</div>
-
-		<script type="importmap">
-			{
-				"imports": {
-					"three": "../build/three.module.js",
-					"three/addons/": "./jsm/"
-				}
-			}
-		</script>
-
-		<script type="module">
-
-			import * as THREE from 'three';
-
-			import Stats from 'three/addons/libs/stats.module.js';
-
-			let camera, scene, renderer, stats;
-
-			let sphere;
-
-			let mouseX = 0, mouseY = 0;
-
-			let windowHalfX = window.innerWidth / 2;
-			let windowHalfY = window.innerHeight / 2;
-
-			document.addEventListener( 'mousemove', onDocumentMouseMove );
-
-			init();
-
-			function init() {
-
-				camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 15000 );
-				camera.position.z = 3200;
-
-				scene = new THREE.Scene();
-				scene.background = new THREE.Color( 0xffffff );
-
-				sphere = new THREE.Mesh( new THREE.SphereGeometry( 100, 20, 20 ), new THREE.MeshNormalMaterial() );
-				scene.add( sphere );
-
-				const geometry = new THREE.CylinderGeometry( 0, 10, 100, 12 );
-				geometry.rotateX( Math.PI / 2 );
-
-				const material = new THREE.MeshNormalMaterial();
-
-				for ( let i = 0; i < 1000; i ++ ) {
-
-					const mesh = new THREE.Mesh( geometry, material );
-					mesh.position.x = Math.random() * 4000 - 2000;
-					mesh.position.y = Math.random() * 4000 - 2000;
-					mesh.position.z = Math.random() * 4000 - 2000;
-					mesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 4 + 2;
-					scene.add( mesh );
-
-				}
-
-				renderer = new THREE.WebGLRenderer( { antialias: true } );
-				renderer.setPixelRatio( window.devicePixelRatio );
-				renderer.setSize( window.innerWidth, window.innerHeight );
-				renderer.setAnimationLoop( animate );
-				document.body.appendChild( renderer.domElement );
-
-				stats = new Stats();
-				document.body.appendChild( stats.dom );
-
-				//
-
-				window.addEventListener( 'resize', onWindowResize );
-
-			}
-
-			function onWindowResize() {
-
-				windowHalfX = window.innerWidth / 2;
-				windowHalfY = window.innerHeight / 2;
-
-				camera.aspect = window.innerWidth / window.innerHeight;
-				camera.updateProjectionMatrix();
-
-				renderer.setSize( window.innerWidth, window.innerHeight );
-
-			}
-
-			function onDocumentMouseMove( event ) {
-
-				mouseX = ( event.clientX - windowHalfX ) * 10;
-				mouseY = ( event.clientY - windowHalfY ) * 10;
-
-			}
-
-			//
-
-			function animate() {
-
-				render();
-				stats.update();
-
-			}
-
-			function render() {
-
-				const time = Date.now() * 0.0005;
-
-				sphere.position.x = Math.sin( time * 0.7 ) * 2000;
-				sphere.position.y = Math.cos( time * 0.5 ) * 2000;
-				sphere.position.z = Math.cos( time * 0.3 ) * 2000;
-
-				for ( let i = 1, l = scene.children.length; i < l; i ++ ) {
-
-					scene.children[ i ].lookAt( sphere.position );
-
-				}
-
-				camera.position.x += ( mouseX - camera.position.x ) * .05;
-				camera.position.y += ( - mouseY - camera.position.y ) * .05;
-				camera.lookAt( scene.position );
-
-				renderer.render( scene, camera );
-
-			}
-
-		</script>
-
-	</body>
-</html>

BIN
examples/screenshots/misc_lookat.jpg


+ 30 - 4
examples/webgl_math_orientation_transform.html

@@ -26,13 +26,19 @@
 
 			import * as THREE from 'three';
 
+			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
+
 			let camera, scene, renderer, mesh, target;
 
 			const spherical = new THREE.Spherical();
 			const rotationMatrix = new THREE.Matrix4();
 			const targetQuaternion = new THREE.Quaternion();
 			const clock = new THREE.Clock();
-			const speed = 2;
+			const speed = Math.PI / 2;
+
+			const params = {
+				useLookAt: false,
+			};
 
 			init();
 
@@ -78,6 +84,13 @@
 
 				//
 
+				const gui = new GUI();
+
+				gui.add( params, 'useLookAt' );
+				gui.open();
+
+				//
+
 				generateTarget();
 
 			}
@@ -95,10 +108,23 @@
 
 				const delta = clock.getDelta();
 
-				if ( ! mesh.quaternion.equals( targetQuaternion ) ) {
+				if ( mesh.quaternion.equals( targetQuaternion ) === false ) {
+
+					if ( params.useLookAt === true ) {
+
+						// using lookAt() will make the mesh instantly look at the target
+
+						mesh.lookAt( target.position );
+
+					} else {
+
+						// using rotateTowards() will gradually rotate the mesh towards the target
+						// the "speed" variable represents the rotation speed in radians per seconds
+
+						const step = speed * delta;
+						mesh.quaternion.rotateTowards( targetQuaternion, step );
 
-					const step = speed * delta;
-					mesh.quaternion.rotateTowards( targetQuaternion, step );
+					}
 
 				}
 

粤ICP备19079148号