Three.js--》实现3d水晶小熊模型搭建

news2024/12/26 2:06:37

目录

项目搭建

初始化three.js基础代码

加载背景纹理

加载小熊模型


今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。

项目搭建

本案例还是借助框架书写three项目,借用vite构建工具搭建vue项目,vite这个构建工具如果有不了解的朋友,可以参考我之前对其讲解的文章:vite脚手架的搭建与使用 。搭建完成之后,用编辑器打开该项目,在终端执行 npm i 安装一下依赖,安装完成之后终端在安装 npm i three 即可。

因为我搭建的是vue3项目,为了便于代码的可读性,所以我将three.js代码单独抽离放在一个组件当中,在App根组件中进入引入该组件。具体如下:

<template>
  <!-- 3D水晶小熊 -->
  <CrystalBear></CrystalBear>
</template>

<script setup>
import CrystalBear from './components/CrystalBear.vue';
</script>

<style lang="less">
  *{
    margin: 0;
    padding: 0;
  }
</style>

初始化three.js基础代码

three.js开启必须用到的基础代码如下:

导入three库

import * as THREE from 'three'

初始化场景

const scene = new THREE.Scene()

初始化相机

const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
camera.position.set(1.5,1,1.5) // 设置相机位置
camera.aspect = window.innerWidth / window.innerHeight // 更新摄像头宽高比例
camera.updateProjectionMatrix() // 更新相机投影矩阵
scene.add(camera)

初始化渲染器

const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth,window.innerHeight) // 设置渲染器的大小

监听屏幕大小的改变,修改渲染器的宽高和相机的比例

window.addEventListener("resize",()=>{ 
  renderer.setSize(window.innerWidth,window.innerHeight)
  camera.aspect = window.innerWidth/window.innerHeight
  camera.updateProjectionMatrix()
})

导入控制器

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
// 实例化控制器
const controls = new OrbitControls(camera,renderer.domElement)

设置渲染函数

const render = () =>{ 
  renderer.render(scene,camera) // 渲染场景
  requestAnimationFrame(render) // 循环渲染
}

进行挂载

// 挂载完成之后获取dom
onMounted(()=>{
  // 添加控制器
  const controls = new OrbitControls(camera,canvasContainer.value)
  controls.enableDamping = true 
  canvasContainer.value.appendChild(renderer.domElement)
  render()
})

ok,写完基础代码之后,接下来开始具体的Demo实操。

加载背景纹理

可以在网上随便找一张全景图片,然后对环境进行纹理贴图。注意:这里需要借助TextureLoader库,其用于将2D纹理图像文件加载到WebGL中,TextureLoader可以加载各种常见的图像文件格式,如JPG、PNG、GIF等。我们可以使用TextureLoader加载纹理图像,然后将它们映射到3D模型表面上,从而创建逼真的3D场景。

const loader = new THREE.TextureLoader()
const bgTexture = loader.load(bgimg)
bgTexture.mapping = THREE.EquirectangularReflectionMapping // 设置有折射效果的全局背景
scene.background = bgTexture
scene.environment = bgTexture

加载小熊模型

导入 GLTFLoader 库:用于将glTF格式的3D模型文件加载到WebGL中。

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"
const gltfLoader = new GLTFLoader()
gltfLoader.load("src/assets/model/bear.gltf",(gltf)=>{
  const model = gltf.scene.children[0]
  model.material = new THREE.MeshPhongMaterial({
    color: 0xffffff,
    envMap: bgTexture,
    refractionRatio: 0.7,
    reflectivity: 0.99,
    opacity: 0.5
  })
  scene.add(model)
})

给出环境光光源:

// 添加环境光
const ambient = new THREE.AmbientLight(0xffffff,0.85)
scene.add(ambient)

demo做完,给出本案例的完整代码:(获取素材也可以私信博主)

<template>
  <div class="canvasContainer" ref="canvasContainer"></div>
</template>

<script setup>
import * as THREE from 'three'
import { ref, onMounted } from 'vue'
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"
// 添加轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import bgimg from "../assets/imgs/050.jpg"

const canvasContainer = ref(null)

// 初始化场景
const scene = new THREE.Scene()
// 初始化相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
camera.position.set(1.5,1,1.5) // 设置相机位置
camera.aspect = window.innerWidth / window.innerHeight // 更新摄像头宽高比例
camera.updateProjectionMatrix() // 更新相机投影矩阵
scene.add(camera)

// 初始化渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth,window.innerHeight) // 设置渲染器的大小

// 监听屏幕大小变化
window.addEventListener("resize",()=>{ 
  renderer.setSize(window.innerWidth,window.innerHeight)
  camera.aspect = window.innerWidth/window.innerHeight
  camera.updateProjectionMatrix()
})

