Three.js notas diversas (três) - movimento do objeto

Movimento de objeto

Em three.js, existem duas maneiras de fazer um objeto estacionário mostrar um efeito de movimento:

  1. Deixe a geometria do objeto se mover
  2. Deixe a câmera se mover

Código de teste: deixe o cilindro se mover e a câmera realmente se moverá.
Cilindros podem usar EdgesGeometry para desenhar linhas de fronteira

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>运动</title>
		<script src="js/three.js"></script>
	</head>
	<body>
			<div id="app"></div>
			<script>
				// 创建场景
				var scene = new THREE.Scene();
				// 创建相机   参数:视角、视角比例(宽度和高度比)、最近像素、最远像素
				camera = new THREE.PerspectiveCamera(105,
					window.innerWidth / window.innerHeight, 1, 1000);	
				// 渲染器
				render = new THREE.WebGLRenderer({
					antialias: true
				});
				// 计算处理dpi
				render.setPixelRatio(window.devicePixelRatio);
				// 设置画布大小
				render.setSize(window.innerWidth, window.innerHeight)
				
				var app = document.getElementById("app");
				// 绘制出一个canvas小面板
				app.appendChild(render.domElement);
				
				// 创造一个立方体, 点模型
				var geometry = new THREE.CylinderGeometry(10, 10, 20, 15); //创建一个立方体几何对象Geometry
				// 创造一个立方体, 网格模型
				var material3 = new THREE.MeshBasicMaterial({
					color: 0xffff00,
				}); 
				var meshs = new THREE.Mesh(geometry, material3);
				// 创建物体的边框线
				var geoEdges = new THREE.EdgesGeometry(geometry, 1);
				var edgesMtl =  new THREE.LineBasicMaterial({color: 0xff0000});
				var geoLine = new THREE.LineSegments(geoEdges, edgesMtl);
				
				meshs.add(geoLine);
				scene.add(meshs);
				//执行渲染操作   指定场景、相机作为参数
				camera.position.z = 40;
				camera.position.y = 20;
				camera.position.x = 0;
				render.render(scene, camera);
				
				// 产生动效
				function animate(){
					// 1.照相机移动
					camera.position.y -= 0.05;
					if(camera.position.y < -10) {
						camera.position.z += 0.05;
					}
					
					render.render(scene, camera);
				}
				setInterval(animate,10);
		</script>
	</body>
</html>

Efeito:
Cilindro simula o efeito de vôo das lanternas Kongming
se o objeto deve se mover, apenas modifique ligeiramente a função de movimento

// 产生动效
function animate(){
    
    
	// if(camera.position.y >= -1000){
    
    
	// 	// 1.照相机移动
	// 	camera.position.y -= 0.3;
	// 	if(camera.position.y < -10) {
    
    
	// 		camera.position.z += 0.3;
	// 	}
	// }
	//2.物体移动
	meshs.position.y += 0.3;
	if(meshs.position.y > 10) {
    
     
		meshs.position.z -= 0.3;
	}
	render.render(scene, camera);
	window.requestAnimationFrame(animate);
}

atuação

Na vida real, muitas vezes você pode ver os efeitos de animação desenhados e alguns efeitos de animação parecem muito suaves, e alguns estão muito atrasados. Eles estão intimamente relacionados ao desempenho do programa após o exercício.


Em relação ao desempenho: teste um programa para ver se há um gargalo no desempenho. No mundo 3D, o conceito de número de quadros é frequentemente usado. Primeiro, vamos definir o significado do número de quadros.

Número de quadros: o processador gráfico pode atualizar várias vezes por segundo, geralmente expresso em fps (quadros por segundo)

Movimento do objeto no olho humano:
quando o objeto está se movendo rapidamente, quando a imagem vista pelo olho humano desaparece, o olho humano pode continuar a reter a imagem da imagem por cerca de 1/24 de segundo. Esse fenômeno é chamado de persistência da visão . É uma propriedade do olho humano. Quando o olho humano vê um objeto, ele é visualizado na retina e introduzido no cérebro humano pelo nervo óptico para sentir a imagem do objeto. Quadro após quadro de imagens entram no cérebro humano, e o cérebro humano conecta essas imagens para formar uma animação.

Em three.js, para que possamos ver melhor esses dados, podemos usar o monitor de desempenho Stats para detectar e gerenciar o movimento.

Estatísticas do Monitor de Desempenho

Sobre a introdução oficial do Stats: https://github.com/mrdoob/stats.js
também pode ser encontrado na pasta após o download do Three.js, o download do GitHub pode ser um pouco lento, eu baixei do gitee. Forneça alguns links:
endereço de
download three.js 01 endereço de download three.js 02 endereço
GitHub
Insira a descrição da imagem aqui
Lembre - se de importar o arquivo de estatísticas ao usá-
lo.Geralmente , o efeito do uso é o seguinte: 1. Função SetMode

Quando o parâmetro é 0, significa que a interface FPS é exibida, e quando o parâmetro é 1, significa que a interface MS é exibida.

2 、 estatísticas 的 domElement

O domElement de estatísticas representa o destino do desenho (DOM) e o gráfico da forma de onda é desenhado nele.

3. A função inicial das estatísticas

begin, chame a função begin antes do código que deseja testar e chame a função end () depois que seu código for executado, para que você possa contar o número médio de quadros executados por esse código.
Insira a descrição da imagem aqui
Como usar: basta inserir no código

  1. novo um objeto de estatísticas, código: stats = new Stats ();

  2. Adicione este objeto à página html

  3. Chame a função stats.update () para contar o tempo e o número de quadros

// 性能监视器
var stats = new Stats();
stats.setMode(0); // 0: fps, 1: ms
// 将stats的界面对应左上角
stats.domElement.style.position = 'absolute';
stats.domElement.style.left = '30px';
stats.domElement.style.top = '0px';
app.appendChild( stats.domElement );

// 在运动函数中写入stats.update();
function animate(){
    
    
	if(camera.position.y >= -1000){
    
    
		// 1.照相机移动
		camera.position.y -= 0.3;
		if(camera.position.y < -10) {
    
    
			camera.position.z += 0.3;
		}
	}
	render.render(scene, camera);
	window.requestAnimationFrame(animate);
	stats.update();
}

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/qq_36171287/article/details/110874034
Recomendado
Clasificación