当前位置:   article > 正文

ThreeJS-VUE-3DMax 实现Web3D(简单测试)_如何将3dmax结合前端

如何将3dmax结合前端

        今天使用3DMax建模软件进行3D模型的制作,并且加入动画,通过threejs将模型及其动画部署在VUE框架上。

一、环境及其开发包版本

        1. VUE:3.3.4

        2. threejs:0.158.0

        3. vite:4.4.11

        4. 3DMax2021

        5. pycharm2021专业版

二、3DMax模型制作

        简单制作一个小植物和一个水壶,实现浇水后植物长大的动画。

       UV展开,加个材质,上个颜色。

三、项目搭建

        项目使用VUE框架。使用命令“npm init vue@latest”创建一个vue项目,并使用命令“npm i three”安装threejs。

        在vue文件中引入JavaScript文件。

        ttt.js文件代码如下:

  1. import * as THREE from "three"
  2. import {OrbitControls} from "three/addons/controls/OrbitControls.js";
  3. import {GLTFLoader} from "three/addons/loaders/GLTFLoader.js";
  4. let width = window.innerWidth
  5. let height = window.innerHeight
  6. const scene = new THREE.Scene()
  7. scene.background = new THREE.Color(0x7F7F61)
  8. const camera = new THREE.PerspectiveCamera(60, width / height)
  9. camera.position.set(-3, 10, 10)
  10. camera.lookAt(0, 0, 0)
  11. scene.add(camera)
  12. const aLignt = new THREE.AmbientLight(new THREE.Color(0xffffff), 2)
  13. scene.add(aLignt)
  14. const pointLight = new THREE.PointLight(new THREE.Color(0xffffff), 2, 0, 0)
  15. pointLight.position.set(15, 15, 15)
  16. scene.add(pointLight)
  17. const axes = new THREE.AxesHelper(50)
  18. // scene.add(axes)
  19. const spriteMaterial = new THREE.SpriteMaterial({
  20. map: new THREE.TextureLoader().load('./src/assets/水滴.png'),
  21. transparent: true,
  22. opacity: 0.3
  23. })
  24. const groups = new THREE.Group()
  25. let spritey = 2.91
  26. let spriteflag = false
  27. for (let i = 0; i < 200; i++) {
  28. const sprite = new THREE.Sprite(spriteMaterial)
  29. sprite.scale.set(0.1, 0.2, 0.1)
  30. const x = Math.random() - Math.random()
  31. const y = Math.random() * spritey
  32. // const y = spritey
  33. const z = Math.random() - Math.random()
  34. sprite.position.set(x, y, z)
  35. groups.add(sprite)
  36. }
  37. let ganzi, yezi1, yezi2, yezi3, yezi4, huapen
  38. const group = new THREE.Group()
  39. group.name = 'group'
  40. let geometry, mesh
  41. let track1, track2, track3, track4, track5
  42. let clip, mixer, actionAnimation, clock
  43. const loader = new GLTFLoader();
  44. loader.load('./src/assets/1111.glb', gltf => {
  45. console.log(gltf)
  46. // gltf.scene.scale.set(5,5,5)
  47. group.add(gltf.scene)
  48. scene.add(group)
  49. huapen = group.getObjectByName('花盆')
  50. yezi1 = group.getObjectByName('叶子1')
  51. yezi2 = group.getObjectByName('叶子2')
  52. yezi3 = group.getObjectByName('叶子3')
  53. yezi4 = group.getObjectByName('叶子4')
  54. ganzi = group.getObjectByName('杆子')
  55. mixer = new THREE.AnimationMixer(group)
  56. actionAnimation = mixer.clipAction(gltf.animations[0])
  57. actionAnimation.timeScale = 0
  58. actionAnimation.clampWhenFinished = true
  59. actionAnimation.loop = THREE.LoopOnce
  60. actionAnimation.play()
  61. clock = new THREE.Clock()
  62. })
  63. let mixershuihu, actionanimationshuihu, c1
  64. loader.load('./src/assets/11111.glb', gltf => {
  65. console.log(gltf)
  66. group.add(gltf.scene.getObjectByName('水壶'))
  67. group.getObjectByName('水壶').visible = false
  68. mixershuihu = new THREE.AnimationMixer(group.getObjectByName('水壶'))
  69. actionanimationshuihu = mixershuihu.clipAction(gltf.animations[0])
  70. actionanimationshuihu.timeScale = 4
  71. actionanimationshuihu.clampWhenFinished = false
  72. actionanimationshuihu.loop = THREE.LoopOnce
  73. c1 = new THREE.Clock()
  74. mixershuihu.addEventListener('finished', e => {
  75. group.getObjectByName('水壶').visible = false
  76. actionanimationshuihu.stop()
  77. scene.remove(groups)
  78. spriteflag = false
  79. })
  80. })
  81. const renderer = new THREE.WebGLRenderer({antialias: true})
  82. renderer.setSize(width, height)
  83. renderer.domElement.style.position = 'absolute'
  84. renderer.domElement.style.top = '0'
  85. renderer.domElement.style.left = '0'
  86. renderer.domElement.style.bottom = '0'
  87. renderer.domElement.style.right = '0'
  88. renderer.domElement.style.zIndex = '-1'
  89. let select = 0
  90. const btn = document.getElementById('add')
  91. btn.addEventListener('click', function () {
  92. if (select !== 2) {
  93. select++
  94. } else {
  95. select = 0
  96. }
  97. group.getObjectByName('水壶').visible = true
  98. actionanimationshuihu.play()
  99. groups.traverse(m => {
  100. m.position.y = Math.random() * spritey
  101. })
  102. scene.add(groups)
  103. spriteflag = true
  104. })
  105. const control = new OrbitControls(camera, renderer.domElement);
  106. (function animation() {
  107. if (mixer && clock) {
  108. mixer.update(clock.getDelta())
  109. if (select === 1) {
  110. actionAnimation.timeScale = 1
  111. if (clock.getElapsedTime() >= 5) {
  112. actionAnimation.timeScale = 0
  113. }
  114. } else if (select === 2) {
  115. actionAnimation.timeScale = 1
  116. if (clock.getElapsedTime() >= 22) {
  117. actionAnimation.timeScale = 0
  118. }
  119. }
  120. }
  121. if (mixershuihu && c1) {
  122. mixershuihu.update(c1.getDelta())
  123. }
  124. if (spriteflag) {
  125. groups.traverse(m => {
  126. if (m.position.y >= 0.2) {
  127. m.position.y -= 0.02
  128. }
  129. })
  130. }
  131. renderer.render(scene, camera)
  132. requestAnimationFrame(animation)
  133. })();
  134. window.onresize = () => {
  135. camera.aspect = window.innerWidth / window.innerHeight
  136. camera.updateProjectionMatrix()
  137. renderer.setSize(window.innerWidth, window.innerHeight)
  138. }
  139. document.getElementById('data-three-js').appendChild(renderer.domElement)

四、效果图

        项目搭建完毕,使用命令“npm run dev”运行。

        点击浇水按钮,实现浇水后植物长大效果,效果图如下:

         

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/96826
推荐阅读
相关标签
  

闽ICP备14008679号