vue 使用Three.js 加载第三方模型

该文描述了一个Vue项目中使用Three.js库加载FBX模型的过程。首先在rangmodel.vue组件中引入sims子组件,然后在simulation/index.vue中进行Three.js的初始化,包括创建渲染器、相机、光源,并通过FBXLoader加载模型。模型文件存储在public/models目录下,同时应用OrbitControls实现模型的视角控制。
摘要由CSDN通过智能技术生成

环境:vue2.6 + three.js

1.创建rangmodel.vue 

<template>
  <div>
    <div id="rangeThree_wrap">

      <div class="rangeThree_scene_box">
        <sims />
      </div>

    </div>
  </div>
</template>
<script>
import sims from "@/components/simulation/index";

export default {
  data() {
    return {

    };
  },
  components: {
    sims,
  },
  methods: {



  },
  created() {

  },
};
</script>
<style scoped>

#rangeThree_wrap {
  width: 100%;

  height: 100%;
  position: absolute;
  background: gray;

}
</style>

2.在src/components下创建文件夹simulation,并创建vue文件index.vue

<template>
    <div id="simulation_wrap">
      <!-- <div
        class="contorlBtn"
        @click="handleSimsBtn()"
  
      >
        {{ btnValue }}
      </div> -->
      <div id="canvasBox" />
    </div>
  </template>

<script>

import * as Three from "three";
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader.js";
// import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
export default {
    name: "sims",
  data() {
    return {
    loading: true,
    scene: new Three.Scene(),
    };
  },

  mounted(){
    this.threeInit();

  },

  methods: {
    threeInit() {
        // 获取canvasBox元素
        const threeBox = document.getElementById("canvasBox");
        // 创建渲染器
        const renderer = new Three.WebGLRenderer({
        antialias: true,
        alpha: true,
      });


    // renderer.setClearColor(new Three.Color(0x515145));
    renderer.setSize(1210, 850);
     // 设置像素比
    renderer.setPixelRatio(window.devicePixelRatio);

    // 创建相机
    const camera = new Three.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 100000);
    camera.position.x = 0;
    camera.position.y = 300;
    camera.position.z = 390;
    camera.lookAt(this.scene.position);


    window.addEventListener('resize', () => {
    // 更新宽高比
    camera.aspect = window.innerWidth / window.innerHeight
    // 更新相机的投影矩阵
    camera.updateProjectionMatrix()

    renderer.setSize(window.innerWidth, window.innerHeight)
    // 设置像素比
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
  })


    //   创建光源
    const hlight = new Three.HemisphereLight(0xffffff);
      hlight.position.set(10, 100, 0);
      this.scene.add(hlight);

      const dlight = new Three.DirectionalLight(0xffffff);
      dlight.position.set(100, 100, 0);
      dlight.castShadow = true;
      this.scene.add(dlight);
      // 实例化一个FBXLoader对象
      const loader = new FBXLoader();
      // 实例化一个FBXLoader对象


// 加载fbx文件
loader.load('/models/beijing.fbx', (model) => {

  // 将模型添加到场景中
  this.scene.add(model);

}, (event) => {

  // 控制台打印加载进度
  console.log((event.loaded / event.total * 100) + '% loaded');

}, (error) => {

  // 控制台打印加载失败
  console.error(error);

});

    //   var url = "/models/beijing.fbx";
    //   loader.load(
    //     url,
    //     (fbx) => {
    //     fbx.scene.scale.set(1600, 1600, 1600); //  设置模型大小缩放

    //       this.scene.add(fbx.scene);

    //       this.loading = false;
    //     },
    //     (xhr) => {
    //       console.log((xhr.loaded / xhr.total) * 100 + "% loaded");
    //     },
    //     (error) => {
    //       console.error(error);
    //     }
    //   );
      
      threeBox.appendChild(renderer.domElement);
      renderer.render(this.scene, camera);

      const controls = new OrbitControls(camera, renderer.domElement);
      const render = () => {
        controls.update();
        requestAnimationFrame(render);
        this.scene.rotateY(0.001);
        renderer.render(this.scene, camera);
      };

      controls.addEventListener("change", () => {
        renderer.render(this.scene, camera);
      });
      render();
    }


  },
  created() {
 
  },
};
</script>



<style scoped>
.loading_wrap {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 9;
  background-color: #515151;
  color: #ffffff;
}
</style>

3.模型存放路径:我使用的FBX格式的文件,要在public下创建models,里面放你要使用的模型。不然会报错。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue.js是一个用于构建用户界面的JavaScript框架,而Three.js是一个用于创建3D图形的JavaScript库。如果你想在Vue.js使用Three.js加载DXF文件,可以按照以下步骤进行操作: 1. 首先,确保你已经在Vue.js项目中引入了Three.js库。你可以通过在HTML文件中添加`<script>`标签来引入Three.js,或者使用npm安装并在Vue组件中导入。 2. 创建一个Vue组件,用于加载和显示DXF文件。你可以在该组件的`mounted`生命周期钩子函数中进行Three.js的初始化和DXF文件的加载。 3. 在`mounted`钩子函数中,创建一个Three.js场景、相机和渲染器。你可以使用`THREE.Scene`、`THREE.PerspectiveCamera`和`THREE.WebGLRenderer`来创建它们。 4. 使用Three.js提供的DXFLoader插件加载DXF文件。你可以通过使用`THREE.DXFLoader`来加载DXF文件,并将其添加到场景中。 5. 设置相机和渲染器的参数,以及场景中的光照等其他设置。 6. 在渲染循环中更新场景和相机,并在每一帧中调用渲染器的`render`方法来渲染场景。 下面是一个简单的示例代码: ```vue <template> <div ref="container"></div> </template> <script> import * as THREE from 'three'; import { DXFLoader } from 'three/examples/jsm/loaders/DXFLoader'; export default { mounted() { // 创建场景 const scene = new THREE.Scene(); // 创建相机 const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); camera.position.z = 5; // 创建渲染器 const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); this.$refs.container.appendChild(renderer.domElement); // 创建光源 const light = new THREE.PointLight(0xffffff, 1); light.position.set(0, 0, 5); scene.add(light); // 加载DXF文件 const loader = new DXFLoader(); loader.load('path/to/your/dxf/file.dxf', (dxf) => { scene.add(dxf); }); // 渲染循环 function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } animate(); }, }; </script> ``` 请注意,上述代码只是一个简单的示例,你可能需要根据你的具体需求进行修改和扩展。另外,确保你已经正确安装了Three.js和DXFLoader插件,并将路径替换为你的DXF文件的实际路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷人仄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值