Android 使用Arcore 实现多点测距

已更新第二版,详情见github链接github源码 点这里 <==
主要使用了Anchor(锚点),Pose (姿势/姿态),Node(节点),Vector3(三维向量)


github源码 点这里 <==

1.准备

  • 一台支持Arcore的手机
  • 依赖arcore和sceneform
    implementation 'com.google.ar:core:1.5.0'implementation 'com.google.ar.sceneform:core:1.5.0'implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.5.0'

-布局文件使用sceneform提供的fragment

      <fragmentandroid:id="@+id/UI_ArSceneView"android:name="com.gj.arcoredraw.MyArFragment"android:layout_width="match_parent"android:layout_height="match_parent" />
import com.blankj.utilcode.util.ToastUtils;
import com.google.ar.core.exceptions.UnavailableApkTooOldException;
import com.google.ar.core.exceptions.UnavailableArcoreNotInstalledException;
import com.google.ar.core.exceptions.UnavailableDeviceNotCompatibleException;
import com.google.ar.core.exceptions.UnavailableException;
import com.google.ar.core.exceptions.UnavailableSdkTooOldException;
import com.google.ar.sceneform.ux.ArFragment;//可以直接使用ArFragment   我这里为了中文提示
public class MyArFragment extends ArFragment {@Overrideprotected void handleSessionException(UnavailableException sessionException) {String message;if (sessionException instanceof UnavailableArcoreNotInstalledException) {message = "请安装ARCore";} else if (sessionException instanceof UnavailableApkTooOldException) {message = "请升级ARCore";} else if (sessionException instanceof UnavailableSdkTooOldException) {message = "请升级app";} else if (sessionException instanceof UnavailableDeviceNotCompatibleException) {message = "当前设备部不支持AR";} else {message = "未能创建AR会话,请查看机型适配,arcore版本与系统版本";String var3 = String.valueOf(sessionException);}ToastUtils.showLong(message);}
}

2.监听点击 生成锚点

  • **设置ArFragment的Tap监听 **
        (UI_ArSceneView as MyArFragment).setOnTapArPlaneListener { hitResult, plane, motionEvent ->val currentAnchor=hitResult.createAnchor()}

3.计算两个锚点之间的距离

val startPose = endAnchor.pose
val endPose = startAnchor.pose
val dx = startPose.tx() - endPose.tx()
val dy = startPose.ty() - endPose.ty()
val dz = startPose.tz() - endPose.tz()
val length = Math.sqrt((dx * dx + dy * dy + dz * dz).toDouble())
anchorInfoBean.dataText = "距离为${decimalFormat.format(length)}m"

4.UI 划线 (两个锚点在ui上连接划线)

private fun drawLine(firstAnchor: Anchor, secondAnchor: Anchor) {val firstAnchorNode = AnchorNode(firstAnchor)val secondAnchorNode = AnchorNode(secondAnchor)firstAnchorNode.setParent((UI_ArSceneView as MyArFragment).arSceneView.scene)val firstWorldPosition = firstAnchorNode.worldPositionval secondWorldPosition = secondAnchorNode.worldPositionval difference = Vector3.subtract(firstWorldPosition, secondWorldPosition)val directionFromTopToBottom = difference.normalized()val rotationFromAToB = Quaternion.lookRotation(directionFromTopToBottom, Vector3.up())MaterialFactory.makeOpaqueWithColor(this@MainActivity, com.google.ar.sceneform.rendering.Color(0f, 191f, 255f)).thenAccept { material ->val lineMode = ShapeFactory.makeCube(Vector3(0.01f, 0.01f, difference.length()), Vector3.zero(), material)val lineNode = Node()lineNode.setParent(firstAnchorNode)lineNode.renderable = lineModelineNode.worldPosition = Vector3.add(firstWorldPosition, secondWorldPosition).scaled(0.5f)lineNode.worldRotation = rotationFromAToB}
}

5.自定义Node 始终面向相机

 override fun onUpdate(p0: FrameTime?) {scene?.let { scene ->val cameraPosition = scene.camera.worldPositionval nodePosition = this@FaceToCameraNode.worldPositionval direction = Vector3.subtract(cameraPosition, nodePosition)this@FaceToCameraNode.worldRotation = Quaternion.lookRotation(direction, Vector3.up())}}

UI这里有点复杂,主要难点在Vector3(空间向量)这里.用的是数学知识了.
1.先用两个Anchor 获得 世界坐标(worldPosition)
2.使用向量计算两点空间差
3.使用起始Anchor ,生成一个Node.附加到arSceneView上
4.使用MaterialFactory 创建一个Material.再创建一个 Node使用刚才的材质,附加到之前的Node上.


