【开源项目】「安卓原生3D开源渲染引擎」:Sceneform‑EQR


在这里插入图片描述


「安卓原生3D开源渲染引擎」:Sceneform‑EQR 渲染引擎

“那一夜凌晨3点,第一次提交 PR 的手在抖……”——我深刻体会这种忐忑与激动。

仓库地址:(https://github.com/eqgis/Sceneform-EQR)。


一、前言:开源对我意味着什么

  • DIY 的自由 Vs. 工业化的束缚
    刚入 Android 原生开发时,我习惯自己在项目里嵌入各种 3D 渲染/AR/XR 模块,结构臃肿、流程混乱。
    当我知道 Google Sceneform SDK 被弃用,起初只是出于“就地救火”般的情绪,却在折腾过程中产生“改造它,让它更适合所有设备”的强烈冲动。

  • “写代码” Vs. “分享代码”
    一直以来,我只把代码写到私有仓库,没想过真实地把它开出来。
    Sceneform‑EQR ,是我第一次把自己能力真正“裸奔”在所有开发者面前——那一刻,我感到恐惧,也因潜在的影响而无比兴奋。


二、为什么选 Sceneform‑EQR ?

1. AR/3D 是日趋火热的开发方向

Sceneform 依赖 ARCore 和 Filament,能快速构建 AR 应用。但它官方只发布到 1.16,即已停止维护 (eqgis.cn, cnblogs.com, developers.google.com)。问题来了:

  • 不支持 AndroidX;
  • 不再更新;
  • 仅兼容 ARCore 设备,不支持华为2020年以后的机型和其他OEM设备 。
2.Filament:跨平台硬核渲染引擎

Filament 支持 Android/iOS/Web,多平台 PBR 渲染
Sceneform‑EQR 基于 Sceneform + Filament 扩展,能兼容 ARCore、Huawei AREngine、ORB‑SLAM3,并提供 3D/AR/VR 场景以及透明、视频/图片拓展 (github.com)。

3. 市场需求与生态缺口

主流安卓生态缺乏对非 ARCore 设备的统一支持。用户需要能跑在平板、XR 眼镜、双屏设备上的轻量渲染方案,而 Sceneform‑EQR 需踏出这一步。


三、项目概览:架构、功能与生态

1. 项目结构
  • Eq‑Renderer 渲染库:

    • Android/eq‑renderer:主要源码;
  • 示例工程 SampleProj/app:Demo 程序;

  • Maven 本地依赖发布:

maven {allowInsecureProtocol trueurl "http://repo.eqgis.cn"
}
implementation "com.eqgis:eq‑renderer:1.0.9"

(github.com)

2. 核心功能模块
  • 场景加载:支持 glTF 模型加载(普通场景、AR/VR 场景均可)(github.com);
  • 动画支持:封装 ModelAnimation,自动播放、设置时长、循环,接入 FilamentAnimator;
  • XR 支持:支持AR、VR、普通3D场景。集成 ARCore、AREngine、ORB‑SLAM3,支持场景间一键切换;
  • 背景扩展:支持透明背景、图片背景、视频背景,特点是灵活配置、流程简洁 (blog.csdn.net);
  • 材质扩展:调用 matc 生成材质,实现呼吸、流动纹理、视频贴图等;
  • 手势交互:单指旋转、双指平移/缩放、点击事件等基本场景交互内置;(blog.csdn.net);

3. 核心功能截图

在普通3d场景加载GLTF格式的模型
在这里插入图片描述

在AR场景加载GLTF格式的模型
在这里插入图片描述

支持GLTF模型动画
在这里插入图片描述

手势点击交互
在这里插入图片描述

通过手势控制模型(单指旋转、双指平移、双指缩放)
在这里插入图片描述

案例:AR桌面
通过渲染安卓原生View实现

在这里插入图片描述

支持双屏显示,常用于XR眼镜

在这里插入图片描述

案例:AR涂鸦(自定义纹理、流动纹理、视频纹理、移位贴图)

呼吸效果,通过Filament的matc工具编译自定义材质文件
在这里插入图片描述

流动纹理,使用视频资源作为纹理贴图
在这里插入图片描述


四、技术挑战与解决思路

1. 模型动画封装:Filament + Sceneform 的融合
  • FilamentAnimator 获取
    Sceneform‑EQR 在调用 Node#setRenderable(model) 后,通过 RenderableInstance.getFilamentAsset() 获取 FilamentAsset,再调用 getAnimator() 获取动画控制器 (github.com, cnblogs.com)。

  • 封装 ARAnimationModel

    ARAnimationParameter parameter = new ARAnimationParameter().setDuration(6000L).setRepeatMode(ARAnimationRepeatMode.INFINITE);
    ARAnimationModel anim = new ARAnimationModel(node);
    anim.createAnimation(parameter);
    anim.setCurrentIndex(0);
    anim.play();
    

    背后运行的是在每帧 update 时调用 Animator.applyAnimation()updateBoneMatrices() (cnblogs.com)。

2. 多平台兼容:ARCore / AREngine / ORB‑SLAM3
  • 使用工厂模式封装 SessionProvider 抽象层;
  • 启动此渲染模块时即可传入不同支持方式;
  • 编译中引入 com.eqgis:arexp:orbslamsupport 等包。
3. 背景扩展:SurfaceView 的透明问题
  • 初期实验在 BaseSceneActivity 中通过 sceneLayout.setTransparent(true) 实现透明背景,使用透明 SurfaceView 叠在 ConstraintLayout 上 (blog.csdn.net);
  • 后期评估性能优先,决定继续使用 SurfaceView 而不是 TextureView。
4. 动态材质:PBR / 呼吸 / 流动 / 视频
  • 使用 Filament matc 离线编译材质;
  • 支持 material.setTexture(parameterName, texture) 实时更换动态图层 (github.com);

五、创新点与核心优势

功能定制亮点
动画glTF 文件动画读取、FilamentAnimator 封装,减少开发门槛
背景扩展支持透明/图片/视频/WebXR,自由拼搭场景
XR 兼容非 ARCore 设备支持 ORB‑SLAM3 与 AREngine
材质延展离线 matc + 运行时贴图注入,轻松实现呼吸/流动/视频视觉效果
交互手势通用手势控制层,全场景复用,富交互体验

六、结语

Sceneform‑EQR 已从实验项目成长为社区共建项目,支持多端渲染,完整走完从“第一次开源”到“开源维护者”的自我蜕变。

这篇文章,是我献给自己、献给所有还在深夜为 PR 抓狂的开源er——你们没有走错,代码与热爱终将被世界看到。

愿你我在技术社区的森林里,发出自己的光。


附录

社区链接

  • GitHub 仓库

    • https://github.com/eqgis/Sceneform-EQR
  • 码云

    • https://gitee.com/eqgis/EQ-Renderer-Sample-Proj
  • “EQ-雪梨蛋花汤”的相关专栏。

    • Sceneform-EQR(安卓原生3D渲染引擎)
      https://blog.csdn.net/qq_41140324/category_12571725.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86933.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建造者模式 - Flutter中的乐高大师,优雅组装复杂UI组件!

痛点场景:复杂的对话框配置 假设你需要创建一个多功能对话框: CustomDialog(title: 警告,content: 确定要删除吗?,titleStyle: TextStyle(fontSize: 20, color: Colors.red),contentStyle: TextStyle(fontSize: 16),backgroundColor: Color…

基于Java+Spring Boot的大学校园生活信息平台

源码编号:S559 源码名称:基于Spring Boot的大学校园生活信息平台 用户类型:双角色,用户、管理员 数据库表数量:17 张表 主要技术:Java、Vue、ElementUl 、SpringBoot、Maven 运行环境:Wind…

C# .NET Framework 中的高效 MQTT 消息传递

介绍: 在当今互联互通的世界里,设备之间高效可靠的通信至关重要。MQTT(消息队列遥测传输)就是为此而设计的轻量级消息传递协议。本文将探讨 MQTT 是什么、它的优势以及如何在 .NET 框架中设置和实现它。最后,您将对 M…

nn.Embedding 和 word2vec 的区别

理解它们的关键在于​​区分概念层级和职责​​。 可以将它们类比为: ​​word2vec:​​ 一个​​专门制作高质量词向量模型的“工厂”​​。​​nn.Embedding:​​ 一个​​可存储、查找并训练词向量的“智能储物柜”​​(作为…

华为云Flexus+DeepSeek征文|​​华为云ModelArts Studio大模型 + WPS:AI智能PPT生成解决方案​

引言:告别繁琐PPT制作,AI赋能高效办公 ​​ 在商业汇报、学术研究、产品发布等场景中,制作专业PPT往往需要耗费大量时间进行内容整理、逻辑梳理和视觉美化。​​华为云ModelArts Studio大模型​​与​​WPS​​深度结合,推出AI-P…

【连接redis超时】

报错 客户端输出缓冲区超限 Client … scheduled to be closed ASAP for overcoming of output buffer limits 表示这些客户端(通过 psubscribe 命令进行发布订阅操作)的输出缓冲区超过了 Redis 配置的限制,Redis 会关闭这些客户端连接来避免…

PHP「Not enough Memory」实战排错笔记

目录 PHP「Not enough Memory」实战排错笔记 1. 背景 2. 快速定位 3. 为什么 5 MB 的图片能耗尽 128 MB? 3.1 粗略估算公式(GD) 4. 实际峰值监控 5. 解决过程 6. 最佳实践与防御措施 7. 总结 PHP「Not enough Memory」实战排错笔记 —…

Java垃圾回收机制和三色标记算法

一、对象内存回收 对于对象回收,需要先判断垃圾对象,然后收集垃圾。 收集垃圾采用垃圾收集算法和垃圾收集器。 判断垃圾对象,通常采用可达性分析算法。 引用计数法 每个对象设置一个引用计数器。每被引用一次,计数器就加1&am…

基于python网络数据挖掘的二手房推荐系统

基于网络数据挖掘的二手房推荐系统设计与实现 【摘要】 随着互联网技术在房地产行业的深入应用,线上房源信息呈爆炸式增长,给购房者带来了信息过载的挑战。为了提升二手房筛选的效率与精准度,本文设计并实现了一个基于网络数据挖掘的二手房推…

Java + 阿里云 Gmsse 实现 SSL 国密通信

前言 解决接口或页面仅密信浏览器(或 360 国密浏览器)能访问的问题 测试页面 测试网站-中国银行:https://ebssec.boc.cn/boc15/help.html 使用其他浏览器(google,edge等)打开 使用密信浏览器打开 解决…

国产数据库分类总结

文章目录 一、华为系数据库1. 华为 GaussDB 二、阿里系数据库1. 阿里云 OceanBase2. PolarDB(阿里云自研) 三、腾讯系数据库1. TDSQL(腾讯云)2. TBase(PostgreSQL增强版) 四、传统国产数据库1. 达梦数据库&…

解密闭包:函数如何记住外部变量

🧠 什么是闭包? 闭包是一个函数对象,它不仅记住它的代码逻辑,还记住了定义它时的自由变量(即非全局也非局部,但被内部函数引用的变量)。即使外部函数已经执行完毕,这些自由变量的值…

I2C协议详解及STM32 HAL库硬件I2C卡死问题分析

一、I2C协议详解 1. I2C协议概述 Inter-Integrated Circuit (I2C) 是由 Philips 半导体(现 NXP 半导体)于 1980 年代设计的一种同步串行通信总线协议。该协议采用半双工通信模式,支持多主从架构,专为短距离、低速率的芯片间通信…

HTTP协议-后端接收请求

起因就是不知道post这个请求体中这些格式有什么区别,后端又怎么去接收这些不同格式的内容 Get请求 get请求是比较简单的一类 正常的直接用参数接收(不写的话名字要匹配)或者RequestParam都可以接收,用对象绑定也可以 resultful…

HTML5 实现的圣诞主题网站源码,使用了 HTML5 和 CSS3 技术,界面美观、节日氛围浓厚。

以下是一个 HTML5 实现的圣诞主题网站源码,使用了 HTML5 和 CSS3 技术,界面美观、节日氛围浓厚。它包括: 圣诞树动画 🎄雪花飘落特效 ❄️圣诞祝福语 🎁响应式布局,适配移动端 你可以将代码保存为 index.…

Spring Cloud Bus 和 Spring Cloud Stream

Spring Cloud Bus 和 Spring Cloud Stream 都是 Spring Cloud 生态中的消息通信组件,但它们的定位和使用场景有显著区别: 1. Spring Cloud Bus 核心定位:分布式系统的消息广播(配置刷新、事件传播)。 典型场景&#x…

磁悬浮轴承位移信号的高精度估计:卡尔曼滤波算法深度解析

无需位移传感器,滤波算法如何实现微米级精度? 磁悬浮轴承作为革命性的非接触式支承技术,凭借无磨损、无需润滑、高转速等优势,在飞轮储能、高速电机、人工心脏泵和航空航天领域获得了广泛应用。其核心控制依赖于对转子位移信号的高精度实时检测,传统电涡流传感器虽能提供位…

DAY 43 预训练模型

目录 一、预训练的概念 二、 经典的预训练模型 2.1 CNN架构预训练模型 2.2 Transformer类预训练模型 2.3 自监督预训练模型 三、常见的分类预训练模型介绍 3.1 预训练模型的发展史 3.2 预训练模型的训练策略 知识点回顾: 预训练的概念常见的分类预训练模型图像…

Redis:事物

🌈 个人主页:Zfox_ 🔥 系列专栏:Redis 🔥 什么是事务 Redis的事务和MySQL的事务概念上是类似的.都是把⼀系列操作绑定成⼀组.让这⼀组能够批量执⾏. 但是注意体会Redis的事务和MySQL事务的区别: 弱化的原⼦性:redi…

CppCon 2018 学习:An allocator is a handle to a heap Lessons learned from std::pmr

“An allocator is a handle to a heap — Lessons learned from std::pmr” 翻译过来就是:“分配器(allocator)是对堆(heap)的一种句柄(handle)——从 std::pmr 中学到的经验”。 基础概念 分…