ThreeJS导入gltf模型和切换动画

2024-02-12 12:30

本文主要是介绍ThreeJS导入gltf模型和切换动画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近尝试把带有动画的gltf模型导入,并控制多个动画的切换播放。
效果如下:
请添加图片描述主要代码如下,没有定义的函数都是《Three.js开发指南》里的,借用了一下。

function init() {
//场景设置var stats = initStats();var renderer = initRenderer();renderer.setClearColor(0x262626);var camera = initCamera();var scene = new THREE.Scene();scene.add(new THREE.AmbientLight(0xFFFFFF, 0.3));var dirLight = new THREE.DirectionalLight(0xBBFFFF, 2);dirLight.position.set(0, 0, 10);scene.add(dirLight);camera.position.set(0, 0, 20);var orbitControls = new initOrbitControls(camera, renderer);var clock = new THREE.Clock();var actions = [];var mixer = new THREE.AnimationMixer();var clipActionvar animationClipvar meshvar controlsvar mixerControls = {time: 0,timeScale: 1,stopAllAction: function () { mixer.stopAllAction() },animation: 'None',}//导入模型和动画var loader = new THREE.GLTFLoader();loader.load('../../assets/punk_girl/scene.gltf', function (result) {//调整result.scene.scale.set(8, 8, 8);result.scene.translateY(-10);scene.add(result.scene)// setup the mixermixer = new THREE.AnimationMixer(result.scene);//用actions储存所有动画for (var i = 0; i < result.animations.length; i++) {actions[i] = mixer.clipAction(result.animations[i]);}// add the animation controlsenableControls();});function enableControls() {var gui = new dat.GUI();//用dat gui来实现控制组件//一些控制选项var mixerFolder = gui.addFolder("AnimationMixer")mixerFolder.add(mixerControls, "time").listen()mixerFolder.add(mixerControls, "timeScale", 0, 5).onChange(function (timeScale) { mixer.timeScale = timeScale });mixerFolder.add(mixerControls, "stopAllAction").listen()gui.add(mixerControls, "animation", ['mixamo.com', 'Dancing', 'Idle', 'PettingAnimal', 'Talking', 'Walk', 'WavingGesture', 'None']).onChange(function (animation) {for (var i = 0; i < actions.length; i++) {if (animation == actions[i].getClip().name) {actions[i].play();}else {actions[i].stop();}}})}render();function render() {stats.update();var delta = clock.getDelta();orbitControls.update(delta);requestAnimationFrame(render);renderer.render(scene, camera)mixer.update(delta);}}

借用的函数:

/*** Initialize the statistics domelement* * @param {Number} type 0: fps, 1: ms, 2: mb, 3+: custom* @returns stats javascript object*/
function initStats(type) {var panelType = (typeof type !== 'undefined' && type) && (!isNaN(type)) ? parseInt(type) : 0;var stats = new Stats();stats.showPanel(panelType); // 0: fps, 1: ms, 2: mb, 3+: customdocument.body.appendChild(stats.dom);return stats;
}
/*** Initialize a simple default renderer and binds it to the "webgl-output" dom
* element.* * @param additionalProperties Additional properties to pass into the renderer*/
function initRenderer(additionalProperties) {var props = (typeof additionalProperties !== 'undefined' && additionalProperties) ? additionalProperties : {};var renderer = new THREE.WebGLRenderer(props);renderer.shadowMap.enabled = true;renderer.shadowMapSoft = true;renderer.shadowMap.type = THREE.PCFSoftShadowMap;renderer.setClearColor(new THREE.Color(0x000000));renderer.setSize(window.innerWidth, window.innerHeight);renderer.shadowMap.enabled = true;document.getElementById("webgl-output").appendChild(renderer.domElement);return renderer;
}
/*** Initialize a simple camera and point it at the center of a scene* * @param {THREE.Vector3} [initialPosition]*/
function initCamera(initialPosition) {var position = (initialPosition !== undefined) ? initialPosition : new THREE.Vector3(-30, 40, 30);var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.copy(position);camera.lookAt(new THREE.Vector3(0, 0, 0));return camera;
}function initOrbitControls(camera, renderer) {var orbitControls = new THREE.OrbitControls(camera, renderer.domElement);orbitControls.rotateSpeed = 1.0;orbitControls.zoomSpeed = 1.2;orbitControls.panSpeed = 0.8;orbitControls.noZoom = false;orbitControls.noPan = false;orbitControls.staticMoving = true;orbitControls.dynamicDampingFactor = 0.3;orbitControls.keys = [65, 83, 68];return orbitControls;
}

这篇关于ThreeJS导入gltf模型和切换动画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702593

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

Spring Boot实现多数据源连接和切换的解决方案

《SpringBoot实现多数据源连接和切换的解决方案》文章介绍了在SpringBoot中实现多数据源连接和切换的几种方案,并详细描述了一个使用AbstractRoutingDataSource的实... 目录前言一、多数据源配置与切换方案二、实现步骤总结前言在 Spring Boot 中实现多数据源连接

Python模块导入的几种方法实现

《Python模块导入的几种方法实现》本文主要介绍了Python模块导入的几种方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录一、什么是模块?二、模块导入的基本方法1. 使用import整个模块2.使用from ... i

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript