vue3引入three.js渲染3D模型图

本文介绍了如何在Vue应用中使用three.js库创建3D场景,包括引入文件、创建渲染容器、设置场景、相机、光照及加载3D模型,同时展示了如何处理设备像素比和相机调整。
摘要由CSDN通过智能技术生成

1.引入three.js文件

npm install three

2.组件内使用three

import * as THREE from 'three'

3.创建3D图渲染容器

<template>

    <canvas id="three"></canvas>

</template>

 4.创建场景对象Scene

const scene = new THREE.Scene()

 5.设置scene背景(根据自己的背景颜色设置,我这里是#eee)

  scene.background = new THREE.Color("#eee")

6. 根据id获取元素

const threeDemo = document.getElementById("three")

7. 创建渲染器对象

const renderer = new THREE.WebGLRenderer({canvas: threeDemo, antialias: true})

8.建立透视投影相机

    const camera = new THREE.PerspectiveCamera(

      30,

      window.innerWidth / window.innerHeight,

      0.1,

      1000

    )

    camera.position.z = 10

9. 引入OrbitControls 创建鼠标左中右操作和键盘方向键操作

 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"

 function resizeDevicePixel(renderer) {

      const canvas = renderer.domElement

        let width = window.innerWidth

        let height = window.innerHeight

        let devicePixelWidth = canvas.width / window.devicePixelRatio

        let devicePixelHeight = canvas.height / window.devicePixelRatio

        const needResize = devicePixelWidth !== width || devicePixelHeight !== height

        if (needResize) {

          renderer.setSize(width, height, false)

        }

        return needResize

    }

    const controls = new OrbitControls(camera, renderer.domElement);

    function annimate() {

      renderer.render(scene, camera);

      requestAnimationFrame(annimate);

      // 添加以下代码

      if(resizeDevicePixel(renderer)) {

        const canvas = renderer.domElement;

        camera.aspect = canvas.clientWidth / canvas.clientHeight;

        camera.updateProjectionMatrix();

      }

      controls.update()

    }

    annimate()

10. 引入GLTFLoader,渲染3D.glb图,并设置光照

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'

 const gltfLoader = new GLTFLoader();

  gltfLoader.load("3d.glb", (gltf) => {

    let model = gltf.scene;

    // 纹理

const ambientLight = new THREE.AmbientLight(0xffffff,1);

const directionalLight = new THREE.DirectionalLight(0xffffff, 3.5);//光源,color:灯光颜色,intensity:光照强度

directionalLight.position.set(400, 200, 300);

    scene.add(model,ambientLight,directionalLight);

  })

};

 11.3D存放位置public文件夹下面

渲染效果图

完整代码:

<template>

    <canvas id="three"></canvas>

</template>


 

<script setup>

import { onMounted, ref } from 'vue';

import * as THREE from 'three';

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

  function initThree() {

    const scene = new THREE.Scene();

    scene.background = new THREE.Color("#eee");

    const threeDemo = document.getElementById("three");

    const renderer = new THREE.WebGLRenderer({canvas: threeDemo, antialias: true});

    const camera = new THREE.PerspectiveCamera(

      30,

      window.innerWidth / window.innerHeight,

      0.1,

      1000

    )

    camera.position.z = 10;

    function resizeDevicePixel(renderer) {

      const canvas = renderer.domElement

        let width = window.innerWidth

        let height = window.innerHeight

        let devicePixelWidth = canvas.width / window.devicePixelRatio

        let devicePixelHeight = canvas.height / window.devicePixelRatio

        const needResize = devicePixelWidth !== width || devicePixelHeight !== height

        if (needResize) {

          renderer.setSize(width, height, false)

        }

        return needResize

    }

    const controls = new OrbitControls(camera, renderer.domElement);

    function annimate() {

      renderer.render(scene, camera);

      requestAnimationFrame(annimate);

      // 添加以下代码

      if(resizeDevicePixel(renderer)) {

        const canvas = renderer.domElement;

        camera.aspect = canvas.clientWidth / canvas.clientHeight;

        camera.updateProjectionMatrix();

      }

      controls.update()

    }

    annimate()

  const gltfLoader = new GLTFLoader();

  gltfLoader.load("3d.glb", (gltf) => {

    let model = gltf.scene;

    // 纹理

const ambientLight = new THREE.AmbientLight(0xffffff,1);

const directionalLight = new THREE.DirectionalLight(0xffffff, 3.5);//光源,color:灯光颜色,intensity:光照强度

directionalLight.position.set(400, 200, 300);

    scene.add(model,ambientLight,directionalLight);

  })

};

onMounted(() => {

  initThree();

})

</script>


 

<style lang='less' scoped>

#three {

  width: 100vw;

  height: 100vh;

  // position: absolute;

  // top: 0;

  // left: 0;

}

</style>


 

Three.js 是一款基于 JavaScript 的开源库,用于创建令人惊叹的 3D 形和动画,尤其是在 Web 浏览器中。它利用 WebGL 技术,为网页应用提供了丰富的 3D渲染能力,适用于游戏、虚拟现实、数据可视化等场景。 在 Vue 3 中集成 three.js,你可以通过以下步骤实现一个简单的 3D项目: 1. **安装依赖**: 首先,你需要在你的 Vue 项目中安装 `@vue/threejs` 插件,可以使用 npm 或 yarn 进行安装: ``` npm install @vue/threejs ``` 2. **设置配置**: 在 main.js 或者你的组件中引入 Three 和 VueThree,并配置渲染器和其他组件: ```javascript import { createApp } from 'vue'; import { App } from './App.vue'; import { createThreeInstance } from '@vue-three/core'; import OrbitControls from '@vue-three/thumbor'; const app = createApp(App); app.use(createThreeInstance, { // 初始化 Three.js 渲染器和场景等 }); // 注册 OrbitControls 组件,用于地的交互控制 app.component('orbit-controls', OrbitControls); app.mount('#app'); ``` 3. **创建地组件**: 创建一个新的 Vue 组件,比如 Map.vue,然后使用 Three.js API 来构建地形或地模型: ```html <template> <div ref="canvas"></div> <orbit-controls></orbit-controls> </template> <script> export default { setup() { const canvas = this.$refs.canvas; // 初始化 Three.js组件,如地形网格、瓦片纹理等 const map = new THREE.TerrainGeometry(); const material = new THREE.MeshStandardMaterial({ map: ... }); return { canvas, map, material }; }, mounted() { // 创建并渲染到 canvas 上 const mesh = new THREE.Mesh(map, material); this.$refs.canvas.appendChild(mesh.scene); } }; </script> ``` 4. **添加地数据**: 你可以从各种数据源获取地形数据(例如 `.json` 文件、在线服务),并将数据加载到地形组件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值