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

这篇具有很好参考价值的文章主要介绍了Threejs进阶之一:基于vite+vue3+threejs构建三维场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

搭建项目环境

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

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

在弹出的选择框架提醒中,按上下键盘键,选择Vue,然后回车
Threejs进阶之一:基于vite+vue3+threejs构建三维场景,ThreeJS,javascript,vue.js,前端,3d,html5
选择JavaScript,回车
提示项目创建完成,
Threejs进阶之一:基于vite+vue3+threejs构建三维场景,ThreeJS,javascript,vue.js,前端,3d,html5
输入cd vue3-threejs-app,进入该文件夹,输入npm install 安装项目需要的依赖
输入npm run dev 运行查看效果
Threejs进阶之一:基于vite+vue3+threejs构建三维场景,ThreeJS,javascript,vue.js,前端,3d,html5

目录结构

项目创建完成后,目录结构如下图所示
Threejs进阶之一:基于vite+vue3+threejs构建三维场景,ThreeJS,javascript,vue.js,前端,3d,html5
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>

刷新浏览器,我们看到三维场景已经搭建完成了
Threejs进阶之一:基于vite+vue3+threejs构建三维场景,ThreeJS,javascript,vue.js,前端,3d,html5

初始化物体

接下来我们将模型添加到三维场景中,首先我们创建一个添加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进阶之一:基于vite+vue3+threejs构建三维场景,ThreeJS,javascript,vue.js,前端,3d,html5
这里我们遇到了和前面将到的threejs和gltf模型颜色色差的问题,将如下代码添加到渲染器初始化函数中

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

重新刷新浏览器,问题解决
Threejs进阶之一:基于vite+vue3+threejs构建三维场景,ThreeJS,javascript,vue.js,前端,3d,html5
好的,基于vite+vue3+threejs方式构建Threejs三维场景的方法就说道这里,喜欢的朋友点赞关注收藏哦!文章来源地址https://www.toymoban.com/news/detail-659943.html

到了这里,关于Threejs进阶之一:基于vite+vue3+threejs构建三维场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue基于threejs实现的3D可视化编辑器

    随着5G网络的渐渐普及,物联网在人们的生活中渐渐广泛使用,社会向着越来越智能化的方向发展。当康科技经过不懈努力,研发属于自己的一款3D可视化编辑器,助力企业应用实现3D可视化服务。 编辑器界面如下: 操作视频演示: 3D可视化编辑器v1.0版本完成 主要功能点如下

    2024年02月13日
    浏览(43)
  • 使用 Threejs 从基础开始构建 3D 地球

    演示效果 git源码地址 场景创建 相机 坐标辅助器 状态检测器 渲染器 轨道控制器 粒子星空 地球和大气层创建 创建星轨环 创建卫星移动轨迹 创建卫星 二维经纬度坐标转三维球坐标 创建标点 绘制飞线 在地球上绘制标点和飞线 一般在执行完上述方法后能看到如下图的效果:

    2024年01月25日
    浏览(61)
  • 基于Vue3+Vite+TS+ESLint+Prettier+Husky+lint-staged+commitlint+stylelint的项目构建

    博客后台管理系统使用后的是基于Vue3+Vite+TS+ESLint+Prettier的开发,具体项目构建如下 ESLint: 控制代码质量 Prettier: 控制代码风格 2.1、安装ESLint、Prettier相关相关包 eslint: ESLint的核心代码库 prettier: Prettier的格式化代码的核心代码库 eslint-config-airbnb-base: airbnb的代码规范(依赖pl

    2024年02月07日
    浏览(59)
  • Soybean Admin - 基于 Vue3 / vite3 等最新前端技术栈构建的中后台模板,免费开源、清新优雅,主题丰富

    一款专业好看、完成度很高的 admin 开源项目,无论是用于生产还是学习,都非常值得尝试。 关于 Soybean Admin Soybean Admin 是一个基于 Vue3 / Vite3 / TypeScript / NaiveUI / Pinia 和 UnoCSS 的中后台模版,它使用了最新流行的前端技术栈,内置丰富的主题配置,有着极高的代码规范,基于文

    2024年02月11日
    浏览(59)
  • Threejs进阶之十:让模型移动到鼠标点击的指定位置

    上一节中我们实现了物体沿指定轨迹移动的动画效果,这一节我们来实现让模型移动到鼠标点击的制定位置的动画效果。 先看下实现后的最终效果 要实现上面的动画效果,我们需要通过以下步骤来实现 我们需要监听鼠标的点击事件,获取鼠标点击点相对浏览器可视区域左上

    2024年02月09日
    浏览(57)
  • Threejs进阶之十五:在Thereejs 使用自定义shader

    先看下这次代码最终要实现的效果, 效果分析: 要实现上述效果,我们需要两张图片,作为纹理贴图,使其图案产生明暗效果;然后通过定义ShaderMaterial对象通过自定义Shader实现上述效果;后面代码中会进行详细分析; 这里我们先介绍下基础知识 Shader(着色器)是一种在图

    2024年02月05日
    浏览(42)
  • 【vue3】使用vite构建vue3项目

    ==😉博主:初映CY的前说(前端领域) ,📒本文核心:使用vite构建vue3项目 【前言】 当我们选择了vue3作为我们项目的开发,就更加的推荐使用vite来对我们的项目进行打包。很简单——这也是开发vue的团队开发的工具,因此支持性肯定比传统的打包工具好,下面我们就来使用vi

    2024年02月06日
    浏览(56)
  • Vue3:Vite 构建 Vue 项目

    Vite 新一代前端构建工具。 开发环境中,无需打包操作,可快速的冷启动。 轻量快速的热重载。 按需编译。 npm安装会提示是否安装依赖 项目结构 配置文件 在项目中引入组件或文件时,使用 @/ 别名引入文件路径报错问题。 在 vite.config.js 配置文件中修改别名。 在 tsconfig.j

    2024年02月11日
    浏览(50)
  • Threejs进阶之十一:使用FontLoader和TextGeometry创建三维文字

    在Threejs中我们可以通过FontLoader和TextGeometry结合使用来创建三维文字,FontLoader用于加载JSON格式的字体,FontLoader返回值是表示字体的Shape类型的数组;TextGeometry用于将文本生成为单一的几何体。下面我们先来了解下这两个类 用于加载JSON格式的字体的类。返回font, 返回值是表示

    2024年02月06日
    浏览(46)
  • Vite构建Vue3项目

    vue3-ts cd vue3-ts npm install npm run dev 或者 yarn dev 访问 http://localhost:5173/ yarn add vue-router -S yarn add element-plus -S yarn add unplugin-vue-components -D yarn add unplugin-auto-import -D 下载@types/node依赖 vite.config.ts tsconfig.json yarn add pinia -S

    2023年04月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包