最新要闻
- 自研国产客机梦碎 消息称日本终止SpaceJet飞机 曾比我国进展都快
- 每日播报!8999元 科大讯飞推出T20 Pro学习机:2.5K屏、12000mAh大电池
- 全球微资讯!又又又融资1.35亿美元!贾跃亭喊话:FF 91将交付 百万豪车你买吗?
- 5499元 爱玛指挥官2023两轮电动车发布:石墨烯电池 145km长续航
- 《零:月蚀的假面》数字豪华版服装公布:旗袍黑丝超吸睛
- 天天最新:黄光裕频繁减持国美套现10亿 把控股股东席位“减”没了
- 小屏幕拜拜!新款比亚迪秦PLUS DM-i内饰官图:最大短板被补足
- 【焦点热闻】可装进口袋!大疆新品DJI Mini 2 SE无人机2月9日发布
- 【全球播资讯】抛弃ARM公版 高通纯自研CPU骁龙8cx Gen4曝光:12核3.4GHz性能怪兽
- 焦点热讯:林志颖车祸后首谈特斯拉:称自己还在开特斯拉 没有任何阴影
- 世界动态:爱奇艺用户吐槽会员跳不过广告!客服称登陆设备太多 账号异常
- 快播:6人网订民宿遇坐地起价:店家称有20多人订此房间 谁加价谁住
- 环球今日讯!索尼PS5不香了!会员数量持续流失 微软迎头赶上
- 10大“刮油”食物 佳节必备 转给需要的朋友!
- 环球视点!《流浪地球2》太空电梯能实现吗?专家:实现难度极大
- 全球热议:满血40Gbps USB4 铭凡锐龙7000 8核准系统2549元(液金散热)
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当前快看:记录--使用Lunchbox 在 vue3 中创建一个 3D 地球
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
什么是 Lunchbox.js
Lunchbox.js 是 Three.js 的 Vue 3 自定义渲染器。 你可以把它想象成 Vue 的 react-three-fiber
。
该库通过组件提供对原始 Three.js 对象和类的访问,例如:
- mesh
- lights
- geometries
- group
- materials
这些组件是 Lunchbox.js 的构建块。
(资料图片仅供参考)
例如,在 Three.js 项目中创建标准网格时,我们会使用像 BoxGeometry()
这样的几何类来创建长方体形状,使用像 MeshBasicMaterial()
这样的材质类对其应用颜色,就像在下面的代码中一样:
// 创建边长为 1 的几何图形const geometry = new THREE.BoxGeometry(1, 1, 1)// 创建黄色材质const material = new THREE.MeshBasicMaterial({ color: 0xffff00 })// 在网格中结合几何图形和材质const mesh = new THREE.Mesh(geometry, material)// 将该网格添加到场景中scene.add(mesh)为了在 Lunchbox.js 应用程序中创建相同的网格,我们将使用相同的类,除了作为组件,而不是将它们分配给变量并将它们与
Mesh()
类组合,我们将它们嵌套在
中 组件,如下所示:你会注意到,在上面的示例中,每个
组件都与对应的 Three.js 类和一个camelCase
名称相匹配。// three.jsnew THREE.Mesh()Lunchbox.js 和 Three.js 的语法非常相似,但有一些不同之处需要注意。 例如,每个// three.jsnew THREE.BoxGeometry()
组件都使用args
属性将参数作为props
。argsprop
接受一个参数数组并将其传递给组件的类构造函数。new THREE.BoxGeometry(1, 2, 3)上面的代码将在 Lunchbox 中转换为以下内容:
其他 Three.js 对象属性,例如
MeshBasicMaterial
类的color
属性,可以作为响应式属性添加到
组件上。 这就像我们在前面的例子中看到的一样。但是,使用点符号的属性(例如位置向量)将在
组件中使用破折号 - 进行设置,如下所示:Lunchbox为大多数 Three.js 类提供内置支持; 你可以在此处找到组件列表。
可以使用 Lunchbox的app.extend
方法添加包含的组件中不可用的类。 例如,下面是我们如何将orbitControl
类添加到 Lunchbox:
import { createApp } from "lunchboxjs"import App from "YourApp.vue"import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"createApp(App) .extend({ OrbitControls }) .mount("#app")
extend()
方法是 Lunchbox 的独特功能之一,使用该方法添加的类继承了
组件的所有功能。
我们已经了解了 Lunchbox.js 的核心概念,接下来我们将了解如何使用 Lunchbox 进行构建。
开始
要设置一个 Lunchbox.js 应用程序,首先使用 Vite 的 CLI 安装 Vue:
npm create vite@latest运行命令后,从库列表中选择 Vue 并为项目命名。 接下来,cd 进入项目文件夹并运行以下命令:
npm install lunchboxjs three
此命令将安装 Lunchbox.js 和 Three.js 作为 Vue 应用程序的依赖项。 你可以在根目录的 package.json 文件中查看它们。
接下来清理项目中的样板代码,打开main.js
文件,将内容替换为如下代码:
import { createApp } from "lunchboxjs"import App from "./App.vue"createApp(App).mount("#app")
在这里,我们从 lunchboxjs 而不是从 vue 导入 createApp
函数。 这会将 Vue 应用程序转换为 Lunchbox 环境。
现在我们可以开始在我们的应用程序中构建和渲染 3D 对象。
创建场景
场景是允许我们设置要渲染的项目的对象。 它就像一个显示区域,可以将对象放在一起并呈现给浏览器。 以下是 Three.js 中设置的场景示例:
const scene = new THREE.Scene();const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );const renderer = new THREE.WebGLRenderer();renderer.setSize( window.innerWidth, window.innerHeight );document.body.appendChild( renderer.domElement );
在Lunchbox.js 中设置场景更直接且不那么神秘。 该库提供了一个
组件,其中包含用于在 Three.js 中创建渲染器和场景的底层代码。
要进行设置,请转到 App.vue 主组件并将
组件放在模板部分中,如下所示:
嵌套在
标记中的每个对象都将呈现给浏览器。 如果你保存代码并启动开发服务器,你应该会看到类似于下图的黑屏。这个黑屏是我们应用的渲染器; 我们添加到场景中的任何内容都将显示在这里。 你可以使用背景道具更改背景颜色,如下所示:
以下是你可以在
组件上使用的一些 props:
- background
- cameraPosition
- camera
- zoom
- shadow
添加网格
几何是用于定义网格形状的 Three.js 类。 在本文前面,我们演示了如何使用 boxGeometry
组件渲染长方体网格。 在这里,我们将看到如何向浏览器渲染更多 3D 形状。
Lunchbox.js 带有几个自动生成的内置几何组件,你可以在此处查看可用组件的列表。
继续并在Lunchbox标签内添加一个
组件,并在其中嵌套你选择的任何几何组件。 不要忘记包含一个带有颜色道具的材质组件。
材质组件利用 Three.js Material()
类来定义网格的各种表面属性。
组件只接受一个 Geometry()
和 Material()
组件。 要为场景添加更多形状,我们必须创建更多网格,每个 Geometry()
一个,如下所示。
或者,我们可以为每个形状创建单独的组件并将它们导入到主组件中,如下所示:
<script> import {Sphere} from "./Sphere.vue"</script>每个几何组件都接受独特的参数,这些参数可用于微调和操纵其宽度、高度、平滑度和其他视觉特征。 可以使用
args
属性在 Lunchbox 中设置这些参数。组件还接受多个 props。 由于它作为
Geometry()
的容器,它还可以用于操纵位置、旋转等。...
在上面的代码中,我们添加了一个 positoin
属性,它将球体网格沿 x 轴向右移动 4px。
以下是一些可用于操纵形状的网格 props:
- position (x, y, z)
- rotation (x, y, x)
- scale (x, y)
网格也可以使用
组件进行分组。 该组件用作几何图形的容器,我们可以在每个
中添加任意数量的
。
添加纹理
目前,我们的网格看起来不是很逼真。 应用的材料使它们看起来有点塑料。 我们可以使用 Lunchbox 中的
组件应用纹理,为每个网格赋予更逼真的外观。
组件利用 Three.js Texture() 类,它让我们可以将逼真的纹理映射到引擎盖下的网格表面。 为了演示这个过程,我们将创建一个地球的 3D 模型。
要创建地球,请先清除场景,然后使用
组件创建具有球面几何形状的新网格。
接下来,在网格中添加一个
组件并将
嵌套在其中,如下所示:组件接受 src
和 attach
prop。 src
属性接受纹理材质的相对或绝对路径,而 attach
属性接受映射选项。
我们将在这个例子中使用 map
和 bumpMap
选项。 换句话说,我们必须在网格组件内声明第二个
。
复制下面的图像并将它们放在项目的 /public
文件夹中:
接下来,将第一个图像的路径添加到第一个
组件的src
属性中,并为附加属性赋予一个“map”
值。
如果你现在保存项目,浏览器中将出现一个球形轮廓。 这是因为我们的场景没有光源。
要解决此问题,请在
组件中添加
和
组件。
现在,如果你保存项目并返回浏览器,你应该会看到类似于下图的内容:...
为了使图像更有趣和视觉上更令人惊叹,我们将使用第二张图像为地球添加逼真的轮廓。
我们将按照我们处理第一张图像的方式进行处理。 将图像的路径添加到 src 道具,但这次给attach
prop一个“bumpMap”
值。
添加动画
Lunchbox.js 提供了一个 onBeforeRender
函数,在渲染之前或之后的每一帧都会调用该函数。 使用此函数,我们可以通过在每一帧上为其旋转属性添加一个值来为我们的地球设置动画。
转到 App.vue 组件的脚本部分并从 Vue 导入 ref
和从 Lunchbox 导入 onBeforeRender
函数。
import {ref} from "vue"import {onBeforeRender} from "lunchboxjs"接下来,将
ref
分配给一个rotation
变量,并将一个具有以下属性的对象传递给它:const rotation = ref({y: 0});然后,调用 onBeforeRender 函数并添加以下代码:
onBeforeRender(() =>{ rotation.value.y += 0.02})在这里,我们在每一帧上为对象的 y 轴旋转添加 0.02 度。 最后,为地球的网格添加一个
rotation-y
属性,并将rotation.y
值传递给它,如下所示:现在,如果你保存项目,你的地球应该像下面的例子一样很好地动画。
你可以通过将 x 和 z
属性添加到 ref、onBeforeRender
函数和地球的网格来添加更多旋转动画。
添加事件
我们可以像添加 Vue 中的任何其他元素一样向
组件添加事件监听器。 为了演示,我们将添加一个 click
事件,当它被触发时会暂停我们的地球动画。
继续在地球网格上创建一个 onClick
事件,如下所示:
接下来,使用 ref 创建一个变量,并将布尔值 true 传递给它。 使用...
if
语句将声明包装在onBeforeRender
函数中:const active = ref(true)onBeforeRender(() =>{ if(active){ rotation.value.y += 0.02 }})
在这里,我们将活动变量分配为 if 语句的条件。 当该值设置为 false 时,语句中的代码将不会被执行,动画会暂停。
最后,将以下代码添加到
组件的onClick
事件中:
...
现在地球的动画在点击时会暂停播放,如下图:
现在,我们已经在 Vue 中成功构建了 3D 视觉效果!
本文转载于:
https://juejin.cn/post/7126059371938709517
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
-
当前快看:记录--使用Lunchbox 在 vue3 中创建一个 3D 地球
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助什么是Lunchbox jsLunchbox js是Three...
来源: 当前快看:记录--使用Lunchbox 在 vue3 中创建一个 3D 地球
环球看点!做一个“不那么差”的程序员,有多难?
自研国产客机梦碎 消息称日本终止SpaceJet飞机 曾比我国进展都快
每日播报!8999元 科大讯飞推出T20 Pro学习机:2.5K屏、12000mAh大电池
全球微资讯!又又又融资1.35亿美元!贾跃亭喊话:FF 91将交付 百万豪车你买吗?
5499元 爱玛指挥官2023两轮电动车发布:石墨烯电池 145km长续航
《零:月蚀的假面》数字豪华版服装公布:旗袍黑丝超吸睛
天天报道:【交互式用户流程与演示设计】上海道宁与Overflow让您能更自信的展示您的设计
Helm
2023年Java面试正确姿势(1000+面试题附答案解析)
天天最新:黄光裕频繁减持国美套现10亿 把控股股东席位“减”没了
小屏幕拜拜!新款比亚迪秦PLUS DM-i内饰官图:最大短板被补足
【焦点热闻】可装进口袋!大疆新品DJI Mini 2 SE无人机2月9日发布
【全球播资讯】抛弃ARM公版 高通纯自研CPU骁龙8cx Gen4曝光:12核3.4GHz性能怪兽
焦点热讯:林志颖车祸后首谈特斯拉:称自己还在开特斯拉 没有任何阴影
天天速看:统信 UOS 重置Root账号密码 获取 Root 权限
全球快资讯:Spring:声明式事务
每日热点:Docker-harbor私有仓库
世界动态:爱奇艺用户吐槽会员跳不过广告!客服称登陆设备太多 账号异常
快播:6人网订民宿遇坐地起价:店家称有20多人订此房间 谁加价谁住
环球今日讯!索尼PS5不香了!会员数量持续流失 微软迎头赶上
10大“刮油”食物 佳节必备 转给需要的朋友!
环球视点!《流浪地球2》太空电梯能实现吗?专家:实现难度极大
全球信息:【秒杀】NTP时钟同步让秒杀成毫秒微秒纳秒杀
全球热议:满血40Gbps USB4 铭凡锐龙7000 8核准系统2549元(液金散热)
中国用户立大功!库克称iPhone很多技术灵感来自中国
广汽菲克破产 4S店已无售后!官方:我们为车主兜底
研究称调整脑电波能加速成人学习速度:至少快3倍
吾爱破解 2023 春节解题领红包之 Web 题解
开源即时通讯IM框架 MobileIMSDK v6.3 发布
MySQL执行流程
Python工具箱系列(二十四)
比眼镜蛇还毒50倍!女子买到蓝环章鱼险食用 反复辨认后扔了
信息:让ChatGPT写一篇《比亚迪能否打败特斯拉》的评论文章
Intel中国特供新神U i5-13490F首曝:频率更高、缓存更大
当前最新:(笔记)【NTP系列:06】NTP时间同步配置总结:Windows(W32Time)作为NTP时钟源服务端,Linux作为客户端
java注解与反射详解
世界快看点丨ChatGPT可能的影响与机会
当前短讯!面试官:实现异步的20种方式,你知道几个?
比亚迪海鸥实车现身 网友:买早了 8万元绝对卖爆
打破Steam Deck 12周霸榜!《霍格沃茨之遗》登顶Steam周销榜
今日精选:老人无证驾驶无牌三轮车逆行被撞还被罚 网友:建议全国推广
【世界快播报】专家称成年人有权做个废物!网友:反而更激励了我
天天亮点!00后平均期望薪资超7K 月薪高于一切:曾被痛批不应为钱选择工作
天天微头条丨drools规则动态化实践
全球微动态丨idea引入外部maven项目(非压缩)方式
每日消息!Hugging News #0203: 3.3 MB 的文生图模型、RHLF 训练框架、手机上能跑的 Transformer
环球今日讯!跟着廖雪峰学python004
微头条丨校长用张颂文成名故事激励学生:日复一日打磨自己才是人生征程
2022年中国汽车销量排名:上汽第一 比亚迪增速太猛
当前头条:真维斯官方清仓:连帽夹克69.9元、棒球服夹克89.9元
当前热讯:Switch超级大作 《塞尔达传说:王国之泪》泄露:极具魅力
天天快消息!腾讯开办职业技能培训学校 网友:教打游戏吗?
显卡花屏一般是什么部件坏了?显卡花屏怎么解决?
gmail账号怎么注册?gmail账号停用怎么快速恢复使用?
libs是什么文件夹?libs文件夹可以删除吗?
win7如何共享打印机?win7怎么设置屏幕不休眠?
显卡风扇不转是什么原因?显卡风扇不转怎么解决?
yy直播是个什么样的平台?YY礼包怎么领取?
社稷的原意是指什么?社稷中的社和稷是什么意思?
世界百事通!Buu刷题
今头条!node中的fs模块和http模块的学习
世界观天下!项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
环球看热讯:C#判断IP地址是否正确
中国五大淡水湖是哪五个?中国五大淡水湖从大到小排列
上海世博会的吉祥物叫什么名字?上海世博会的意义有哪些?
卢知宣是哪个组合的歌手?卢知宣个人资料
世界热推荐:佳能一口气推四款新品:EOS R8、EOS R50都来了
爽口弹牙 喜得佳潮汕牛肉丸/牛筋丸19.9元/斤官方大促
今年以来最大震级!土耳其7.8级地震现场实拍:房屋倒塌满街狼藉
环球观天下!浙大美女老师火了 曾是羽毛球冠军 选课人数远超班级容量
环球今热点:旧手机被换菜刀女子开80公里赎回 内含资料太珍贵:型号是小米
NutUI 4.0 正式发布!
200M内存就能用 Win11极限精简版实测:C盘只需8GB空间
手机预装App无法卸载是对用户侵害!人大教授:侵犯消费者自主选择权
焦点速讯:男子礁石上钓鱼被海浪拍进石缝 出海垂钓别选偏僻海域
特斯拉辅助驾驶不“看路” 撞碎一地护栏!车主:跟平时不一样
6999元 惠普新款32寸4K显示器上架:配备雷电4 100W供电
俄罗斯杀毒软件卡巴斯基将推自研OS及应用商店:不兼容第三方系统
全球热议:要钱没用!比尔盖茨喊话马斯克做慈善家:我们财富都捐出去
中国游客抛弃日韩后!新西兰首发团26000元1分钟售罄:出境游全面开启
读Java实战(第二版)笔记02_行为参数化Lambda表达式
全球速讯:男子油锅炸元宵现场惨烈 发生自爆崩起半米高:科普为何会翻车
天天头条:中国探月四期全面推进:月球上寻找水源、科研站基本成型
【全球新视野】Intel Arc 750新驱动提升43%游戏性能!RTX 3060最大劲敌来了
【全球播资讯】day02-REST和SpringMVC映射请求数据
万元起步?苹果iPhone 16将推Ultra超旗舰 库克称果粉愿意花高价
存储卡/U盘提示要格式化?先恢复出数据再说
【全球新要闻】2600元的PCIe 5.0 SSD全球首测:读写双破10GB/s!但吵死了
邪恶、丑陋的互联网:你还敢发孩子的短视频吗?
记一次selenium爬取p站图片的经历
世界热门:丰田最新表态:纯电车不环保!
焦点短讯!谷歌家也没有余粮了:用旧的服务器不要扔 擦擦还能用2年
环球快看点丨路由架构(一)
每日精选:《三体》电视剧罗辑亮相 网友:袁华 是你吗?
环球快消息!连续两部当主演 《流浪地球3》中或没有吴京:如何复活很关键
全球要闻:web安全基础-文件上传(含部分upload-labs靶场通关)
世界资讯:谈刻意练习 Talking about deliberate pratise
新动态:Linux环境下:程序的链接, 装载和库[动态链接]
【全球新要闻】染发剂致癌吗?几十块和几百块的染发剂 究竟有啥区别?