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

  • ipad一键锁屏键在哪里(ipad一键锁屏怎么设置方法)

    ipad一键锁屏键在哪里(ipad一键锁屏怎么设置方法)

  • win11桌面图标怎么设置(win11桌面图标怎么隐藏)

    win11桌面图标怎么设置(win11桌面图标怎么隐藏)

  • 小米如何关闭只在wlan下下载(小米如何关闭只读功能)

    小米如何关闭只在wlan下下载(小米如何关闭只读功能)

  • 魅族18有呼吸灯吗(魅族18呼吸灯只亮一次)

    魅族18有呼吸灯吗(魅族18呼吸灯只亮一次)

  • 苹果12有超广角吗(苹果12有超广角模式吗)

    苹果12有超广角吗(苹果12有超广角模式吗)

  • 微博主页没有相册选项(微博个人主页看不到相册)

    微博主页没有相册选项(微博个人主页看不到相册)

  • qq怎么删自动回复的自定义信息(qq怎么删自动回复话)

    qq怎么删自动回复的自定义信息(qq怎么删自动回复话)

  • 微信小程序在哪里 (微信小程序在哪里找?)

    微信小程序在哪里 (微信小程序在哪里找?)

  • 小米手环sn码在哪里(小米手环sn码能查出来什么)

    小米手环sn码在哪里(小米手环sn码能查出来什么)

  • 手机突然不能全屏播放为什么(手机不能全面屏的原因)

    手机突然不能全屏播放为什么(手机不能全面屏的原因)

  • 苹果iwatch哪款有摄像头(apple watch哪款值得入手)

    苹果iwatch哪款有摄像头(apple watch哪款值得入手)

  • 抖音的文案怎么复制(抖音的文案怎么跑去评论区了)

    抖音的文案怎么复制(抖音的文案怎么跑去评论区了)

  • 链接到前一条页眉在哪个工具栏中(链接到前一条页眉为什么是灰色的)

    链接到前一条页眉在哪个工具栏中(链接到前一条页眉为什么是灰色的)

  • 打电话听不到声音是怎么回事(打电话听不到声音,微信发不了语音)

    打电话听不到声音是怎么回事(打电话听不到声音,微信发不了语音)

  • 淘宝严重不当注册怎么办(淘宝严重不当注册是什么意思)

    淘宝严重不当注册怎么办(淘宝严重不当注册是什么意思)

  • 小米手机突然不计步(小米手机突然不支持快充了怎么办)

    小米手机突然不计步(小米手机突然不支持快充了怎么办)

  • mac地址是怎么生成的(mac地址是如何生成的)

    mac地址是怎么生成的(mac地址是如何生成的)

  • 苹果手机怎么全部删除短信(苹果手机怎么全屏拍照)

    苹果手机怎么全部删除短信(苹果手机怎么全屏拍照)

  • 怎样获得熊猫办公vip(怎样获得熊猫办公软件)

    怎样获得熊猫办公vip(怎样获得熊猫办公软件)

  • 华为手机屏幕录制快捷键(华为手机屏幕录制文件保存在哪)

    华为手机屏幕录制快捷键(华为手机屏幕录制文件保存在哪)

  • ps怎么p字上去(ps怎么把字p上去)

    ps怎么p字上去(ps怎么把字p上去)

  • 微型机中使用的硬盘属于(微型机使用的逻辑部件)

    微型机中使用的硬盘属于(微型机使用的逻辑部件)

  • vue怎么延长照片时间(vue怎么让照片放慢一点)

    vue怎么延长照片时间(vue怎么让照片放慢一点)

  • 在页面底端普通数字3设置为罗马(页面底端的普通数字)

    在页面底端普通数字3设置为罗马(页面底端的普通数字)

  • 天猫发票在哪里查看(天猫发票在哪里打印)

    天猫发票在哪里查看(天猫发票在哪里打印)

  • 小红书怎么保存图片无水印(小红书怎么保存动图)

    小红书怎么保存图片无水印(小红书怎么保存动图)

  • pqhelper.exe是什么进程  pqhelper进程查询

    pqhelper.exe是什么进程 pqhelper进程查询

  • 固定资产一次性扣除申报表怎么填
  • 个人所得税租房专项扣除标准
  • 分公司可以独立签约吗
  • 固定资产折旧直接计入成本
  • 不动产租赁服务的税率是多少
  • 注册资本没有实缴需要交印花税吗
  • 个体户交了增值税又开负数发票怎么退税
  • 2019新租赁准则账务处理举例
  • 企业存款利息计入什么科目
  • 私募基金款打到什么账户
  • 退回投标保证金分录
  • 其他应收款 应收账款
  • 漏提折旧可以所得税扣除吗
  • 外购产品赠送他人合法吗
  • 应交税费明细分类账图片
  • 劳务派遣案例分析题
  • 一般纳税人当月只有进项没有销项怎么做账
  • 奖金退还
  • 销售货物的运输费用计入成本吗知乎
  • 代扣代缴企业所得税10%
  • 长投成本法分红分录
  • 免抵退税额如何计算
  • 免征的税额当月计入营业外收入吗
  • 发票联丢失怎么做账
  • 个人取得的哪些收入属于经营所得
  • 怎样查一个银行的行号
  • 股东能随便提走入账资金吗
  • 除了个税还有什么税
  • pos机未入账怎么回事
  • 留底的进项税额记哪儿?
  • 发票红冲是什么意思需要给钱吗
  • 图片注入php
  • 预收账款的账务处理摘要
  • 小狐狸803050
  • php trait用法
  • php遍历目录
  • php代码用什么工具
  • vue组件标签
  • 【C#+JavaScript+SQL Server】实现Web端考试系统 六:后台管理模块设计(附源码和资源)
  • node js教程
  • vue destroyed销毁组件
  • kaldi官网
  • find命令结果怎么导出到文本
  • 增值税普通发票需要交税吗
  • 建筑业的账务处理方法
  • 调用系统服务出错原因
  • 出口免税免的是哪部分的税
  • 申报个人所得税的软件叫什么
  • 房地产企业的业务范围
  • 公益基金会的发起人是谁
  • 红冲暂估原材料如何做会计分录
  • 帮别人维修东西怎么开票
  • 简易计税项目的进项税能抵一般项目的销项税额吗?
  • 公司租赁厂房
  • 未付工程款范围内承担
  • 专票当普票用进项需要转出吗
  • 红冲发票需要收回原发票吗 税屋
  • 资产负债表负债率怎么计算
  • 商贸企业的销售成本怎么算
  • mysql工作内容
  • 连接mysql数据出错1045
  • 谁编写了元素周期表
  • 系统组策略打不开
  • 直接在u盘上工作
  • rapapp.exe - rapapp是什么进程 有何作用
  • PQV2ISECURITY.EXE - PQV2ISECURITY是什么进程 有什么用
  • win7运行老游戏方法
  • perl -i -pe
  • 骨头动漫头像
  • dos命令遍历文件
  • vue 分页 实现
  • python动态网页开发教程
  • css弹性布局是什么
  • 小规模企业所得税怎么算
  • 什么东西的海关不能寄
  • 临沂国税地税局领导班子
  • 税控盘服务费必须每年交吗为什么
  • 餐饮发票怎么看真假
  • 关于铁路安全的漫画
  • 深圳宝安到揭阳大巴
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设