• three.js r146动态加载fbx文件,非module模式


    模型文件,大家从网上搜索一下直接替换即可,不用询问我要资源的。

    大家直接看正文吧,版本是r146,之前的版本内容不一样。网上有很多现成的例子,大家自行搜索。以下是r146版本的代码,不确认上下兼容多少版本,大家自己可以自行尝试。

    最终效果图如下:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <style>
    7. html, body{
    8. width: 100%;
    9. height: 100%;
    10. margin: 0;
    11. padding: 0;
    12. background-color: transparent;
    13. font-family: Helvetica;
    14. }
    15. #stage, video, canvas{
    16. position: absolute;
    17. top: 0;
    18. left: 0;
    19. width: 500px;
    20. height: 500px;
    21. }
    22. canvas{
    23. z-index: 99;
    24. }
    25. style>
    26. head>
    27. <body>
    28. <canvas id="scene">canvas>
    29. <div id="stage">div>
    30. <script src="./source/three.js">script>
    31. <script src="./source/fflate.min.js">script>
    32. <script src="./source/OrbitControls.js">script>
    33. <script src="./source/FBXLoader.js">script>
    34. <script>
    35. // import * as THREE from "./three.module.js";
    36. const u = navigator.userAgent;
    37. const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; // android终端
    38. const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); // ios终端
    39. const isWeiXin = !!u.match(/MicroMessenger/i); // 微信
    40. let stage = document.querySelector('#stage');
    41. let container, scene, camera, renderer, controls;
    42. let SCREEN_WIDTH = window.innerWidth;
    43. let SCREEN_HEIGHT = window.innerHeight;
    44. const angle = 90;
    45. const nearest = 1;
    46. const farthest = 1000;
    47. let mixers = new Array();
    48. let clock = new THREE.Clock();
    49. init();
    50. function init() {
    51. const name = window.location.search.split("type=")[1] || "";
    52. const fileUrl = `./source/${name}.fbx`;
    53. container = document.createElement('div');
    54. stage.appendChild(container);
    55. // 创建场景
    56. scene = new THREE.Scene();
    57. // 创建相机
    58. camera = new THREE.PerspectiveCamera(angle, SCREEN_WIDTH / SCREEN_HEIGHT, nearest, farthest);
    59. camera.position.set(0, 0, 350);
    60. // 环境光
    61. scene.add(new THREE.AmbientLight(0xFFFFFF));
    62. //生成半球光源
    63. let hemiLight = new THREE.HemisphereLight(0xFFFFFF, 0xFFFFFF, 1);
    64. hemiLight.position.set(0, 0, 0);
    65. hemiLight.groundColor = new THREE.Color(0xFFFFFF);//设置地面发出的光线的颜色
    66. hemiLight.color = new THREE.Color(0xFFFFFF);//设置天空发出的光线的颜色
    67. hemiLight.intensity = 3;
    68. scene.add(hemiLight);
    69. // 点光源
    70. let pointLight = new THREE.PointLight("#FFFFFF");
    71. pointLight.position.set(50 , 50, 50);
    72. pointLight.intensity = 3;
    73. scene.add(pointLight);
    74. // 平行光
    75. let light = new THREE.DirectionalLight(0xFFFFFF, 1);
    76. light.position.set(30 , 50, 50);
    77. scene.add(light);
    78. // 坐标系 xyz 线条
    79. // var axes = new THREE.AxisHelper(30);
    80. // scene.add(axes);
    81. // 加载提示
    82. let manager = new THREE.LoadingManager();
    83. manager.onProgress = function(item, loaded, total){
    84. console.log(item, loaded, total);
    85. };
    86. let onProgress = function(xhr) {
    87. if(xhr.lengthComputable) {
    88. let percentComplete = xhr.loaded / xhr.total * 100;
    89. console.log(Math.round(percentComplete, 2) + '% downloaded');
    90. }
    91. };
    92. let onError = function(xhr) {
    93. console.error(xhr);
    94. };
    95. let fbx_loader = new THREE.FBXLoader(manager);
    96. // fbx静态模型
    97. // fbx_loader.load('666.FBX', function(object){
    98. // object.scale.multiplyScalar(1);
    99. // scene.add(object);
    100. // }, onProgress, onError);
    101. // fbx动画
    102. fbx_loader.load(fileUrl, function(object) {
    103. object.mixer = new THREE.AnimationMixer(object);
    104. mixers.push(object.mixer);
    105. let action = object.mixer.clipAction(object.animations[0]);
    106. action.play();
    107. object.scale.multiplyScalar(1);
    108. object.position.set(-3, 0, 0);
    109. scene.add(object);
    110. }, onProgress, onError);
    111. // 创建渲染器
    112. renderer = new THREE.WebGLRenderer({
    113. antialias: true, // 平滑效果
    114. alpha: true, // canvas背景透明
    115. });
    116. renderer.setPixelRatio(window.devicePixelRatio);
    117. renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    118. renderer.setClearColor("#203864", 1.0);
    119. container.appendChild(renderer.domElement);
    120. // 创建控制器
    121. controls = new THREE.OrbitControls(camera, renderer.domElement);
    122. controls.target.set(0, 0, 0);
    123. animate();
    124. window.addEventListener('resize', onWindowResize, false);
    125. }
    126. function animate(){
    127. requestAnimationFrame(animate);
    128. render();
    129. }
    130. function render(){
    131. let delta = clock.getDelta();
    132. if (mixers.length > 0) {
    133. for (let i = 0; i < mixers.length; i ++) {
    134. mixers[i].update(delta);
    135. }
    136. }
    137. controls.update();
    138. renderer.render( scene, camera );
    139. }
    140. // 窗口改变重置摄像头
    141. function onWindowResize(){
    142. SCREEN_WIDTH = window.innerWidth;
    143. SCREEN_HEIGHT = window.innerHeight;
    144. renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    145. camera.aspect = SCREEN_WIDTH / SCREEN_HEIGHT;
    146. camera.updateProjectionMatrix();
    147. }
    148. script>
    149. body>
    150. html>

  • 相关阅读:
    【C++】内联函数的原理及使用
    学习pandas,应该选择哪本书进行学习?
    【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(9 月 4 日论文合集)
    基于LSTM+FCN处理多变量时间序列问题记录
    还在写增删改查代码?直接一键生成
    毕设 JAVA JSP餐饮管理程序论文
    软件测试面试真题 | TCP为什么要进行三次握手和四次挥手呢?
    【SwiftUI模块】0051、SwiftUI搭建Note笔记应用程序UI,适用于iOS和macOS平台
    软件测试学习-黑马程序员,软件测试学习大纲
    17. 从零开始编写一个类nginx工具, Rust中一些功能的实现
  • 原文地址:https://blog.csdn.net/u011645165/article/details/128189690