我实现了一个应用程序,将AR标签放置在特定的gps位置和ARCore位置(https://github.com/appoly/ARCore-Location).逻辑是基于gps位置和摄像头位置创建锚节点:
`
double rotationRadian = Math.toRadians(rotation); //rotation is the angle between the bearing of the specific gps location and camera's location and the azimuth of the camera.
float zRotated = (float) (z * Math.cos(rotationRadian));
float xRotated = (float) -(z * Math.sin(rotationRadian));
float y = frame.getCamera().getDisplayOrientedPose().ty() + (float) heightAdjustment;
Pose translation = Pose.makeTranslation(xRotated, y, zRotated);
Anchor newAnchor = mSession.createAnchor(
frame.getCamera()
.getDisplayOrientedPose()
.compose(translation)
.extractTranslation()
);
marker.anchorNode = new LocationNode(newAnchor, marker, this);
marker.anchorNode.setScalingMode(LocationMarker.ScalingMode.GRADUAL_FIXED_SIZE);
marker.anchorNode.setParent(mArSceneView.getScene());
marker.anchorNode.addChild(mLocationMarkers.get(i).node); //add the node presenting the AR labels.
marker.node.setLocalPosition(Vector3.zero());
`
然后在anchorNode的Update()中,缩放并旋转呈现ar标签的节点:
`
final Vector3 cameraPosition = getScene().getCamera().getWorldPosition();
Vector3 direction = Vector3.subtract(cameraPosition, n.getWorldPosition());
n.setWorldPosition(new Vector3(n.getWorldPosition().x, getHeight(), n.getWorldPosition().z));
Quaternion lookRotation = Quaternion.lookRotation(direction, Vector3.up());
n.setWorldRotation(lookRotation);
n.setWorldScale(new Vector3(scale, scale, scale));
`
代码设置了一个间隔(默认为5秒),在此间隔之后,会话将刷新锚点节点(分离旧锚点并创建新锚点)。
我注销了anchorNode和节点的世界位置,发现在间隔期间,这些值不会改变,但是当我移动手机时(不要改变姿势,只要拿着手机,在路上直走),AR标签与手机(似乎标签也能走,但不粘在屏幕上)。
当固定节点的世界位置发生变化时(可能在间隔之后),很明显,标签会在屏幕上弹出(不会与手机平行移动)。
我想达到这样的性能,当我拿着手机走路时,ar标签不会与相机平行移动,而是保持在它应该在的地方,看起来就像在现实世界中一样(它不会改变相对于相机的位置真实世界中的真实对象)。
我猜,当锚点节点的世界位置不变时,ar标签与摄影机平行移动的原因是锚点是基于摄影机创建的,并且当ar会话了解周围环境时,节点与摄影机平行移动,以保持锚点与摄影机之间的关系。但当我试图在一个绝对的世界位置创建主播节点时,它也有同样的情况。
然后我发现这样的描述:向会话中添加ARAnchor对象实际上就是在现实世界空间中“标记”一个点,以便以后可以引用它。点(1,1,1)(例如)始终是点(1,1,1)-您不能将其移动到其他地方,因为这样它就不再是点(1,1,1)
?因此我理解anchorNode,因为它被放置在与现实世界中其他真实对象一样的位置,然后我使用setLocationPosition将节点添加到锚点(锚点保持静态,然后节点也应保持静态),或者如果我使用anchorNode而不是连接到anchorNode的节点来显示AR标签,也许我能得到我想要的。但是我尝试了这些测试,它失败了。
我有一个问题,关于锚到底意味着什么,以及我如何才能得到我想要实现的东西。谢谢你的帮助。
我尝试了更多的测试,发现在间隔期间,锚没有更新,而孩子们与相机平行移动。而对于创建的与可跟踪对象(如平面)关联的锚点,子节点是静态的。我还发现了一些类似这样的描述:放置与可跟踪对象无关的锚点通常不是一个好的体验。可跟踪对象(平面、增强图像、定向点)由ARCore更新,以表示真实世界图像和增强虚拟图像之间的连接。如果你在“空中”放置一个锚,它将相对于真实世界漂移和移动
(https://github.com/google-ar/sceneform-android-sdk/issues/185)
我尝试根据与平面相关联的锚放置ar对象,并通过hitTest创建,渲染节点工作正常。
我想这就是原因,我需要更多的实验,如果它是正确的,我想知道如何解决这个问题。
问题内容: 我想打印根节点的子元素。这是我的XML文件。 根据我的理解,根节点是“公司”,其子节点必须是“职员”和“职员”(因为存在“职员”节点2次)。但是,当我尝试通过我的Java代码获取它们时,我得到了5个子节点。3个额外的文本节点从哪里来? Java代码: 输出: 为什么三个文本节点要过来? 问题答案: 为什么三个文本节点要过来? 它们是子 元素 之间的空白。如果只需要子元素,则应忽略其他类
我想打印根节点的子元素。这是我的XML文件。 根据我的理解,根节点是“company”,其子节点必须是“staff”和“staff”(因为有两个“staff”节点)。但是当我试图通过java代码获取它们时,我得到了5个子节点。3个额外的文本节点来自哪里? Java代码: 输出: 为什么这三个文本节点会出现在这里?
我想展示一下,安迪说,一旦阿科雷开始跟踪,计划被发现。在我将节点锚定在附近某个地方之后,我离开了andy。 我在屏幕底部有一个箭头,当我移开相机时,我想旋转/指向箭头,使箭头始终指向锚定的节点。 我已经做了剩余的事情,但无法找到我需要保持旋转箭头图像的角度,以便它始终指向锚定节点。 我正在android studio中使用sceneform框架,arcore sdk。
在HelloSceneform中,在替换这些行时。。。 ... 使用这些行,然后启动应用程序。 这导致以下效果:即使子节点位于父节点之上,旋转电话也会导致子节点移动到父节点的后面。 当子节点的中心或局部位置的值不同于0时,会发生这种情况。 这个问题在7月份首先报告给ARCore,然后在8月底报告给Sceneform,仍然被两个团队完全忽略。这样ARCore对我来说是完全不可用的。任何解决这个问题的
所以,我想做的是检查一个完整的二叉树叶子中的 int 是否比它的父叶大,并以此为标准让它与它的父叶不断改变位置,一直到根。问题是,当它必须与根进行比较和更改位置时,它会塞格福;如果我在那之前让循环停止,它工作得很好(我认为)。我在这里错过了一些明显的东西吗? 添加新叶子时,将发生以下情况。我省略了叶子实际添加到树中的部分,因为它工作正常并且很长。指针 p 指向循环开始之前插入的最后一个叶。根的父亲
问题很简单:从这里: 我必须分析一下: 这意味着每个属性都应该成为一个新的根节点。但对我来说,最困难的是我不能从“属性”中设置“属性”值作为对象节点名称。 这对我来说是个挑战。我可以在根节点中设置新节点。已经从“attributes”中获得了一个映射,然后尝试使用forEach对它们进行迭代,以便将结果放入一个节点中,但如图所示,我必须使用“property”将其设置为对象名称的键,然后获取值并设