ARCore 使用 SceneForm 框架 —— 三维空间中,通过三个点绘制平面(Plane)
两个点确定一条直线,三个点确定一个平面,相信大家看了 SceneForm 的 API 会发现,绘制直线的比较好处理,凭空添加平面就很少见了,这篇文章就是基于这个需求做的
代码逻辑其实很简单,使用 RenderableDefinition.builder 自定义模型形状,arFragment 是 CleanArFragment 类型的,CleanArFragment 源码在《ARCore 使用 SceneForm 框架 —— 三维空间中不基于 Plane 加载 3D 模型》已经贴出,看看代码
/*** 绘制三角形平面* context: 上下文,用于获取纹理资源* allSetPoint: 顶点集合* arFragment: 用于渲染的 ArFragment*/fun buildPolygon(context : Context, allSetPoint : MutableList<Vector3>, arFragment : CleanArFragment) {var anchorsList = ArrayList<AnchorNode>()// 设置三角形各个顶点的位置for (j in 0 .. (allSetPoint.size - 1)) {val anchorNode = AnchorNode()anchorNode.worldPosition = allSetPoint.get(j)anchorNode.setParent(arFragment!!.arSceneView.scene)anchorsList.add(anchorNode)}// 绘制三角形模型,强制限制三个顶点if (anchorsList.size == 3) {Texture.builder().setSource(context, R.drawable.final_point) // 纹理资源.build().thenAccept { texture ->MaterialFactory.makeOpaqueWithTexture(context, texture).thenAccept { material ->// 将生成的三角形模型添加到场景中val node = Node()val triangle = makeTriangleWithAnchors(anchorsList, material)if (triangle != null) {node.setParent(arFragment!!.arSceneView.scene)node.renderable = triangle}}}}}// 构建三角形平面private fun makeTriangleWithAnchors(anchorNodes : List<AnchorNode>, material : Material) : ModelRenderable {var p0 = anchorNodes.get(0).getLocalPosition()var p1 = anchorNodes.get(1).getLocalPosition()var p2 = anchorNodes.get(2).getLocalPosition()var up = Vector3.up()var uvTop = Vertex.UvCoordinate(0.5f, 1.0f)var uvBotLeft = Vertex.UvCoordinate(0.0f, 0.0f)var uvBotRight = Vertex.UvCoordinate(1.0f, 0.0f)var vertices = ArrayList (Arrays.asList(Vertex.builder().setPosition(p0).setNormal(up).setUvCoordinate(uvTop).build(),Vertex.builder().setPosition(p1).setNormal(up).setUvCoordinate(uvBotRight).build(),Vertex.builder().setPosition(p2).setNormal(up).setUvCoordinate(uvBotLeft).build()))var triangleIndices : MutableList<Int> = ArrayList(6);triangleIndices.add(0)triangleIndices.add(2)triangleIndices.add(1)triangleIndices.add(0)triangleIndices.add(1)triangleIndices.add(2)// 通过 RenderableDefinition.builder 自定义模型形状var submesh = RenderableDefinition.Submesh.builder().setTriangleIndices(triangleIndices).setMaterial(material).build()var renderableDefinition = RenderableDefinition.builder().setVertices(vertices).setSubmeshes(Arrays.asList(submesh)).build()var future = ModelRenderable.builder().setSource(renderableDefinition).build()var result : ModelRenderabletry {result = future.get() as ModelRenderable} catch ( e : Exception ) {throw Exception("creating model error. ", e);}return result}
效果图如下,为了证明是 3D 效果,取了多个角度的效果
码云源码下载
ARCore 使用 SceneForm 框架 —— 三维空间中,通过三个点绘制平面(Plane)相关推荐
- 三维空间中,向量在另外一个向量或者面上的投影
1. 向量在另外一个向量上的投影 -求向量u在向量v上的投影,定义为u' ,θ 为两向量的夹角. 一个向量有两个属性,大小和方向 首先明确向量点乘的含义u⃗∗v⃗=∣u∣∣v∣cosθ\vec{u}* ...
- Image2StyleGAN:如何将图像嵌入到 StyleGAN 潜在空间中?
目录 摘要: 1. 介绍 2. 相关工作 ①高质量GAN ②潜在空间嵌入 ③感知损失和样式转换 3. 哪些图像可以嵌入到 StyleGAN 潜在空间中? 3.1 嵌入各种图像类别的结果 3.2脸部图像 ...
- 计算机推测四维空间,4维空间真的存在吗?科学家推测未来人类可能会生活在4维空间中...
原标题:4维空间真的存在吗?科学家推测未来人类可能会生活在4维空间中 看过刘慈欣著名科幻小说<三体>的人都知道,在"死神永生"章节中,人类文明甚至太阳系文明的最后毁灭是 ...
- 数字廉江地理空间框架 三维景观数据专业技术设计书
数字廉江地理空间框架 三维景观数据专业技术设计书 测绘专业任务承担单位(盖章): 设计负责人: 审核意见: 主要设计人: 审核人: 年 月 日 年 月 日 批准单位或部门(盖章): 审批意见: 审批人 ...
- 数据表从一个表空间中移动到另一个表空间中
数据表从一个表空间中移动到另一个表空间中 1) alter table [table_name] move tablespace [new tablespace]; 移动LOB字段 2) alter ...
- 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。
[一元多项式算法]设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接.设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中. #include<s ...
- abp .net core linux,Abp vNext框架 从空项目开始 使用ASP.NET Core Web Application-笔记
参考 abp vnext框架 从空项目开始 使用asp.net core web application rynowak的回答 migrate from asp.net core 2.2 to 3.0 ...
- 基于cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法
引言 最近在与好友聊天的过程中,好友问我如何实现类似这样的游戏.它主要想知道,如何检测旋转过后的物体与其他物体之间的碰撞. 我们知道,在没有旋转的情况下,对于这样的方块,比较规则的物体,我们完全可以使 ...
- MySQL的InnoDB存储引擎中,缓冲池中的Changer Buffer与系统表空间中的Changer Buffer的关系
MySQL的InnoDB存储引擎中,缓冲池中和系统表空间中都存在Changer Buffer,那它们之间的关系是怎样的呢?先来一张InnoDB存储引擎的架构图: 翻阅了MySQL官网发现如下: 1.h ...
- 某计算机的主存空间中,某计算机的主存地址空间中
<某计算机的主存地址空间中>由会员分享,可在线阅读,更多相关<某计算机的主存地址空间中(3页珍藏版)>请在人人文库网上搜索. 1.某计算机的主存地址空间中,从地址0000H到3 ...
最新文章
- 第八届全国计算机数学学术会议,第一届全国计算机数学学术会议 报告摘要
- [学习笔记]数字电路技术
- abap 选择屏幕事件AT SELECTION-SCREEN
- Spring+SpringMVC +MyBatis整合配置文件案例66666
- 5G为何采纳华为力挺的Polar码?一个通信工程师的大实话
- Google AdSense中文官方博客今天公布了AdSense内容广告与AdSense搜索广告的收入分成比例...
- Flutter延时任务、Flutter通过Future与Timer实现延时任务
- (转) 淘淘商城系列——redis-desktop-manager的使用
- HDU 1233 - 还是畅通工程
- 使用frp实现内网穿透
- 怎样才算精通javascript
- matlab打开图片无效的文件名,Matlab - 使用textscan错误(文件标识符无效)
- Error:field larger than field limit(131072)解决方法
- python scapy2.3 在windows上的安装
- 新基建下的工业互联网,等不到第四次工业革命
- L1 VS L2(深度学习中的L1与L2)
- Android的布局管理--表格布局
- 咻商跨境电商丨Shopee店铺为什么要装修?店铺装修流程介绍!
- SaaS化MR直播正式上线!保利威开启轻量化虚拟直播时代
- 丰田生产方式和TOC工序切换时间的解决