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

  • 什么是抄税清卡业务
  • 增值税发票上数量与单价
  • 一键报税财务软件破解版
  • 一般纳税人注销库存需要补交税吗
  • 盈利能力也可以反映短期偿债能力
  • 股东退股如何清算表格
  • 销项负数发票原发票还有用吗?
  • 补提折旧调整分录
  • 个人开技术服务费税率是多少
  • 以前年度做的预算怎么查
  • 长期股权投资收到红利会计处理
  • 财产租赁所得如何申报
  • 咨询服务费记到什么科目
  • 收到原未计入应收项目的交易性金融资产的利息
  • 在年度汇算清缴前取得去年成本发票
  • 个体工商户转为企业要交税吗
  • 增值税普通发票几个点
  • 预缴企业所得税分录
  • 国税地税合并后叫什么名称
  • 以旧换新增值税税率是多少
  • 转口贸易是否缴增值税
  • 劳务费开发票还要代扣代缴吗?
  • 小规模应交税费有三级科目吗
  • 一个网页账号在多个电脑登录
  • win10系统如何在游戏中禁用输入法
  • 社会保险费的征收程序
  • win10待机久了自动关机
  • 电脑网页播放视频只有声音没有画面
  • 简要说明php web的工作流程
  • 合作社实际没有法人代表
  • linux系统如何更改主机名
  • 债务重组法律服务方案
  • 境外汇款犯法吗
  • 银行收取对公账户服务费有什么用
  • kavsvc.exe - kavsvc是什么进程 有什么作用
  • macos10.15.7补充更新
  • 经销商会议流程安排
  • 【已解决】VUE3+webpack >5报错问题
  • vue打包成一个文件
  • 工程施工余额在哪方
  • 期末余额跟年初余额是什么意思
  • 【BEV】TPVFormer复现以及原理
  • vue中computed作用
  • 此战成硕,我成功上岸西南交通大学了~~~
  • php中global
  • php自动载入文件的函数
  • java开发从入门到精通
  • 上缴税金怎么算税额
  • 工程施工企业的增值税税率是多少
  • 资产负债表的负债项目显示了企业所负担债务的
  • 算税负是含税还是不含税
  • 企业间借款利息收入
  • 长期借款利息如何计算
  • 小规模纳税人无票收入申报表怎么填
  • 工业企业中制造费用包括哪些内容
  • 跨月的红字发票申请表怎么撤销
  • 我国会计准则规定企业的会计核算基础是
  • 个人向公司借款怎么写
  • 我国居民企业判断标准
  • 房地产公司工程部岗位职责
  • 机票行程单如何看座位等级
  • 出库单上面的价格是什么价格
  • 所得税费用的确认分录
  • 事业单位打款多久到账
  • 公司转让二手车需要缴纳什么税
  • 应付账款和预收账款是负债吗
  • 原始凭证填制要点在原始凭证上书写阿拉伯数字正确的有
  • centos安装软件教程
  • fedora vlc
  • windows 10 build 9888
  • macbookpro如何点击
  • win7小键盘怎么调出
  • linux怎样添加用户
  • nodejs 静态页面
  • 利用的英文
  • javascript原生函数的源代码
  • 动态表单的设计与实现
  • 浙江省医保改革方案2022
  • 上海增值税发票红字怎么开
  • 企业自有房屋需要交税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设