threejs加载三维美女人物模型glb效果
代码语言:html
所属分类:三维
代码描述:threejs加载三维美女人物模型glb效果,美女跟随鼠标移动目光头部
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body, html { margin: 0; padding: 0; background: #25252B; } * { touch-action: manipulation; } *, *:before, *:after { box-sizing: border-box; } body { position: relative; color: white; letter-spacing: 2px; font-size: 11px; font-family: 'Poppins', sans-serif; width: 100%; height: 100vh; } .wrapper { display: flex; flex-direction: column; justify-content: center; align-items: center; } #c { position: absolute; top: 0; width: 100%; height: 100%; display: block; } .loading { position: fixed; z-index: 50; width: 100%; height: 100%; top: 0; left: 0; background: #f1f1f1; display: flex; justify-content: center; align-items: center; } .loader{ -webkit-perspective: 120px; -moz-perspective: 120px; -ms-perspective: 120px; perspective: 120px; width: 100px; height: 100px; } .loader:before{ content: ""; position: absolute; left: 25px; top: 25px; width: 50px; height: 50px; background-color: #9bffaf; animation: flip 1s infinite; } @keyframes flip { 0% { transform: rotate(0); } 50% { transform: rotateY(180deg); } 100% { transform: rotateY(180deg) rotateX(180deg); } } .tutorial-link { position: absolute; display: block; z-index: 100; top: 2em; left: 2em; tranform: translateX(-50%); font-weight: bold; } </style> </head> <body> <!-- The loading element overlays all else until the model is loaded, at which point we remove this element from the DOM --> <div class="loading" id="js-loader"><div class="loader"></div></div> <div class="wrapper"> <!-- The canvas element is used to draw the 3D scene --> <canvas id="c"></canvas> </div> </body> </html> <!-- The main Three.js file --> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.109.js"></script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/GLTFLoader.js"></script> <script > /* Follow the tutorial here: https://tympanus.net/codrops/2019/10/14/how-to-create-an-interactive-3d-character-with-three-js/ */ (function() { // Set our main variables let scene, renderer, camera, model, // Our character neck, // Reference to the neck bone in the skeleton waist, // Reference to the waist bone in the skeleton possibleAnims, // Animations found in our file mixer, // THREE.js animations mixer idle, // Idle, the default state our character returns to clock = new THREE.Clock(), // Used for anims, which run to a clock instead of frame rate currentlyAnimating = false, // Used to check whether characters neck is being used in another anim raycaster = new THREE.Raycaster(), // Used to detect the click on our character loaderAnim = document.getElementById('js-loader'); init(); function init() { const MODEL_PATH = '//repo.bfw.wiki/bfwrepo/threemodel/stacy_lightweight.glb'; const canvas = document.querySelector('#c'); const backgroundColor = 0xf1f1f1; // Init the scene scene = new THREE.Scene(); scene.background = new THREE.Color(backgroundColor); scene.fog = new THREE.Fog(backgroundColor, 60, 100); // Init the renderer renderer = new THREE.WebGLRenderer({ canvas, antialias: true }); renderer.shadowMap.enabled = true; renderer.setPixelRatio(window.devicePixelRatio); document.body.appendChild(renderer.domElement); // Add a camera camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 1000 ); camera.position.z = 30 camera.position.x = 0; camera.position.y = -3; let stacy_txt = new THREE.TextureLoader().load('//repo.bfw.wiki/bfwrepo/image/5fd2d8d91ed08.png'); stacy_txt.flipY = false; const stacy_mtl = new THREE.MeshPhongMaterial({ map: stacy_txt, color: 0xffffff, skinning: true }); var loader = new THREE.GLTFLoader(); loader.load( MODEL_PATH, function(gltf) { model = gltf.scene; let fileAnimations = gltf.animations; model.traverse(o => { if (o.isMesh) { o.castShadow = true; o.receiveShadow = true; o.material = stacy_mtl; } // Reference the neck and waist bones if (o.isBone && o.name === 'mixamorigNeck') { neck = o; } if (o.isBone && o.name === 'mixamorigSpine') { waist = o; } }); model.scale.set(7, 7, 7); model.position.y = -11; scene.add(model); loaderAnim.remove(); mixer = new THREE.AnimationMixer(model); let clips = fileAnimations.filter(val => val.name !== 'idle'); possibleAnims = clips.map(val => { let clip = THREE.AnimationClip.findByName(clips, val.name); clip.tracks.splice(3, 3); clip.tracks.splice(9, 3); clip = mixer.clipAction(clip); return clip; } ); let idleAnim = THREE.AnimationClip.findByName(fileAnimations, 'idle'); idleAnim.tracks.splice(3, 3); idleAnim.tracks.splice(9, 3); idle = mixer.clipAction(idleAnim); idle.play(); }, undefined, // We don't need this function .........完整代码请登录后点击上方下载按钮下载查看
网友评论0