Threejs进阶之一:基于vite+vue3+threejs构建三维场景

文章介绍了如何利用Vite、Vue3和Threejs搭建三维场景的步骤,包括创建项目环境、安装依赖、设置目录结构、引入Threejs库、创建和初始化场景、添加模型以及解决模型颜色差异问题。最后展示了如何将gltf模型加载到场景中并显示。
摘要由CSDN通过智能技术生成

前面的章节我们都是通过HTML+JS的方式创建三维场景,从这一章节开始,我们后面将使用vite+vue3+threejs来构建三维场景。

搭建项目环境

打开vscode的终端管理器,输入如下命令

npm create vite@latest vue3-threejs-app --template vue

在弹出的选择框架提醒中,按上下键盘键,选择Vue,然后回车
在这里插入图片描述
选择JavaScript,回车
提示项目创建完成,
在这里插入图片描述
输入cd vue3-threejs-app,进入该文件夹,输入npm install 安装项目需要的依赖
输入npm run dev 运行查看效果
在这里插入图片描述

目录结构

项目创建完成后,目录结构如下图所示
在这里插入图片描述
public 目录用于存放静态文件
src 目录用于存放源代码
assets 目录用于存放静态资源,例如图片、字体等
components 目录用于存放组件
App.vue 是应用程序的根组件
main.js 是应用程序的入口文件
vite.config.ts vite配置文件

安装threejs

终端中输入npm install three 安装threejs

清楚App.vue页面默认内容及格式

清楚App.vue中的HelloWorld组件及原因内容,新建一个Id为scene的div作为三维场景的容器,App.vue中代码如下

<template>
  <div id="scene">    
  </div>
</template>
<script setup> 
</script>
<style scoped> 
</style>

清空style.css中的样式,清空外边距和内边距

* {
  margin: 0;
  padding: 0;
}

新建3dModules文件夹

在public文件夹下,新建3dModules文件夹,用于存放三维模型文件,将要展现在页面上的motor03.gltf文件拷贝到该文件夹

新建utils文件夹

在src文件夹下下新建utils文件夹,用于存放工具类js代码,在该文件夹下新建motor3d.js文件,该文件用于通过threejs创建三维场景,并挂载到div上进行展示

引入Threejs库文件、轨道控制器和GLTF加载器

在motor3d.js中引入Threejs库文件,并引入轨道控制器和GLTFLoader文件

import * as THREE from 'three'//导入three.js核心库
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' //导入轨道控制器
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'//导入GLTF模型加载器

创建motor3d类,并导出

在motor3d.js中新建一个motor3d类,并使用export default方法将其导出

class motor3d {
}
export default motor3d

创建构造函数

为了更好的使用motor3d模块,我们在motor3d类中创建一个构造函数,用于初始化motor3d对象;

class motor3d {
constructor(selector) {    
    this.container = document.querySelector(selector)//获取容器
    this.scene
    this.camera 
    this.renderer
    this.controls
    this.init() //初始化
    this.animate()//循环函数
  }
} 

创建init()函数

创建好构造函数后,我们来创建init()函数,该函数用于初始化场景、相机、灯光、渲染器等

init() {
    // 初始化场景
    this.initScene()    
    // 初始化辅助轴
    this.initAxesHelper()
    // 初始化灯光
    this.initLight() 
    // 初始化相机
    this.initCamera()
    // 初始化渲染器
    this.initRender()
    // 初始化轨道控制器
    this.initControls()
    // 监听场景大小改变,重新渲染尺寸
    window.addEventListener('resize',this.onWindowResize.bind(this))
  }
创建initScene() 函数

initScene() 函数用于实例化Threejs的场景,

initScene() {
    this.scene = new THREE.Scene()
    this.scene.background = new THREE.Color(0xa0a0a0)
}
创建initAxesHelper() 函数

initAxesHelper()函数用于在场景中添加辅助轴线,帮助我们更好的理解场景信息

 initAxesHelper() {
    const axesHelper = new THREE.AxesHelper(5)
    this.scene.add(axesHelper)
  }
创建initLight() 函数

initLight() 函数用于初始化灯光,并添加到场景中

initLight() {
    const hesLight = new THREE.HemisphereLight(0xffffff,0x444444)
    hesLight.intensity = 0.6
    this.scene.add(hesLight)

    const dirLight = new THREE.DirectionalLight()
    dirLight.position.set(5,5,5)
    this.scene.add(dirLight)    
}
创建initCamera() 函数

initCamera()函数用于初始化相机

 initCamera() {
    this.camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,100)
    this.camera.position.set(1.5,1.5,1.5)
}
创建initRender() 函数

创建initRender()函数,初始化渲染器

  initRender() {
    this.renderer = new THREE.WebGLRenderer({antialias:true})//设置抗锯齿
    //设置屏幕像素比
    this.renderer.setPixelRatio(window.devicePixelRatio)
    //渲染的尺寸大小
    this.renderer.setSize(window.innerWidth,window.innerHeight) 
    // 添加到容器
    this.container.appendChild(this.renderer.domElement)
  }
创建render() 函数
 render() {    
    this.renderer.render(this.scene,this.camera)
  }