// 定义渲染函数
const render = () =>{ 
  renderer.render(scene,camera) // 渲染场景
  requestAnimationFrame(render) // 循环渲染
}

// 加载背景纹理
const loader = new THREE.TextureLoader()
const bgTexture = loader.load(bgimg)
bgTexture.mapping = THREE.EquirectangularReflectionMapping // 设置有折射效果的全局背景
scene.background = bgTexture
scene.environment = bgTexture

// 加载小熊模型
const gltfLoader = new GLTFLoader()
gltfLoader.load("src/assets/model/bear.gltf",(gltf)=>{
  const model = gltf.scene.children[0]
  model.material = new THREE.MeshPhongMaterial({
    color: 0xffffff,
    envMap: bgTexture,
    refractionRatio: 0.7,
    reflectivity: 0.99,
    opacity: 0.5
  })
  scene.add(model)
})

// 添加环境光
const ambient = new THREE.AmbientLight(0xffffff,0.85)
scene.add(ambient)

// 挂载完成之后获取dom
onMounted(()=>{
  // 添加控制器
  const controls = new OrbitControls(camera,canvasContainer.value)
  controls.enableDamping = true 
  canvasContainer.value.appendChild(renderer.domElement)
  render()
})

</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vTESTstudio概述

vTESTstudio支持的测试用例编写方式 项目层级结构 从用例编写到测试执行及生成报告的整个流程 vTESTsutido 开发&#xff0c;CANoe执行测试 界面简介 CANoe 创建的测试用例用Test Modules执行&#xff0c;vTESTstudio 创建的测试用例用Test Units执行 先在vTESTstudio里创建pr…

Quard Bayer(COMS SENSOR)

手机越做越紧凑需要模组和芯片尺寸越做越小&#xff0c;在尺寸一定的基础上&#xff0c;高像素和大像素&#xff0c;对于手机摄像头来说&#xff0c;一直是一对矛盾的存在。然而&#xff0c;高像素所带来的高分辨率画质&#xff0c;和大像素带给暗态高感度低噪声的画质&#xf…

Idea使用详解

01.idea简介 &#xff08;1&#xff09;idea介绍 IDEA 全称IntelliJ IDEA&#xff0c;是用于java语言开发的集成环境&#xff08;也可用于其他语言&#xff09;&#xff0c;IntelliJ在业界被公认为最好的java开发工具之一&#xff0c;尤其在智能代码助手、代码自动提示、重构、…

鸿蒙Hi3861学习十七-Huawei LiteOS-M(MQTT)

一、简介 有关MQTT的相关概念介绍&#xff0c;请看之前的文章&#xff0c;这里不做过多的介绍&#xff1a;MQTT学习总结_t_guest的博客-CSDN博客 本章节需要使用如下软件&#xff1a; Mosquitto&#xff08;MQTT消息代理工具&#xff09; Eclipsse paho MQTT工具 二、操作说明…

十款优质企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)

Java微服务开源项目 前言一、pig二、zheng三、SpringBlade四、SOP五、matecloud六、mall七、jeecg-boot八、Cloud-Platform九、microservices-platform十、RuoYi-Cloud 前言 这篇文章为大家推荐几款优质的 Java 开源项目框架&#xff0c;可以用于学习&#xff0c;毕业设计&…

【腾讯云FinOps Crane 集训营】 Crane入门

前言 随着云计算的快速发展和云原生应用的兴起&#xff0c;容器技术成为了现代化应用部署和管理的重要工具。 越来越多的公司正在选择将应用运行在云上或者自建的 Kubernetes 集群上&#xff0c;但是许多机构的调研 发现&#xff0c;绝大多数的用户集群资源利用率并不高&…

STM8 使用74HC164外扩IO

背景 在嵌入式开发过程中&#xff0c;经常使用时、甚至设计时候&#xff0c;考虑成本等因素&#xff0c;需要外扩IO。这里就是使用STM8S003F3P6&#xff0c;这个芯片比较常用的&#xff0c;这个芯片封装很小&#xff0c;只有20个管脚的MCU&#xff0c;实际产品上用的非常多。 …

二进制部署高可用k8s集群

第一章、前置知识点 1.1 生产环境部署K8S集群的两种方式 kubeadm Kubeadm是一个K8S部署工具&#xff0c;提供kubeadm init 和 kubeadm join&#xff0c;用于快速部署Kubernetes集群。 二进制包 从GitHub下载发行版的二进制包&#xff0c;手动部署每个组件&#xff0c;组成…

Idea部署Tomcat项目位置问题

