我正在看Android的新ARCore库。它有检测水平表面的方法,但没有检测垂直表面或墙壁的方法。
我实际上试图使示例应用程序检测墙壁,但我有很多问题。
在ARCore中是否有一种本机或非本机检测垂直表面的方法?
ARCore 1.2为AR开发人员带来了三个新功能:垂直平面检测
、云锚
和增强图像
。
列表中的第一个功能向Config添加了两个额外的枚举值。PlaneFindingMode
:
public static final Config.PlaneFindingMode HORIZONTAL_AND_VERTICAL
public static final Config.PlaneFindingMode VERTICAL
让我们看看使用静态编程语言的效果:
class CustomArFragment: ArFragment () {
override fun getSessionConfiguration(session: Session?): Config {
val configuration = super.getSessionConfiguration(session)
configuration.planeFindingMode = Config.PlaneFindingMode.VERTICAL
return configuration
}
}
获取hellosceneform样本并将其转换为检测垂直面和水平面:
https://github.com/google-ar/sceneform-android-sdk/tree/master/samples/hellosceneform
创建一个新的片段子类ArFragment并重写getSessionConfiguration方法:
public class CustomArFrag extends ArFragment {
@Override
protected Config getSessionConfiguration(Session session) {
Config config = super.getSessionConfiguration(session);
config.setPlaneFindingMode(Config.PlaneFindingMode.HORIZONTAL_AND_VERTICAL);
return config;
}
}
更改活动。指向它的xml布局:
<fragment
android:name="com.google.ar.sceneform.samples.hellosceneform.CustomArFrag"
.../>
请注意,垂直表面不会总是被检测到。它似乎不喜欢白色的大墙。它设法探测到了我冰箱的前部,我把一个机器人像磁铁一样贴在上面!
使现代化
最新版本的ARCore现在也有
public static final Config.PlaneFindingMode HORIZONTAL
// Detection of only horizontal planes is enabled.
public static final Config.PlaneFindingMode HORIZONTAL_AND_VERTICAL
// Detection of both horizontal and vertical planes is enabled.
旧答案
目前没有本地方式:
public static final Config.PlaneFindingMode DISABLED
// Plane detection is disabled.
public static final Config.PlaneFindingMode HORIZONTAL
// Detection of only horizontal planes is enabled.
这里描绘了一种非本地方式:访问点云数据并自己计算水平面。但要使其真正起作用,您必须实现聚类(区分多个平面,而不是计算一个全局平面)和适当的异常值拒绝(可能使用RANSAC)。
就我个人而言,我认为(希望)下一次ARCore更新将包括垂直平面,因为我看不出不支持这一点的数学原因。
我一直在尝试使用碰撞检测来阻止物体相互碰撞。但我不知道怎么做。 当物体碰撞时,我试着颠倒它们速度矢量的方向(所以它远离碰撞的地方),但是有时物体会卡在对方体内。 我试着改变他们的速度,但这只是父母彼此的反对。 有没有一种简单的方法来限制物体的运动,这样它们就不会穿过其他物体?我一直在使用矩形相交来进行碰撞,我还尝试了圆形冲突检测(使用对象之间的距离)。 思想? 希望它不太难阅读。 编辑:所以我一直
问题内容: 我想知道是否有人使用ARCore SDK实时识别了设备之前的垂直平面。 通过使用线方程定义墙,我设法获得了不错的结果: 用“每y个”注释表示要忽略y轴(如在房间的2d映射中从上方看墙壁),以便计算定义墙壁的线。 乘数是两点之间的旋转: 所有的计算是: 现在,我在用户四处走动并采样许多点云点时触发该计算。 结果很好,但不如ARCore的水平面检测准确。 问题答案: 现在是ARCore的一
ARCore场景表单示例项目“hello场景表单”很酷,工作非常好。 问题是需要移动手机以获得一个放置锚的表面。太慢了。 我的应用程序不需要在垂直平面(墙)上显示任何东西,只需要在地板上显示。我是否可以跳过“移动手机”步骤,或者至少加快速度? 我试过: 认为如果我不需要寻找垂直面,那么一切都会更快。。。。。似乎还不够快。 谢谢
我正在工作的一个项目和面临一个问题与ARCORE。我在我的项目中使用了ARCore定位,我使用纬度和经度来设置对象的位置。但当我在设备中看到它时,对象位置在AR中是不同的。 它的主要问题是它检测表面和放置图像根据它,如果有任何可能禁用表面检测,那么它的工作是完美的。
问题内容: 是否可以计算两个`HitResult``s 之间的距离? 或者我们如何使用ARCore计算真实距离(例如米)? 问题答案: 在Java ARCore中,世界单位是米(我只是意识到我们可能不会对此进行记录… aaa,看起来像不行。 糟糕 ,提交了错误)。通过减去两个s 的平移分量,可以得到它们之间的距离。您的代码如下所示: 首次命中为: 第二击为: 假设这些命中结果不在同一帧上发生,那么
我一直在看代码实验室的场景形式介绍示例。一切正常,但我也想检测单个(固体)彩色平面。据我所知,ARcore只能检测带有某些图案或强烈对比墙面的平面。是否有任何方法可以检测单个颜色平面或手动方式将对象放置在单个颜色平面上,并使用对象的所有其他控件(旋转,移动)?