当前位置:   article > 正文

threejs 显示stl模型的vue代码 经过我摸索的 每一条代码都有注释 复制粘贴就能用_threejs stl

threejs stl

线图:

点图: 

 

 面图: 

 点、线、面 (下面的代码被的改了   点、线、面只能显示一个)

第一步: 安装three.js 

npm i three

      

第二步 粘贴下面的代码  里面很多代码都有注释

  1. <template>
  2. <div>
  3. <div id="container"></div>
  4. </div>
  5. </template>
  6. <script>
  7. import * as THREE from 'three'
  8. // 引入控制器
  9. import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
  10. // 引入stl加载器
  11. import { STLLoader } from 'three/examples/jsm/loaders/STLLoader.js'
  12. export default {
  13. props: {
  14. // stl文件的数据
  15. stlData: {
  16. type: Object,
  17. default: {
  18. //stl文件一定要放在静态文件(publiuc)下
  19. url: '/MTTU.stl',
  20. // 类型是stl
  21. type: 'stl',
  22. // 缩放
  23. scale: {x: 1, y: 1, z: 1},
  24. // 位置
  25. position: {x: 0, y: 0, z: 0},
  26. // 转轴
  27. rotation: {x: 0, y: 0, z: 0},
  28. // 材质的颜色
  29. materialColor: 0xffffff,
  30. // 这个是点的大小
  31. dotSize: 0.1,
  32. // 需要显示点、线或者面
  33. materialType: 'mesh',//point/line
  34. // 这个是双面显示的意思
  35. // 如果是单面,从正面看得到,从背面看是透明的
  36. side: 'back', //front//back/double
  37. }
  38. },
  39. // 相机的数据
  40. cameraSet: {
  41. type: Object,
  42. default: {
  43. // 设置相机的位置
  44. camera_position_set: {x: 0, y: 5, z: 5},
  45. // 相机的朝向
  46. camera_lookAt: {x: 0, y: 0, z: 0},
  47. }
  48. }
  49. },
  50. data() {
  51. return{
  52. // 场景
  53. scene: null,
  54. //照相机
  55. camera: null,
  56. //渲染器
  57. renderer: null,
  58. // 物体
  59. cube: null,
  60. // 鼠标交互
  61. controls: null,
  62. clock: null,
  63. }
  64. },
  65. mounted() {
  66. this.init()
  67. },
  68. methods: {
  69. init() {
  70. //创建一个转速的 这个我也不知道怎么说
  71. this.clock = new THREE.Clock()
  72. //创建场景
  73. this.createdScene()
  74. // 引入stl文件
  75. if(this.stlData) {
  76. this.loadSTL(this.stlData)
  77. }
  78. // 照相机
  79. this.createdCamera(this.cameraSet)
  80. // 创建渲染器
  81. this.createdRenderer()
  82. //鼠标互动
  83. this.createControls()
  84. this.render()
  85. },
  86. // 场景
  87. createdScene() {
  88. this.scene = new THREE.Scene()
  89. },
  90. //引入stl模型
  91. loadSTL(e) {
  92. console.log("e", e)
  93. const loader = new STLLoader()
  94. // 把模型导入STLLoader加载器中
  95. loader.load(e.url, geometry => {
  96. //创建一个BufferGeometry函数
  97. const geometry1 = new THREE.BufferGeometry();
  98. // geometry.attributes.position.array这个是获取模型的坐标 第二个参数: 3是三个数为一个坐标就是一个顶点
  99. geometry1.setAttribute('position', new THREE.BufferAttribute(geometry.attributes.position.array, 3))
  100. if(e.materialType == 'mesh') {
  101. var material1 = new THREE.MeshBasicMaterial({ color: e.materialColor || 0xff0000, side: e.side })
  102. // 把骨架和材质合成一起构成一个物体 这个是面模型
  103. this.cube = new THREE.Mesh(geometry1, material1)
  104. }
  105. if(e.materialType == 'point') {
  106. var material1 = new THREE.PointsMaterial({ color: e.materialColor || 0xff0000, size: e.dotSize })
  107. // 把骨架和材质合成一起构成一个物体 这个是点模型
  108. this.cube = new THREE.Points(geometry1, material1)
  109. }
  110. if(e.materialType == 'line') {
  111. var material1 = new THREE.LineBasicMaterial({ color: e.materialColor || 0xff0000 });
  112. // 把骨架和材质合成一起构成一个物体 这个是线模型
  113. this.cube = new THREE.Line(geometry1, material1)
  114. }
  115. if(e.position) {
  116. this.cube.position.set(e.position.x || 0, e.position.y || 0, e.position.z || 0)
  117. }
  118. if(e.scale) {
  119. this.cube.scale.set(e.scale.x || 1, e.scale.y || 1, e.scale.z || 1)
  120. }
  121. if(e.rotation) {
  122. this.cube.rotation.set(e.rotation.x || 0, e.rotation.y || 0, e.rotation.z || 0)
  123. }
  124. // this.cube.position.set.x = 5 * Math.PI;//模型摆正 用这个就不用上面的position
  125. // 把物体添加到场景里面
  126. this.scene.add(this.cube)
  127. geometry1.center(); //模型居中 否则看不到模型
  128. })
  129. },
  130. // 照相机
  131. createdCamera(e) {
  132. // 获取照相机的存放节点
  133. const element = document.getElementById('container')
  134. const w = element.clientWidth
  135. const h = element.clientHeight
  136. this.camera = new THREE.PerspectiveCamera(75, w / h, 0.1, 100)
  137. // 设置照相机的位置
  138. this.camera.position.set(e.camera_position_set.x, e.camera_position_set.y, e.camera_position_set.z)
  139. // 设置照相机的朝向
  140. this.camera.lookAt(e.camera_lookAt.x, e.camera_lookAt.y, e.camera_lookAt.z)
  141. },
  142. // 渲染器
  143. createdRenderer() {
  144. // 获取渲染器的渲染节点
  145. const element = document.getElementById('container')
  146. // new一个渲染器
  147. this.renderer = new THREE.WebGLRenderer()
  148. // 这个我也不是很清楚
  149. this.renderer.setSize(element.clientWidth, element.clientHeight)
  150. // this.renderer.render(this.scene, this.camera)
  151. // 渲染器的背景颜色 1是亮度吧 我也不是很清楚
  152. this.renderer.setClearColor(0xcfcfcf, 1)
  153. // 把渲染器丢到节点element的儿子里面
  154. element.appendChild(this.renderer.domElement)
  155. },
  156. // 鼠标交互
  157. createControls() {
  158. // 鼠标的交互
  159. this.controls = new OrbitControls(this.camera, this.renderer.domElement)
  160. },
  161. render() {
  162. const time = this.clock.getElapsedTime()
  163. if (this.cube) {
  164. 模型每次z轴转动time
  165. this.cube.rotation.z = time
  166. }
  167. //把场景和相机放到渲染器里面
  168. this.renderer.render(this.scene, this.camera)
  169. // 循环执行this.render()函数
  170. requestAnimationFrame(this.render)
  171. },
  172. }
  173. }
  174. </script>
  175. <style>
  176. #container {
  177. position: absolute;
  178. width: 100%;
  179. height: 100%;
  180. }
  181. </style>

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