位置: IT常识 - 正文

Three.js--》实现3d小岛模型搭建(three.js gui)

编辑:rootadmin
Three.js--》实现3d小岛模型搭建

目录

项目搭建

初始化three.js基础代码

设置环境背景

设置水面样式

添加天空小岛


推荐整理分享Three.js--》实现3d小岛模型搭建(three.js gui),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:three.js加载3d模型,three.js bim,threejs 3dtiles,three. js,d3.js three.js,three.js bim,threejs 3dtiles,d3.js three.js,内容如对您有帮助,希望把文章链接给更多的朋友!

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

项目搭建

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

因为react在每次页面发生变化时会出现执行整段代码,这样的话就会产生不必要的资源拥塞,所以我将three.js代码单独抽离成一个js文件。具体如下:

import { render } from "./three/水天一色小岛.js"import './App.css'const App = () => { return ( <div> {render()} </div> )}export default App

当然也是有比较设置一下css样式,重置一下浏览器原本的css样式,如下:

*{ margin: 0; padding: 0;}body{ background-color: #1e1a20;}::-webkit-scrollbar { display: none;}初始化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,2000)camera.position.set(10,50,120) // 设置相机位置camera.aspect = window.innerWidth / window.innerHeight // 更新摄像头宽高比例camera.updateProjectionMatrix() // 更新摄像头矩阵scene.add(camera)

初始化渲染器:

const renderer = new THREE.WebGLRenderer({ antialias:true, // 设置抗锯齿})renderer.outputEncoding = THREE.sRGBEncoding // 告诉渲染器在输出颜色时采用sRGB空间的标准渲染格式renderer.setSize(window.innerWidth,window.innerHeight) // 设置渲染器的宽高document.body.appendChild(renderer.domElement) // 将渲染器添加到页面中

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

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

导入控制器:

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

设置渲染函数:

export function render(){ renderer.render(scene,camera) // 渲染场景 requestAnimationFrame(render) // 引擎自动更新渲染器}render()

ok,设置完这些基础代码之后,我们可以添加一个物体进行检验一下,就添加个平面吧,如下:

// 添加平面const planeGeometry = new THREE.PlaneGeometry(100,100)const planeMaterial = new THREE.MeshBasicMaterial({ color:0xffffff})const plane = new THREE.Mesh(planeGeometry,planeMaterial)scene.add(plane)

ok,可见代码写的没有错误,接下来开始具体的Demo实操。

设置环境背景Three.js--》实现3d小岛模型搭建(three.js gui)

在网上随便找一张全景图片,然后进行球体的纹理贴图,代码如下:

// 创建一个巨大的天空球体const skyGeometry = new THREE.SphereGeometry(1000,60,60)const skyMaterial = new THREE.MeshBasicMaterial({ map: new THREE.TextureLoader().load('./src/public/starry-sky2.jpg')})const sky = new THREE.Mesh(skyGeometry,skyMaterial)scene.add(sky)

一开始我们是置身在球体外部的,具体效果如下:

如果想我们一开始就置身在球体内部可以进行如下操作:

设置视频纹理:除了设置图片纹理外,我们也可以设置一下视频纹理,如下:

// 设置视频纹理const video = document.createElement("video")video.src = "./src/public/sky.mp4" // 视频路径video.loop = true // 循环播放window,addEventListener("click",(e)=>{ // 判断视频是否处于播放状态 if(video.paused){ video.play() skyMaterial.map = new THREE.VideoTexture(video) skyMaterial.map.needsUpdate = true }})

设置水面样式

这里借助three库中Water来实现水面波纹的效果,如下:

// 导入水面import { Water } from "three/examples/jsm/objects/Water2"// 创建平面const waterGeometry = new THREE.CircleGeometry(300,64)const water = new Water(waterGeometry,{ textureWidth: 1024, textureHeight: 1024, color:0x0080ff, scale: 1,})water.rotation.x = -Math.PI / 2scene.add(water)

这里有个坑,如果想实现这种波纹效果的话,需要自行提供波纹的纹理贴图,并提供特定的路径,如果路径不对的话是否爆出如下错误的,如下:

添加天空小岛

导入gltf载入库:

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"import { DRACOLoader } from 'three/examples/jsm/loaders/dracoloader'

添加小岛模型:

const loader = new GLTFLoader() // 实例化gltf载入库const dracoLoader = new DRACOLoader() // 实例化draco载入库dracoLoader.setDecoderPath("/draco/") // 添加draco载入库loader.setDRACOLoader(dracoLoader) // 添加draco载入库loader.load("./model/island2.glb",(gltf)=>{ scene.add(gltf.scene)})

这里需要设置一下环境纹理来显示具体样式:

import { DRACOLoader } from 'three/examples/jsm/loaders/dracoloader'import { RGBELoader } from 'three/examples/jsm/loaders/rgbeloader'// 载入环境纹理const hdrLoader = new RGBELoader()hdrLoader.loadAsync("./src/public/050.hdr").then((texture)=>{ texture.mapping = THREE.EquirectangularReflectionMapping scene.background = texture scene.environment = texture})// 添加环境光const light = new THREE.DirectionalLight(0xffffff,1)light.position.set(-100,100,10)scene.add(light)

最后实现的效果如下:

ok,今天的three.js小案例就讲到这,给出本文的代码笔记: (获取素材也可以私信博主)

/* eslint-disable no-unused-vars */import * as THREE from 'three'// 导入控制器import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"// 导入水面import { Water } from "three/examples/jsm/objects/Water2"// 导入gltf载入库import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"import { DRACOLoader } from 'three/examples/jsm/loaders/dracoloader'import { RGBELoader } from 'three/examples/jsm/loaders/rgbeloader'// 初始化场景const scene = new THREE.Scene()// 初始化相机const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,2000)camera.position.set(10,50,120) // 设置相机位置camera.aspect = window.innerWidth / window.innerHeight // 更新摄像头宽高比例camera.updateProjectionMatrix() // 更新摄像头矩阵scene.add(camera)// 初始化渲染器const renderer = new THREE.WebGLRenderer({ antialias:true, // 设置抗锯齿 logarithmicDepthBuffer: true // 对数深度缓冲区})renderer.outputEncoding = THREE.sRGBEncoding // 告诉渲染器在输出颜色时采用sRGB空间的标准渲染格式renderer.setSize(window.innerWidth,window.innerHeight) // 设置渲染器的宽高document.body.appendChild(renderer.domElement) // 将渲染器添加到页面中// 监听屏幕大小的改变,修改渲染器的宽高和相机的比例window.addEventListener("resize",()=>{ camera.aspect = window.innerWidth / window.innerHeight camera.updateProjectionMatrix() renderer.setSize(window.innerWidth,window.innerHeight)})// 实例化控制器const controls = new OrbitControls(camera,renderer.domElement)// 设置渲染函数export function render(){ renderer.render(scene,camera) // 渲染场景 requestAnimationFrame(render) // 引擎自动更新渲染器}render()// 创建一个巨大的天空球体let texture = new THREE.TextureLoader().load('./src/public/starry-sky2.jpg')const skyGeometry = new THREE.SphereGeometry(1000,30,30)const skyMaterial = new THREE.MeshBasicMaterial({ map: texture})skyGeometry.scale(1,1,-1)const sky = new THREE.Mesh(skyGeometry,skyMaterial)scene.add(sky)// 设置视频纹理const video = document.createElement("video")video.src = "./src/public/sky.mp4" // 视频路径video.loop = true // 循环播放window,addEventListener("click",(e)=>{ // 判断视频是否处于播放状态 if(video.paused){ video.play() let texture = new THREE.VideoTexture(video) skyMaterial.map = texture skyMaterial.map.needsUpdate = true scene.background = texture scene.environment = texture }})// 载入环境纹理const hdrLoader = new RGBELoader()hdrLoader.loadAsync("./src/public/050.hdr").then((texture)=>{ texture.mapping = THREE.EquirectangularReflectionMapping scene.background = texture scene.environment = texture})// 添加环境光const light = new THREE.DirectionalLight(0xffffff,1)light.position.set(-100,100,10)scene.add(light)// 创建平面const waterGeometry = new THREE.CircleGeometry(300,64)const water = new Water(waterGeometry,{ textureWidth: 1024, textureHeight: 1024, color:0xeeeeff, scale: 1,})water.position.y = 3water.rotation.x = -Math.PI / 2scene.add(water)// 添加小岛模型const loader = new GLTFLoader() // 实例化gltf载入库const dracoLoader = new DRACOLoader() // 实例化draco载入库dracoLoader.setDecoderPath("/draco/") // 添加draco载入库loader.setDRACOLoader(dracoLoader) // 添加draco载入库loader.load("./model/island2.glb",(gltf)=>{ scene.add(gltf.scene)})
本文链接地址:https://www.jiuchutong.com/zhishi/295363.html 转载请保留说明!

上一篇:如何使用 CSS 使表格居中(快速指南)(css怎么调用)

下一篇:【JavaScript 进阶教程】数组新增遍历方法的说明与使用(js进阶视频教程)

  • oppo手机免打扰模式如何取消(oppo手机免打扰是什么意思)

    oppo手机免打扰模式如何取消(oppo手机免打扰是什么意思)

  • windows无法访问192是什么原因(windows无法访问\\192.168.1.104)

    windows无法访问192是什么原因(windows无法访问\\192.168.1.104)

  • 苹果11底部横线怎么关闭(苹果11底部横线怎么去掉)

    苹果11底部横线怎么关闭(苹果11底部横线怎么去掉)

  • 云电脑需要的设备是什么(云电脑需要自己电脑配置高吗)

    云电脑需要的设备是什么(云电脑需要自己电脑配置高吗)

  • 华为nova7耳机插孔在哪(华为nova7耳机插上还是外放怎么办)

    华为nova7耳机插孔在哪(华为nova7耳机插上还是外放怎么办)

  • 微信那个耳朵是干嘛用的(微信上面的耳朵是啥)

    微信那个耳朵是干嘛用的(微信上面的耳朵是啥)

  • 苹果7升级后白屏开不了机怎么办(苹果升级后白屏)

    苹果7升级后白屏开不了机怎么办(苹果升级后白屏)

  • 淘宝退货申请取消后还能再申请吗(淘宝退货申请取消了怎么重新申请)

    淘宝退货申请取消后还能再申请吗(淘宝退货申请取消了怎么重新申请)

  • 笔记本投影到投影仪不能全屏(笔记本投影到投影仪上之后有两个屏怎么调)

    笔记本投影到投影仪不能全屏(笔记本投影到投影仪上之后有两个屏怎么调)

  • 电脑屏幕怎么调大小(电脑屏幕怎么调刷新率)

    电脑屏幕怎么调大小(电脑屏幕怎么调刷新率)

  • oppo手机摔了黑屏打不开怎么办(oppo手机摔了黑屏了怎么办)

    oppo手机摔了黑屏打不开怎么办(oppo手机摔了黑屏了怎么办)

  • iphonex网速变慢怎么回事(苹果x网速不稳定)

    iphonex网速变慢怎么回事(苹果x网速不稳定)

  • 华为开机密码忘记了怎么办(华为开机密码忘记了不想清除数据)

    华为开机密码忘记了怎么办(华为开机密码忘记了不想清除数据)

  • 苹果5和5s的区别在哪(机型对比苹果)

    苹果5和5s的区别在哪(机型对比苹果)

  • 组网是什么意思(全光组网是什么意思)

    组网是什么意思(全光组网是什么意思)

  • 淘宝付的定金可以退吗(淘宝付的定金可以退回吗)

    淘宝付的定金可以退吗(淘宝付的定金可以退回吗)

  • 华为怎么给苹果反向充电(华为怎么给苹果传视频)

    华为怎么给苹果反向充电(华为怎么给苹果传视频)

  • 小天才电话手表y05功能(小天才电话手表怎么添加联系人)

    小天才电话手表y05功能(小天才电话手表怎么添加联系人)

  • qq好友送的礼物怎么提现(qq好友送的礼物在哪里)

    qq好友送的礼物怎么提现(qq好友送的礼物在哪里)

  • 滴滴封号怎么解(滴滴帐号封禁怎么解封)

    滴滴封号怎么解(滴滴帐号封禁怎么解封)

  • 微软 Win11 全新画图应用已向 Dev 渠道用户推送(微软 windows11)

    微软 Win11 全新画图应用已向 Dev 渠道用户推送(微软 windows11)

  • YOLOv5/v7/v8 改进首发最新PWConv核心结构|来自最新CVPR2023顶会,进一步轻量化!测试数据集mAP有效涨点,进一步降低参数量,追求更高的 FLOPS(yolov3 改进)

    YOLOv5/v7/v8 改进首发最新PWConv核心结构|来自最新CVPR2023顶会,进一步轻量化!测试数据集mAP有效涨点,进一步降低参数量,追求更高的 FLOPS(yolov3 改进)

  • 财务状况说明表财务报表有什么区别
  • 劳务发票打款用途写什么
  • 运输途中的不合理损耗有哪些
  • 固定资产清理的金额怎么算
  • 一般纳税人企业所得税政策最新2023税率
  • 预付账款在贷方是谁欠谁
  • 残疾人保障金做什么会计科目
  • 生活服务费发票 经营范围
  • 跨年度费用报销违反什么规定
  • 房地产开发企业资质等级有几个
  • 发生福利费的会计分录
  • 外聘人员劳务费入什么科目
  • 普通发票扣税
  • 公司制度奖励怎么写
  • 未开票确认收入分录怎么做
  • 法人 持股
  • 收回员工社保入什么科目
  • 广告业务增值税
  • 绿化工程上税多少
  • 报税没有报怎么办
  • 公司筹建期间的劳务费怎么入账
  • 一般商贸企业出口白酒要交税吗
  • 售后服务对客户满意度的影响论文
  • 新版edge浏览器兼容性视图怎么设置
  • i5 8500装win10
  • win8系统如何设置u盘启动
  • php登录注册
  • 反射动态创建对象
  • linux命令有啥用
  • aspnet_admin.exe进程是安全的吗 aspnet_admin进程信息查询
  • 企业注销时无力缴纳社保
  • conime进程太多
  • php text
  • phpeach函数
  • vue项目中技巧知识点
  • 资本公积转增资本金
  • 扣缴义务人的法律地位
  • 小程序开发要钱吗
  • seq命令
  • 适用于windows7的更新程序会更新到windows10吗
  • 印花税是不是每个月都要交
  • 售后回购会计处理分录
  • 非货币性资产交换以公允价值为基础进行计量
  • sql查表结构语句
  • 补缴以前年度的印花税会计分录
  • 什么是企业所得税收入
  • 企业所得税季度申报数据怎么来
  • 转让不动产为什么不能开全票发票
  • 支付上个月运费
  • 电子商务中流量的定义
  • 利润分配明细科目有哪些
  • 技术员差旅费计入哪个会计科目
  • 股东如何收回投资款
  • 物料损耗率计算例题及答案
  • 税负率偏低
  • 房地产开发企业销售自行开发的房地产项目
  • 闲置固定资产如何折旧
  • 可供分配利润的计算公式
  • 小规模纳税人发票可以抵扣吗
  • 税控盘的会计分录怎么做
  • 空气检测费计入什么科目
  • xp系统找不到搜索功能
  • windows vista秘钥
  • centos7如何设置ssh免密登陆
  • linux怎么使用ping命令
  • windows8怎么关闭广告弹窗
  • windows7禁用wifi怎么办
  • win7修改系统版本
  • cocos2dx lua android glsurfaceview 截图
  • shell中数组如何定义
  • NodeJS配置HTTPS服务实例分享
  • SendTo增强版 批处理实用小工具
  • javascript刷新页面的几种方法
  • python 钉钉打卡定位
  • 安卓手机管家推荐
  • js解析json字符串获取key
  • 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
  • 在jquery中fadein
  • 增值税发票税控开票软件客服
  • 北京市地税局领导
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设