创建animate() 函数
  animate() { 
    this.renderer.setAnimationLoop(this.render.bind(this))
  }
创建initControls() 函数
  initControls() {
    this.controls = new OrbitControls(this.camera,this.renderer.domElement)
  }
创建onWindowResize() 函数
  onWindowResize() {
    this.camera.aspect = window.innerWidth / window.innerHeight
    this.camera.updateProjectionMatrix()//更新矩阵,将3d内容投射到2d画面上转换
    this.renderer.setSize(window.innerWidth,window.innerHeight)
  }

至此,我们已经基本将三维场景搭建完成了,在App.vue中引入motor3d.js文件,并在onMounted()中实例化该对象
App.vue中代码如下

<template>
  <div id="scene">    
  </div>
</template>
<script setup> 
 import motor3d from './utils/motor3d';
 import { onMounted } from 'vue'; 
 onMounted(()=>{ 
   new motor3d('#scene') 
 })
</script>
<style scoped> 
</style>

刷新浏览器,我们看到三维场景已经搭建完成了
在这里插入图片描述

初始化物体

接下来我们将模型添加到三维场景中,首先我们创建一个添加GLTF文件的方法

添加addGLTFModel(modelName) 方法
// 加载模型
  addGLTFModel(modelName) { 
    return new Promise((resolve,reject) => {
      const loader = new GLTFLoader().setPath('3dModels/')
      loader.load(modelName,(gltf) =>{
        console.log(gltf);  
        this.scene.add(gltf.scene)
        resolve(this.modelName + '模型添加成功')
      })
    })  
  }
创建initMesh() 方法

创建initMesh() 方法,在该方法中调用上面的addGLTFModel()方法,并传入3dModels文件夹下GLTF文件的名称

initMesh() {
    this.addGLTFModel('motor03.gltf')
  }
在init() 方法中调用initMesh()方法
  init() {
    // 初始化场景
    this.initScene()    
    // 初始化辅助轴
    this.initAxesHelper()
    // 初始化灯光
    this.initLight()
    // 初始化Mesh
    this.initMesh()
    // 初始化相机
    this.initCamera()
    // 初始化渲染器
    this.initRender()
    // 初始化轨道控制器
    this.initControls()
    // 监听场景大小改变,重新渲染尺寸
    window.addEventListener('resize',this.onWindowResize.bind(this))
  }

刷新浏览器,看效果
在这里插入图片描述
这里我们遇到了和前面将到的threejs和gltf模型颜色色差的问题,将如下代码添加到渲染器初始化函数中

    //解决加载gltf格式模型纹理贴图和原图不一样问题
    this.renderer.outputEncoding = THREE.sRGBEncoding;

重新刷新浏览器,问题解决
在这里插入图片描述
好的,基于vite+vue3+threejs方式构建Threejs三维场景的方法就说道这里,喜欢的朋友点赞关注收藏哦!

Vite是一个用于快速构建现代化的Web项目的构建工具,它专注于开发阶段的快速热重载,并使用ES模块作为原生的开发模式。Vue3是Vue.js的最新版本,它在性能、开发体验和可维护性上都有所提升。 针对你提到的具体的库和框架: - Vue Router是Vue.js官方的路由管理器,用于实现页面之间的导航和路由控制。你可以通过npm安装vue-router,并在项目中进行配置和使用。 - Pinia是Vue.js的状态管理库,它提供了一种简单而强大的方式来管理应用程序的状态。你可以集成Pinia到你的Vue项目中,以便更好地组织和共享你的应用程序状态。 - Axios是一个基于Promise的HTTP客户端,用于通过网络发送异步请求。你可以使用Axios来处理与服务器的通信,并获取数据来更新你的Vue应用程序。 - Element Plus是一套基于Vue3的组件库,包含了丰富的UI组件,可以帮助你快速搭建漂亮的用户界面。你可以在项目中安装和使用Element Plus来实现各种交互效果和用户界面。 如果你想使用ViteVue3和以上提到的库和框架来创建一个项目,你可以按照以下步骤进行: 1. 安装Vite:通过npm全局安装Vite,然后使用Vite命令初始化一个新的项目。 2. 配置Vite:根据你的项目需求,在Vite的配置文件中添加Vue Router、Pinia、Axios和Element Plus的相关配置。 3. 安装和配置Vue Router:通过npm安装Vue Router,并在项目中配置和使用Vue Router来管理应用程序的路由。 4. 集成Pinia:通过npm安装Pinia,并在项目中引入和配置Pinia,以便在应用程序中使用Pinia来管理状态。 5. 使用Axios:通过npm安装Axios,并在项目中引入和配置Axios,以便进行网络请求和数据获取。 6. 引入Element Plus:通过npm安装Element Plus,并在项目中按需引入和使用Element Plus的组件,以搭建漂亮的用户界面。 希望以上信息对你有帮助,祝你在使用ViteVue3和这些库和框架时取得成功!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vite-vue-ts精简模版集成pinia+svg+router+@src](https://download.csdn.net/download/ldy889/85018930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vite+vue3+ts+vue-router+pinia+axios+element-plus](https://blog.csdn.net/zy_080400/article/details/127125359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

九仞山

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

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

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

打赏作者

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

抵扣说明:

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

余额充值