马黑PHP整站系统

ThreeJS加载外部模型并运行其自带动画

位置: 首页 > 代码集锦[ 发布时间: 2025.6.3  作者: 马黑  阅读: 39 ]
<div style="margin: 8px auto; position: absolute; color: #eee;">
	<button id="btnPlay" value="btn">暂停/继续动画</button><span> (提示:动画可手动翻转)</span>
</div>

<script type="importmap">
	{
		"imports": {
			"three": "https://unpkg.ihwx.cn/three@0.176.0/build/three.module.js",
			"three/addons/": "https://unpkg.ihwx.cn/three@0.176.0/examples/jsm/"
		}
}
</script>

<script type="module">
    import * as THREE from "three"; // 主模块
    import { OrbitControls } from "three/addons/controls/OrbitControls.js"; // 相机轨道控制器
    import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js"; // GLTF模型加载器

	const scene = new THREE.Scene(); // 场景
	const clock = new THREE.Clock(); // 时钟
	const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000); // 相机
	camera.position.set(5, 0, 10); // 相机位置
	const renderer = new THREE.WebGLRenderer({ antialias: true }); // 渲染器
	renderer.setSize(window.innerWidth, window.innerHeight); // 渲染范围
	//renderer.outputEncoding = THREE.sRGBEncoding; // 保真(可选)
	const controls = new OrbitControls(camera, renderer.domElement); // 加载相机轨道控制器
	document.body.appendChild(renderer.domElement); // 渲染器元素加载到 id="tz" 标签

	scene.add(new THREE.AmbientLight(0xcccccc), new THREE.PointLight(0xffffff, 100)); // 场景加载环境光和点光源

	let mixer; // 动画混合气变量

	// 加载 .gbl 模型
	new GLTFLoader().load('https://638183.freep.cn/638183/web/3models/Parrot.glb', function (gltf) {
		const model = gltf.scene; // 模型节点
		const scale = 0.05; // 模型缩放系数
		model.scale.set(scale, scale, scale); // 模型缩放
		scene.add(model); // 模型节点加入到场景
		mixer = new THREE.AnimationMixer(model); // 动画混合气变量赋值
		// 若模型有动画则运行之
		if (gltf.animations.length > 0) {
			const clip = mixer.clipAction(gltf.animations[0]);
			clip.play();
		}
		animate(); // 运行动画函数
 	});

	// 窗口自适应
	window.onresize = () => {
		camera.aspect = window.innerWidth / window.innerHeight;
		camera.updateProjectionMatrix();
		renderer.setSize(window.innerWidth, window.innerHeight);
	}

	// 动画函数
	function animate() {
		requestAnimationFrame(animate);
		const delta = clock.getDelta(); // 动画频率
		mixer.update(delta); // 更新动画数据
		renderer.render(scene, camera);
	}

	btnPlay.onclick = () => clock.running ? clock.stop() : clock.start(); // 动画交互
</script>
	

前一篇: DeepSeek用canvas制作的石英钟
下一篇: 没有了

发表评论:

       

评论列表 [1条]

#1 | 飞飞 于 2025-6-3 14:18 发布: 天哪,这个飞鸟翅膀上的光影太灵动了吧。。鼠标翻动后发现原来这么大一只。。

Copyright © 2023 All Right Reserved 马黑PHP文章管理整站系统v1.8
联系我们: gxblk@163.com