github源码 点这里 <==

Android 使用Arcore 实现多点测距相关推荐

  1. Android开发实例之多点触控程序

    智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...

  2. Android双目三维重建:Android双目摄像头实现双目测距

    Android双目三维重建:Android双目摄像头实现双目测距 目录 Android双目三维重建:Android双目摄像头实现双目测距 1.开发版本 2.Android双目摄像头 3.双目相机标定 ...

  3. android怎么监听多点触摸_大尺寸触摸屏厂家定制多点触摸框

    深圳融创方圆是订做红外大尺寸触摸屏生产厂家,弧形/直角/异形/U型大尺寸红外多点触摸框定做15寸-1000寸超大尺寸红外触控屏可以用于配合液晶拼接屏,DLP拼接屏,无缝拼接屏,小间距LED.互动投影. ...

  4. 【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )

    文章目录 I . 多点触控事件 II . PointerId 与 PointerIndex 简介 III . 本次 PointerId 与 PointerIndex 获取 IV . PointerId ...

  5. android怎么监听多点触摸_110寸高清触摸一体机

    110寸高清触摸一体机也是叫110寸会议平板,110寸高清触控一体机,110寸教学培训触控一体机,110寸展厅触摸一体机,110寸高清交互会议机,110寸展示查询触摸一体机,110寸移动壁挂触控显示屏 ...

  6. android如何怎么禁止多点触控

    不积跬步无以至千里 在一个页面里做了个对讲的操作,对讲需要长按操作,但是发现碰触界面其他位置,会中断,通过监听这个View的onTouchEvent,其中的MotionEvent中的action,发现 ...

  7. Android自定义View的多点触控

    在Android游戏开发中,自定义View的多点触控技术必不可少,本文主要简单讲解下Android中多点触控技术的基础知识. 所谓多点触控技术,就是手机屏幕上支持同时处理多个触控点的触屏或移动事件.多 ...

  8. android怎么监听多点触摸_Android多点触摸交互处理

    触摸操作是安卓最基本的交互方法,掌握多点触摸的开发可增强应用交互体验.首先需要了解触摸事件的侦听和传递,同时,本文介绍了单点.多点触摸的使用方法,并在此基础上,使用多点触控完成了一个缩放照片的简单例子 ...

  9. android怎么监听多点触摸_Android开发中多点触摸的实现方法

    Android多点触控需要LCD驱动和程序设计支持,其实我们只要采用电容屏触摸手机的技术即可,接下来,就让爱站技术频道小编来讲解Android开发中多点触摸的实现方法吧! 多点触摸技术在实际开发过程中 ...

最新文章

  1. HBase源代码分析之MemStore的flush发起时机、推断条件等详情(二)
  2. Android8.0适配方案
  3. 学习Mysql命令行
  4. 成为进阶Linux大佬的第一步
  5. C#中的多线程-线程同步基础 (控制线程数量)
  6. JAVA判断数组最大值
  7. python入门指南-Python 入门指南
  8. 技术分析淘宝的超卖宝贝
  9. easyui datagrid添加合计行
  10. RGB网页颜色在线取色器
  11. python编程课件_Python面向对象程序设计ppt课件.ppt
  12. react 创建组件的两种方式
  13. composer安装yii2框架提示“fxp/composer-asset-plugin”与composer版本不符
  14. poi填充word模板
  15. RedHat上安装openssl
  16. cocos creator麻将教程系列(二)—— 达达麻将的底层通讯express框架与socketio
  17. t-star腾讯安全高校挑战赛2022 writeup
  18. 分享20个无版权的高清无 码图库站
  19. 喜马拉雅音频下载器 V1.2 支持专辑批量下载 喜马拉雅mp3下载导出 喜马拉雅下载器...
  20. 计算机技术发展的一些随笔总结(我们需要思考)

热门文章

  1. Vue3实现将页面转成PDF并下载或直接打印
  2. 如何让spyder中途暂停(之前运行出来的结果仍然显示)
  3. xxl-job——简介
  4. 【DB宝42】MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡
  5. macOS安装软件./configuredmake
  6. OneNote笔记本分类方法
  7. 2021年“羊城杯”网络安全大赛部分Writeup
  8. Go语言系列——31-自定义错误、32-panic和recover、33-函数是一等公民(头等函数)、34-反射、35-读取文件、36-写入文件
  9. 腾讯首次攻破屏下指纹识别技术;苹果新Mac Pro最贵将卖到4.2万;Haxe 4.0发布 | 极客头条...
  10. 工业通讯 | Profinet协议基础知识(三)