• vue2+three.js+blender(实现3d 模型引入并可点击效果)


    2023.9.13今天我学习了如何把3d建模里面的模型引入到vue中,并可以实现拖动,点击的效果:

    首先安装:

    npm install three

    相关代码如下:

    1. <template>
    2. <div>
    3. <div id="content"/>
    4. div>
    5. template>
    6. <script>
    7. import * as THREE from 'three'
    8. import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader';
    9. import {OrbitControls} from "three/examples/jsm/controls/OrbitControls"; //鼠标控制器
    10. export default {
    11. data() {
    12. return {
    13. scene: null,//场景
    14. camera: null,//照相机
    15. renderer: null,//渲染器
    16. raycaster: null,
    17. mesh: null,//物体
    18. mouse: null,
    19. onCLick: null,
    20. childList: null,
    21. light: null,//灯光
    22. cuModel: "", //当前选中模型
    23. mouseControls: null, //轨道控制
    24. pointLight: null, //点光源
    25. ambientLight: null, //环境光
    26. num: 0,//点击次数
    27. }
    28. },
    29. mounted() {
    30. this.init()
    31. window.addEventListener("click", this.onClick, false);
    32. },
    33. methods: {
    34. init() {
    35. // 创建场景
    36. this.createScene()
    37. // 创建照相机
    38. this.createCamera()
    39. // 创建渲染器
    40. this.createRenderer()
    41. // 创建灯光
    42. this.createLight()
    43. // 创建控制器
    44. this.createOrbitControls();
    45. // 创建物体
    46. this.createMesh()
    47. // 触发
    48. this.render()
    49. },
    50. // 创建场景
    51. createScene() {
    52. this.scene = new THREE.Scene()
    53. },
    54. // 创建照相机
    55. createCamera() {
    56. this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
    57. this.camera.position.set(200, 200, 200)
    58. this.camera.lookAt(this.scene.position)
    59. },
    60. // 创建渲染器
    61. createRenderer() {
    62. this.renderer = new THREE.WebGLRenderer()
    63. this.renderer.setSize(window.innerWidth, window.innerHeight)
    64. this.renderer.setClearColor(new THREE.Color(0xffffff))
    65. document.getElementById('content').appendChild(this.renderer.domElement)
    66. },
    67. // 创建灯光
    68. createLight() {
    69. this.light = new THREE.DirectionalLight({
    70. color: 'red'
    71. })
    72. this.light.position.set(100, 100, 100)
    73. this.scene.add(this.light)
    74. },
    75. // 创建物体
    76. createMesh() {
    77. let lm = new Promise((resolve, reject) => {
    78. let loader = new GLTFLoader();
    79. loader.load('model/bear.glb', (gltf) => {
    80. resolve(gltf);
    81. })
    82. })
    83. lm.then((res) => {
    84. res.scene.position.set(
    85. -100, 0, 0
    86. )
    87. res.scene.scale.set(20, 20, 20)
    88. res.scene.userData = {id: 1, name: 'bear'}
    89. this.scene.add(res.scene)
    90. this.render()
    91. })
    92. },
    93. //触发
    94. render() {
    95. this.renderer.render(this.scene, this.camera)
    96. },
    97. //创建轨道控制
    98. createOrbitControls() {
    99. //没有缩放阻尼
    100. this.mouseControls = new OrbitControls(
    101. this.camera,
    102. this.renderer.domElement
    103. ); //创建控件对象
    104. this.mouseControls.addEventListener('change', () => {
    105. this.renderer.render(this.scene, this.camera)
    106. })
    107. },
    108. onClick(event) {
    109. this.raycaster = new THREE.Raycaster();
    110. this.mouse = new THREE.Vector2();
    111. this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1
    112. this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1
    113. this.raycaster.setFromCamera(this.mouse, this.camera);
    114. const intersects = this.raycaster.intersectObjects(this.scene.children, true);
    115. if (intersects.length > 0) {
    116. const clickedObject = intersects[0].object;
    117. if (clickedObject.name === clickedObject.name) {
    118. switch (this.num) {
    119. case 0:
    120. clickedObject.material.color.set(0xff0000)
    121. this.num++;
    122. break;
    123. case 1:
    124. clickedObject.material.color.set(0x00ff00)
    125. this.num++;
    126. break;
    127. case 2:
    128. clickedObject.material.color.set(0xFFFF00)
    129. this.num++;
    130. break;
    131. default:
    132. clickedObject.material.color.set(0x0000FF)
    133. this.num -= 3
    134. }
    135. this.render()
    136. }
    137. }
    138. }
    139. }
    140. }
    141. script>

     如果没有图片可以去

    Three.js--》建模软件如何加载外部3D模型?_threejs加载3d模型_亦世凡华、的博客-CSDN博客

  • 相关阅读:
    adb驱动和adb工具官方下载链接
    异步性能不如同步?通过压测讨论应该如何设置线程数
    微信小程序项目源代码SSM英语学习平台
    考研数据结构大题整合_组二(TJP组)
    redis启动和简单使用
    GoLand软件编码区中出现英文输入异常解决方法
    Docker使用过程中经常遇见的问题
    Tomcat的安装与Maven依赖Servlet的使用
    关于在3dsmax中制作的模型导入UE后尺寸大小不对的问题
    Linux per-cpu
  • 原文地址:https://blog.csdn.net/qq_53986004/article/details/132848344