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

  • 手机发现病毒怎么处理才是对的(手机发现病毒危险不处理行不行?)

    手机发现病毒怎么处理才是对的(手机发现病毒危险不处理行不行?)

  • 小米监控摄像头怎么连接无线网络(小米监控摄像头怎么连接手机)

    小米监控摄像头怎么连接无线网络(小米监控摄像头怎么连接手机)

  • 三星Galaxy Note 20 Ultra 5g版屏幕尺寸是多少

    三星Galaxy Note 20 Ultra 5g版屏幕尺寸是多少

  • 华为手机怎么连拍照片(华为手机怎么连接电脑)

    华为手机怎么连拍照片(华为手机怎么连接电脑)

  • 华为手机三包多长时间(华为手机三包多久更新)

    华为手机三包多长时间(华为手机三包多久更新)

  • 微信怎么按日期查聊天记录(微信怎么按日期查找添加的好友)

    微信怎么按日期查聊天记录(微信怎么按日期查找添加的好友)

  • 快手什么情况账号会封禁(快手什么情况账号被冻结)

    快手什么情况账号会封禁(快手什么情况账号被冻结)

  • 手机计步器原理(手机计步器原理视频)

    手机计步器原理(手机计步器原理视频)

  • 网络制式不支持是什么意思(网络制式不支持上卡贴可以用4G吗)

    网络制式不支持是什么意思(网络制式不支持上卡贴可以用4G吗)

  • 苹果x摔了有黑点会扩散吗(iphonex摔出黑色)

    苹果x摔了有黑点会扩散吗(iphonex摔出黑色)

  • ios13黑暗模式怎么开(苹果的ios13怎样开启黑夜模式)

    ios13黑暗模式怎么开(苹果的ios13怎样开启黑夜模式)

  • 多媒体的4个基本特征(多媒体的六种基本元素)

    多媒体的4个基本特征(多媒体的六种基本元素)

  • 对方帐号处于限制登录状态是什么意思(对方账号已被限制交易)

    对方帐号处于限制登录状态是什么意思(对方账号已被限制交易)

  • ipad不能用万能钥匙吗(苹果平板ipad万能钥匙怎么不能用)

    ipad不能用万能钥匙吗(苹果平板ipad万能钥匙怎么不能用)

  • iphone原彩显示省电吗(iphone原彩显示省电还是耗电)

    iphone原彩显示省电吗(iphone原彩显示省电还是耗电)

  • 苹果无线耳机怎么挂电话(苹果无线耳机怎么充电是正确的)

    苹果无线耳机怎么挂电话(苹果无线耳机怎么充电是正确的)

  • 拼多多二级处罚几天(拼多多二级处罚是什么,被处罚了有什么后果?)

    拼多多二级处罚几天(拼多多二级处罚是什么,被处罚了有什么后果?)

  • 看朋友圈怎么选择时间(看朋友圈怎么选日期查看)

    看朋友圈怎么选择时间(看朋友圈怎么选日期查看)

  • 苹果十一是5g吗(iphone十一是5g吗)

    苹果十一是5g吗(iphone十一是5g吗)

  • 怎么关闭个人相册一栏(怎么关闭个人相册)

    怎么关闭个人相册一栏(怎么关闭个人相册)

  • 苹果手机均衡器在哪里(苹果手机均衡器深夜对手机有影响吗)

    苹果手机均衡器在哪里(苹果手机均衡器深夜对手机有影响吗)

  • 电脑键盘打字错乱(电脑键盘打字错乱按字母出数字)

    电脑键盘打字错乱(电脑键盘打字错乱按字母出数字)

  • 虚拟机怎么安装Ubuntu 15.04试用?(虚拟机怎么安装iso镜像文件)

    虚拟机怎么安装Ubuntu 15.04试用?(虚拟机怎么安装iso镜像文件)

  • 人体姿态识别(人体姿态识别国内外研究现状)

    人体姿态识别(人体姿态识别国内外研究现状)

  • 土地使用税计入税金及附加吗
  • 公司出售厂房需要交哪些税
  • 办公楼出租价格怎么算
  • 收到财政局拨款填到现金流量表哪一项
  • 对外捐赠固定资产属于营业外支出吗
  • 环保税计税依据怎么算
  • 小规模开专票的条件
  • 国内增值税专用发票造假第一大案
  • 一般纳税人拿到小规模的专票
  • 装载机折旧年限是几年
  • 出纳单据交接表怎么填写
  • 已交的增值税能计入费用吗
  • 财产行为税计税依据
  • 没有签字的支出凭证怎么处理?
  • 电子发票怎么红冲步骤视频
  • 单边征收
  • 职工教育经费怎么做账
  • 其他应付款质保金到期怎么附单据
  • 没有车船税证明可以年检吗
  • 工程结算完后剩余资金如何处理?
  • 企业承担社保
  • 小规模企业低值易耗品摊销方法
  • 预付款能开发票吗?
  • 银行票据abs付款的几种方式
  • 工效挂钩企业工资税前扣除有何规定?
  • 付出去的款项退回怎么做账
  • 汇算清缴补交的所得税会计分录
  • 如何整理流水账目
  • 增值税专用发票丢了怎么补救
  • 赠送积分有两种形式
  • 财务费用明细科目有哪些
  • Windows操作系统出现内存错误解决方法
  • php proc_open
  • 雪山上的老鼠
  • ant design vue 表单
  • 微信小程序获取位置信息的权限在哪里修改位置
  • python 微信红包
  • php中url什么意思
  • 未达起征点怎么填申报表
  • 哪些税费可以抵扣
  • 网站缩略图生成
  • 基础的数据类型
  • 微信平台的收入从哪里来
  • 发票食品类包含哪些
  • 公司买的微波炉算职工福利费吗
  • mysql几千万条数据
  • 弃置费用的财务费用计算
  • 资本公积的用途有哪些
  • 应纳税的物品有哪些
  • 个人扣税是怎么扣的
  • 电梯折旧费计算方法
  • 工资和社保基数的关系
  • 异价调拨什么意思
  • 出差补助办法
  • 工会经费缴纳会计分录
  • 油票抵税能抵多少
  • 施工图审查费计算公式
  • 限额领料单属于什么凭证多选题
  • 做会计的步骤
  • winds密码忘记了
  • version 2什么意思
  • mac的dns怎么设置最快
  • linux临时目录一般存在哪个文件夹
  • linux压缩.z
  • shell32.exe - shell32是什么进程 有什么用
  • win7安装软件后所有打开变成记事本
  • win10 rs3
  • opengl怎么学
  • unity3d基础操作
  • 深入了解工作优势怎么回答
  • 刨根问底造句
  • javascript题
  • nodejs lua
  • jQuery插件下载
  • jquery网页
  • python3遍历字典
  • 三亚国税局各区领导班子
  • 河南省税务局冯伟
  • 福建省地方税务局领导名单
  • 个税已申报税额为0是什么意思
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设