通过RoboVM在ARKit中使用命中测试时,为什么会得到错误的位置坐标?

时间:2018-10-29 12:10:43

标签: java arkit hittest robovm

我正在尝试使用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/

1 个答案:

答案 0 :(得分:1)

robovm obj编译器代码中存在一个错误,该错误导致矢量数据类型(SIMD类型)被错误地编组(作为通用结构),从而违反了ABI。在运行模拟器时,将ARM64和GPF作为目标时会造成垃圾。它已经固定并合并到母版中。在2.3.6-SNAPSHOT版本中也可用。 查看此公关以获取详细信息https://github.com/MobiVM/robovm/pull/339