两个点确定一条直线,三个点确定一个平面,相信大家看了 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. 三维空间中,向量在另外一个向量或者面上的投影

    1. 向量在另外一个向量上的投影 -求向量u在向量v上的投影,定义为u' ,θ 为两向量的夹角. 一个向量有两个属性,大小和方向 首先明确向量点乘的含义u⃗∗v⃗=∣u∣∣v∣cosθ\vec{u}* ...

  2. Image2StyleGAN:如何将图像嵌入到 StyleGAN 潜在空间中?

    目录 摘要: 1. 介绍 2. 相关工作 ①高质量GAN ②潜在空间嵌入 ③感知损失和样式转换 3. 哪些图像可以嵌入到 StyleGAN 潜在空间中? 3.1 嵌入各种图像类别的结果 3.2脸部图像 ...

  3. 计算机推测四维空间,4维空间真的存在吗?科学家推测未来人类可能会生活在4维空间中...

    原标题:4维空间真的存在吗?科学家推测未来人类可能会生活在4维空间中 看过刘慈欣著名科幻小说<三体>的人都知道,在"死神永生"章节中,人类文明甚至太阳系文明的最后毁灭是 ...

  4. 数字廉江地理空间框架 三维景观数据专业技术设计书

    数字廉江地理空间框架 三维景观数据专业技术设计书 测绘专业任务承担单位(盖章): 设计负责人: 审核意见: 主要设计人: 审核人: 年 月 日 年 月 日 批准单位或部门(盖章): 审批意见: 审批人 ...

  5. 数据表从一个表空间中移动到另一个表空间中

    数据表从一个表空间中移动到另一个表空间中 1) alter table [table_name] move tablespace [new tablespace]; 移动LOB字段 2) alter ...

  6. 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。

    [一元多项式算法]设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接.设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中. #include<s ...

  7. 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 ...

  8. 基于cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法

    引言 最近在与好友聊天的过程中,好友问我如何实现类似这样的游戏.它主要想知道,如何检测旋转过后的物体与其他物体之间的碰撞. 我们知道,在没有旋转的情况下,对于这样的方块,比较规则的物体,我们完全可以使 ...

  9. MySQL的InnoDB存储引擎中,缓冲池中的Changer Buffer与系统表空间中的Changer Buffer的关系

    MySQL的InnoDB存储引擎中,缓冲池中和系统表空间中都存在Changer Buffer,那它们之间的关系是怎样的呢?先来一张InnoDB存储引擎的架构图: 翻阅了MySQL官网发现如下: 1.h ...

  10. 某计算机的主存空间中,某计算机的主存地址空间中

    <某计算机的主存地址空间中>由会员分享,可在线阅读,更多相关<某计算机的主存地址空间中(3页珍藏版)>请在人人文库网上搜索. 1.某计算机的主存地址空间中,从地址0000H到3 ...

最新文章

  1. 第八届全国计算机数学学术会议,第一届全国计算机数学学术会议 报告摘要
  2. [学习笔记]数字电路技术
  3. abap 选择屏幕事件AT SELECTION-SCREEN
  4. Spring+SpringMVC +MyBatis整合配置文件案例66666
  5. 5G为何采纳华为力挺的Polar码?一个通信工程师的大实话
  6. Google AdSense中文官方博客今天公布了AdSense内容广告与AdSense搜索广告的收入分成比例...
  7. Flutter延时任务、Flutter通过Future与Timer实现延时任务
  8. (转) 淘淘商城系列——redis-desktop-manager的使用
  9. HDU 1233 - 还是畅通工程
  10. 使用frp实现内网穿透
  11. 怎样才算精通javascript
  12. matlab打开图片无效的文件名,Matlab - 使用textscan错误(文件标识符无效)
  13. Error:field larger than field limit(131072)解决方法
  14. python scapy2.3 在windows上的安装
  15. 新基建下的工业互联网,等不到第四次工业革命
  16. L1 VS L2(深度学习中的L1与L2)
  17. Android的布局管理--表格布局
  18. 咻商跨境电商丨Shopee店铺为什么要装修?店铺装修流程介绍!
  19. SaaS化MR直播正式上线!保利威开启轻量化虚拟直播时代
  20. 丰田生产方式和TOC工序切换时间的解决

热门文章

  1. 计算机类qq网名,最帅的qq名字
  2. 给ImageView做圆角处理
  3. OA系统(海信集团)双因素身份认证解决方案
  4. 计算机中组策略编辑,组策略编辑器用法-如何使用组策略
  5. 贪心 汽车加油 java_贪心算法-汽车加油
  6. 计算机表格复制粘贴,Excel复制表格保留原格式不会操作?超全技巧教给你!
  7. Boost.Asio的使用技巧
  8. 现代信息检索——基本概念
  9. nuxt IE语法错误
  10. 视频下载软件Annie的安装及使用