arcore - 如何渲染始终沿运动移动的对象
问题描述
我正在使用 node.setWorldPosition(0,0,-2f) 渲染一个对象。但我希望它总是出现在我 2 米外的镜头前
我试图显示始终面向我的相机的节点,但是当我向前移动设备时,我无法移动节点。我没有使用锚来固定我的对象。
private void nodeAlwaysFaceCamera() {
Vector3 cameraPosition = arFragment.getArSceneView().getScene().getCamera().getWorldPosition();
Vector3 cardPosition = node.getWorldPosition();
Vector3 direction = Vector3.subtract(cameraPosition, cardPosition);
Quaternion lookRotation = Quaternion.lookRotation(direction, Vector3.up());
node.setWorldRotation(lookRotation);
}
将物体渲染到相机前方 2 米处
node = new Node();
node.setParent(arFragment.getArSceneView().getScene());
node.setWorldPosition(new Vector3(0f, 0f, -2f));
node.setRenderable(viewRenderable);
我的预期结果是物体在移动时会粘在相机上。
解决方案
您应该使用相机的姿势,而不是获取世界位置。所以代替这个
Vector3 cameraPosition = arFragment.getArSceneView().getScene().getCamera().getWorldPosition();
您可以使用:
Pose cameraPose = arFragment.getArSceneView().getScene().getCamera().getPose();
或者,您可以在不旋转相机的情况下创建新姿势。
Pose cameraPose = arFragment.getArSceneView().getScene().getCamera().getPose().extractTranslation();
然后,您可以使用该姿势为您想要在相机前面的对象构图。在示例中,这会将对象放置在相机前方 2m 的相同高度处(使用第二个 cameraPose):
// Compose the Pose of the Object relative to the cameraPose
Pose objectPose = cameraPose.compose(Pose.makeTranslation(0,0,-2f));
// Create an Anchor for the object
Anchor objectAnchor = arFragment.getArSceneView().getSession().createAnchor(objectPose);
AnchorNode objectAnchorNode = AnchorNode(objectAnchor);
// Here is your code
node = new Node();
node.setParent(anchorNode);
node.setRenderable(viewRenderable);
....
推荐阅读
- api - 根据响应调度 API Post 请求
- sql - 执行存储过程时,过程内部的循环无限运行
- python-3.x - 在threading.thread中,为什么args末尾带逗号
- c# - 为什么 WindowsFormsSynchronizationContext 需要一个名为 controlToSendTo 的私有字段?
- assembly - movzbl 和 movsbl 彼此相邻
- javascript - 我正在尝试为奥赛罗游戏制作“flank()”方法。但是我不知道如何遍历每一块并在找到我的一个时停止
- git - Visual Studio:不支持的 URL 协议
- powershell - 如何使用 SET /P 命令在批处理脚本中存储带有空格的文件夹,并在使用 POWERSHELL -Command 时调用存储的变量
- c# - ProcessStartInfo 和事件/异步参数
- r - 如何将 hms 时间格式转换为带有 ms(分钟:秒)格式的纯字符串