位置: 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进阶视频教程)

  • 营销网分享10个微信推广方法(营销在线平台)

    营销网分享10个微信推广方法(营销在线平台)

  • 联想拯救者怎么截屏(联想拯救者怎么样)

    联想拯救者怎么截屏(联想拯救者怎么样)

  • iphone13不支持微距吗(iphone不支持微信)

    iphone13不支持微距吗(iphone不支持微信)

  • 电视极光tv怎么退出登录

    电视极光tv怎么退出登录

  • vivo apex 2020发布时间(vivo apex2019)

    vivo apex 2020发布时间(vivo apex2019)

  • iqoo黑屏没反应(iqoo黑屏没反应手机发烫)

    iqoo黑屏没反应(iqoo黑屏没反应手机发烫)

  • 手机搜狗输入法怎么打罗马数字(手机搜狗输入法自定义短语设置)

    手机搜狗输入法怎么打罗马数字(手机搜狗输入法自定义短语设置)

  • qq发说说怎么屏蔽别人(qq发说说怎么屏蔽群成员)

    qq发说说怎么屏蔽别人(qq发说说怎么屏蔽群成员)

  • Nova6屏幕哪家的(华为nova6屏幕品牌)

    Nova6屏幕哪家的(华为nova6屏幕品牌)

  • 手机wps不允许超出有效区域(手机wps文档超过大小怎么办)

    手机wps不允许超出有效区域(手机wps文档超过大小怎么办)

  • 编码有哪些(信源编码有哪些)

    编码有哪些(信源编码有哪些)

  • 苹果手机网络运营商不可用(苹果手机网络运营商的显示怎么设置)

    苹果手机网络运营商不可用(苹果手机网络运营商的显示怎么设置)

  • 大王卡打qq视频免流吗(大王卡打qq视频收费吗)

    大王卡打qq视频免流吗(大王卡打qq视频收费吗)

  • 怎么设计宣传单(如何设计宣传单吸引人)

    怎么设计宣传单(如何设计宣传单吸引人)

  • 快手怎么发10的视频(快手怎么发的作品加上小黄车)

    快手怎么发10的视频(快手怎么发的作品加上小黄车)

  • boss直聘被锁定了可以解封吗(boss直聘被锁定多久解封)

    boss直聘被锁定了可以解封吗(boss直聘被锁定多久解封)

  • 抖音删评论有影响吗(抖音删评论影响权重吗)

    抖音删评论有影响吗(抖音删评论影响权重吗)

  • 网易云怎么取消自动续费(网易云怎么取消一起听)

    网易云怎么取消自动续费(网易云怎么取消一起听)

  • 美颜相机怎么设置九宫格拍照(美颜相机怎么设置广角模式)

    美颜相机怎么设置九宫格拍照(美颜相机怎么设置广角模式)

  • 苹果x上市日期

    苹果x上市日期

  • 学信网账号注销的后果(学信网账号注销后学籍还在吗)

    学信网账号注销的后果(学信网账号注销后学籍还在吗)

  • 全民k歌可以传到快手吗(全民k歌可以传歌吗)

    全民k歌可以传到快手吗(全民k歌可以传歌吗)

  • 如何下载图虫上的照片(图虫下载要钱吗)

    如何下载图虫上的照片(图虫下载要钱吗)

  • 安居客如何切换城市(安居客如何切换租房)

    安居客如何切换城市(安居客如何切换租房)

  • keil4怎么生成hex文件(keil4怎么生成hex文件没有)

    keil4怎么生成hex文件(keil4怎么生成hex文件没有)

  • 触宝电话如何改号码(触宝电话如何改手机号)

    触宝电话如何改号码(触宝电话如何改手机号)

  • 苹果xr怎么看是不是国行(苹果xr怎么看是不是双卡双待)

    苹果xr怎么看是不是国行(苹果xr怎么看是不是双卡双待)

  • cp命令  复制文件或目录(cp命令复制文件到另一个目录并改名)

    cp命令 复制文件或目录(cp命令复制文件到另一个目录并改名)

  • 员工扣了个税但没交给税务局
  • 取得的证券投资业绩
  • 私车公用是否合法
  • 企业捐赠灾区
  • 残保金滞纳金能抵扣吗
  • 无票收入是否要交税
  • 转登记纳税人留抵退税政策
  • 冲红重开发票增值税怎么处理
  • 库存商品进价成本
  • 可抵扣农产品进项税额吗
  • 应收账款折扣怎么计算
  • 被投资方亏损怎么处理
  • 材料暂估价结算调整规定
  • 采购工程物资会议纪要
  • 新注册成立的公司可以往前补交社保吗
  • 招行理财产品哪些可靠
  • 土地增值税暂行条例实施细则2022
  • 企业所得税补充申报怎么报
  • 流转税与所得税的区别
  • 贸易公司未开票收入要报税吗
  • 销项负数发票会计分录怎么写
  • 发票冲红后是否可以重开
  • 财务会计中关于坏账损失的账务处理
  • 五险会计分录会计处理
  • 贷款资金取现就无法追查了吗
  • ubuntu系统u盘安装
  • 对公账户代扣
  • gradle视频教程
  • php递归实现1到100的和
  • 火狐十大必用插件
  • 一般纳税人在什么情况下,不可以开具增值税专用发票
  • 预付装修费的会计处理分录
  • zen框架
  • Spring Security(七)-- AuthenticationProvider
  • 工会经费免征三年的文件山东
  • 物流公司挂靠会计处理
  • 速动资产是指
  • 出口增值税免抵退税
  • 企业异地预交的税怎么算
  • 织梦cms要钱吗
  • 增值税进项税额加计抵减政策
  • 验资费如何做账务处理
  • 现金解款单是什么
  • 资产减少的方式有哪些?
  • 小规模开票的税点是多少
  • 涉税信息声明怎么提供
  • 汇算清缴的会计分录怎么做
  • 受托方受托代销商品会计分录
  • 应收票据背书支付是什么
  • 应纳税工资是应发还是实发
  • 物流公司主营业务成本会计分录
  • 发票认证是为了什么
  • 长期待摊费用如何结转
  • 哪些发票必须注销
  • 公司增资有什么作用
  • 计入当期损益是不是计入三大期间费用
  • 商业资本金
  • win8系统如何查看电脑型号
  • 便签windows
  • 注册表禁止windows自动更新
  • linux不常用命令
  • auepuc.exe是什么软件
  • win10 rs5
  • RegSrvc.exe - RegSrvc是什么进程 有什么用
  • win10右键图片
  • Android OpenGL ES(二)----平滑着色
  • node.js的使用
  • node.js怎么样
  • android 自定义spinner
  • bat判断变量的值
  • 噩梦 gd
  • python打包可执行pyx
  • 山东国地税合并6月挂牌
  • 个体工商户税务申报怎么操作流程
  • 四川增值税发票查验平台
  • 广东交通定额发票在哪开
  • 建筑业按多少税收
  • 在监狱要花钱吗
  • 出口退税账户标识是否怎么选
  • 怎样在网上申报税务流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设