Tomcat部署路径问题 1 默认情况 Tomcat安装目录下有webapps,是部署项目的,项目就运行在那里。 但是IDEA会为每个项目都拷贝一份足够的Tomcat文件放在c盘 ${user.home}/.IntelliJIdea/system/tomcat 或者 ${user.home/AppData/Local/JetBrains/IntelliJIdea2021.1/tomcat这样做…

【MySQL新手到通关】第二章 MySQL卸载安装

文章目录 1. MySQL的卸载1.1 停止MySQL服务1.2 软件的卸载 2. MySQL的下载、安装、配置2.1 软件的下载2.2 MySQL8.0 版本的安装2.3 配置MySQL8.02.4 配置MySQL8.0 环境变量2.5 MySQL5.7 版本的安装、配置2.6 安装失败问题 3. MySQL 登录3.1 服务的启动与停止3.2 自带客户端的登…

提高效率与代码重用:使用React Native和小程序容器简化开发

React Native是一个强大的前端跨端框架&#xff0c;可以帮助开发者高效地构建移动应用程序&#xff0c;并充分利用跨平台开发的优势&#xff0c;同时提供接近原生应用程序的性能和用户体验。它具有许多技术上的优势&#xff1a; 跨平台开发&#xff1a;使用React Native&#x…

AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变

本图由AI生成 文/王吉伟 近期的AIGC领域仍旧火爆异常。 但火的不只是AIGC应用&#xff0c;还有巨头之间的AI竞赛&#xff0c;以及接连不断上新的AI大模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;。 面对ChatGPT带来的技术冲击&#xff0c;为了研发谷歌多…

Spring事务失效常见的五种方式及其解决方案【源码篇】

一、前言 在Web 开发中&#xff0c;Spring 框架已经成为了众多开发者的首选。Spring 的声明式事务管理是其中最重要的特性之一&#xff0c;它可以帮助我们简化业务逻辑的复杂度&#xff0c;并且确保在出现异常情况时数据的一致性。 事务失效情况很常见&#xff0c;但我们只要…

对计算机方向科研工作者的建议 - 易智编译EaseEditing

如果你正在进行计算机科学研究&#xff0c;以下是一些建议可以帮助你&#xff1a; 确定研究兴趣&#xff1a; 选择一个你感兴趣的研究领域或问题&#xff0c;并确保你对该领域有足够的知识基础和热情。 深入学习&#xff1a; 通过阅读学术论文、参加研讨会和课程&#xff0c;…

有意思的CVE-2022-0337复现

前言 前两天在刷tw&#xff0c;看到了个比较有意思的一个CVE漏洞&#xff0c;价值奖励是10000美&#x1f52a;&#xff0c;比较好奇的是价值10000美&#x1f52a;的漏洞是什么样子的[苦涩]&#xff0c;漏洞利用就是需要在浏览器中进行用户交互才能触发该漏洞&#xff0c;但由于…

vr船舶装配模拟驾驶平台直观形象呈现操作流程和原理

船舶由成千上万种零件构成&#xff0c;需要众多的工业部门共同合作才能够完成这一庞大工程。除特有的船体建造技术外&#xff0c;造船还涉及到机械、电气、冶金、建筑、化学以至工艺美术等各个领域&#xff0c;因此船舶建造是一项劳动密集型、技术密集型和资金密集型的产业。 船…

【OpenAI】DALL·E 2,让我来带你认识一下这位来自AI界的艺术家

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录 前言什么是DALL-E 2 &#xff1f;介绍的怎么厉害&#xff0c;它又能干啥呢&#xff1f;基本功能新功能编辑变体功能 总结 前言 DALL-E 2 是一种基于语言的人工智能图像生成器&#xff0c;可以根据文本提示创建高质量的…

【学习日记2023.5.22】 之 套餐模块完善

4. 功能模块完善之套餐模块 4.1 新增套餐 4.1.1 需求分析与设计 产品原型 后台系统中可以管理套餐信息&#xff0c;通过 新增功能来添加一个新的套餐&#xff0c;在添加套餐时需要添加套餐对应菜品的信息&#xff0c;并且需要上传套餐图片。 新增套餐原型&#xff1a; 当填…

PMP-项目经理的角色

一、项目经理的作用 项目经理在领导团队达成项目目标方面发挥着至关重要的作用。一般来说&#xff0c;项目经理从项目启动时就开始参与项目直至项目结束&#xff0c;在这个过程中&#xff0c;项目经理发挥着对项目的规划、协调、控制等作用&#xff0c;确保与产品保持一致&…

用 Python 进行办公自动化都需要学习什么知识呢?

Python 自动化办公&#xff0c;无外乎就是 excel&#xff0c;ppt&#xff0c;word&#xff0c;再加上数据分析、爬虫等技能 下面我就来逐一介绍各项技能的基本使用 基本知识 1. Python基础知识&#xff1a; 包括语法、变量、数据类型、条件语句、循环语句、函数等基本概念和用…