我正在尝试使用RoboVM使用ARKit开发一个测试AR应用程序。在使用ARWorldTrackingConfiguration设置会话并运行它之后,我想通过运行如下命中测试来确定检测到的水平面(地板)上的位置:
public void addTapGestureToSceneView(){
UITapGestureRecognizer uiTapGestureRec = new UITapGestureRecognizer();
uiTapGestureRec.addListener(new UIGestureRecognizer.OnGestureListener() {
@Override
public void onGesture(UIGestureRecognizer uiGestureRecognizer) {
CGPoint tapLocation = uiGestureRecognizer.getLocationInView(arView);
NSArray<ARHitTestResult> hitTestResults = arView.hitTest(tapLocation, ARHitTestResultType.FeaturePoint);
if(!hitTestResults.isEmpty()) {
VectorFloat3 vec3 = getTranslation(hitTestResults.last().getWorldTransform());
addBox(vec3);
}
}
});
arView.addGestureRecognizer(uiTapGestureRec);
}
({getTranslation(...)
是一种辅助方法,用于提取转换矩阵的第三列)
在addBox(VectorFloat3 position)
中,添加了具有盒子几何形状的节点。
问题是,它总是返回命中测试坐标,并且所有三个分量都接近于零(例如x * 10 ^ -35),因此该框几乎添加在我正在测试该应用的手机的中央。
我的实现是否存在问题,或者可能是RoboVM中的错误?
更新:
在较新版本的RoboVM中解决了问题。
请参阅拉取请求:https://github.com/MobiVM/robovm/pull/339
和:https://dkimitsa.github.io/2018/12/11/vector-data-types/
答案 0 :(得分:1)
robovm obj编译器代码中存在一个错误,该错误导致矢量数据类型(SIMD类型)被错误地编组(作为通用结构),从而违反了ABI。在运行模拟器时,将ARM64和GPF作为目标时会造成垃圾。它已经固定并合并到母版中。在2.3.6-SNAPSHOT版本中也可用。 查看此公关以获取详细信息https://github.com/MobiVM/robovm/pull/339