当前位置: 首页 > news >正文

看Threejs好玩示例,学习创新与技术(React-three-fiber)

什么,竟有人把ThreeJS和React绑定在一起,混着用?

1、VUE劫持问题

暂先把今天的问题先放一边,先简单回顾下vue劫持的情况。vue会把data里面的数据自动转换为属性,方便界面与数据交互。这本身是没有任何问题,虽然DOM操作(如位置调整)会消耗一定的计算,但一般情况下还是可以接受的。

但到了三维渲染,情况就不同了。三维引擎并非采用缓存静态绘制(双缓冲技术)的技术,而是实时绘制。它会每秒30帧去请求三维场景的实体(Entity),如果三维场景被VUE托管成属性了,那就等于每帧都需要去请求一次getter函数。性能消耗是非常大的。

2、今天的示例效果

今天的示例的主角是一个狐狸,可以在《PS1-inspired Jitter Shader (tympanus.net)》中访问。右键可以让这个狐狸跑起来,也可以让狐狸变成马赛克状。

跑步可能没有什么特殊技术。但别着急,深入研究代码,会慢慢发现作者有几个技术创新。

聪明的你一定想到标题,那么技术创新一定包含React+ThreeJS的融合使用。是的,但是我们也应该清晰的认识到,框架这东西有好有坏。在坏的情况下,你无法从框架应用中学到任何东西,到头来被新框架抛弃。因此,我们今天先谈做法,再简单说说框架。

3、如何构建棋盘地面?

制作棋盘地面第一感觉是采用贴图,但该技术需要额外的贴图,有点不划算。另外还需要考虑地面移动的问题。本示例采用的是Shader技术,代码也简单,即根据Position设置A、B两种颜色,并且可以响应时间动画手机端的适配问题。

4、马赛克模型

一般的马赛克做法是后处理,是采用某点的颜色并替换为周边几个像素的颜色。但上图的效果不一样,有明显的三角尖锐化效果。

有了“三角尖锐化效果”做引导那么技术也是自然就容易发现。即在顶点着色器阶段,对顶点的位置进行偏移。代码如下:

gl_Position.xy /= gl_Position.w;
gl_Position.xy = floor(gl_Position.xy * uJitterLevel) / uJitterLevel* gl_Position.w;

上述代码可能难以理解的是为啥先要除以 gl_Position.w。这是因为gl_Position.w表示深度信息,即w是顶点距离相机的距离。w也可以理解为透视除法的因子。通过透视除法,得到归一化设备坐标(Normalized Device Coordinates, NDC)。此时,gl_Position.xy 的范围通常在 [-1, 1] 之间。

5、骨骼动画

我们日常接触的glTF模型一般是静态的,动态的glTF是什么样的呢?其中Animation存储了运动状态,比如跑步、停止,Armature存储了骨骼。

 6、React-three-fiber

最后回到本示例中引用的框架React-three-fiber,

React-three-fiber 是一个基于React 的 3D 渲染库,它将 three.js 的强大渲染能力与 React 的声明式编程模型相结合。使用 react-three-fiber,您可以使用 React 的组件化开发方式来创建复杂的 3D 场景,同时利用 React 的状态管理和生命周期钩子来控制场景的交互和动画。

简单的说该框架简化了一些复杂的ThreeJS的对象操作,比如下面的代码,可以非常清晰的明白在渲染Canvas中添加了一个Mesh,该Mesh是一个Box,并且采用标准的材质。 

总的来说,该框架可以减轻一部分的代码编程,给我们一些新的启发。不过也得辩证的看待该框架。该框架并非基础性、革命性的框架,采用HTML的组织模式跟JSON格式的场景组织都能达到相同的效果。因此如果你将使用该框架,先看看哪些是你最需要的。

相关文章:

  • 【LLM多模态】视频理解模型Cogvlm-video和MVBench评测基准
  • 在新ARM板上移植U-Boot和Linux指南
  • 空间计算/XR的现状:Meta Orion的优势与挑战
  • pgsql
  • 前端——js函数+DOM对象
  • 《 C++ 修炼全景指南:十三 》为什么你的代码不够快?全面掌控 unordered_set 和 unordered_map 的哈希性能飙升魔法
  • 基于Hive和Hadoop的白酒分析系统
  • 大模型微调方法(非常详细),收藏这一篇就够了!
  • 个人健康管理小程序(源码+参考文档+定制)
  • 【深度学习】05-RNN循环神经网络-02- RNN循环神经网络的发展历史与演化趋势/LSTM/GRU/Transformer
  • 数智算融合,大模型助力政务服务智能化转型 丨OPENAIGC开发者大赛企业组AI创作力奖
  • ansible 配置
  • VS code Jupyter notebook 导入文件目录问题
  • 实操了 AI 大模型项目落地, 程序员成功转变为 AI 大模型工程师
  • [大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究
  • @jsonView过滤属性
  • 《剑指offer》分解让复杂问题更简单
  • in typeof instanceof ===这些运算符有什么作用
  • Java比较器对数组,集合排序
  • Java知识点总结(JavaIO-打印流)
  • laravel 用artisan创建自己的模板
  • mysql_config not found
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue2.x学习三:事件处理生命周期钩子
  • 对JS继承的一点思考
  • 如何进阶一名有竞争力的程序员?
  • 使用API自动生成工具优化前端工作流
  • 硬币翻转问题,区间操作
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​补​充​经​纬​恒​润​一​面​
  • #QT(智能家居界面-界面切换)
  • (1)Nginx简介和安装教程
  • (2.2w字)前端单元测试之Jest详解篇
  • (4)事件处理——(7)简单事件(Simple events)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (python)数据结构---字典
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (TOJ2804)Even? Odd?
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (原)本想说脏话,奈何已放下
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core跨平台微服务学习资源
  • .NET Micro Framework初体验(二)
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @Autowired注解的实现原理
  • @GetMapping和@RequestMapping的区别
  • @SpringBootApplication 注解
  • @staticmethod和@classmethod的作用与区别
  • [ C++ ] STL---string类的使用指南
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)