ARCore: ViewRenderable поверх лица смещен на телефонах Samsung - PullRequest
0 голосов
/ 21 февраля 2020

Я изменил образец AugmentedFace. Моя цель - нарисовать точку для каждого глаза и линию, соединяющую две точки. На Pixel 3 он работает нормально, но на S10 + линия слишком большая. Думаю, проблема связана с полем зрения, но я не знаю, как это исправить.

Это то, что я сделал : - создан вид, который можно визуализировать для красного вида размером 1 м * 1 м (и аналогичный для синего вида)

        View pointView = new View(this);
        pointView.setLayoutParams(new ViewGroup.LayoutParams(
                getResources().getDimensionPixelSize(R.dimen.meter),
                getResources().getDimensionPixelSize(R.dimen.meter)
        ));
        pointView.setBackgroundColor(Color.RED);
        ViewRenderable.builder().setView(this, pointView).build().thenAccept(new Consumer<ViewRenderable>() {
            @Override
            public void accept(ViewRenderable vr) {
                viewRed = vr;
            }
        });

- создан FaceNode, который следует за лицом, но ничего не рисуя

public class FaceNode extends Node {

    private AugmentedFace augmentedFace;

    public FaceNode(AugmentedFace augmentedFace){
        this.augmentedFace = augmentedFace;
    }

    @Override
    public void onUpdate(FrameTime frameTime) {
        if (isTracking()){
            updateTransform();
        }
    }

    private Boolean isTracking() {
        return augmentedFace != null && augmentedFace.getTrackingState() == TrackingState.TRACKING;
    }

    private void updateTransform() {
        // Update this node to be positioned at the center pose of the face.
        Pose pose = augmentedFace.getCenterPose();
        setWorldPosition(new Vector3(pose.tx(), pose.ty(), pose.tz()));
        setWorldRotation(new Quaternion(pose.qx(), pose.qy(), pose.qz(), pose.qw()));
    }
}
  • изменил пример приложения, добавив 2 точки и линию
                    Collection<AugmentedFace> faceList =
                            sceneView.getSession().getAllTrackables(AugmentedFace.class);

                    // Make new AugmentedFaceNodes for any new faces.
                    for (AugmentedFace face : faceList) {
                        if (!faceNodeMap.containsKey(face)) {
                            FaceNode faceNode = new FaceNode(face);
                            faceNode.setParent(scene);
                            faceNodeMap.put(face, faceNode);

                            FloatBuffer buffer = face.getMeshVertices();
                            Vector3 le = new Vector3(buffer.get(1158), buffer.get(1159), buffer.get(1160));
                            Vector3 re = new Vector3(buffer.get(477), buffer.get(478), buffer.get(479));

                            //left eye point
                            Node node = new Node();
                            node.setLocalPosition(le);
                            node.setRenderable(viewBlue);
                            node.setLocalScale(new Vector3(pointSize*2, pointSize*2, pointSize*2));
                            node.setParent(faceNode);
                            //right eye point
                            node = new Node();
                            node.setLocalPosition(re);
                            node.setRenderable(viewBlue);
                            node.setLocalScale(new Vector3(pointSize*2, pointSize*2, pointSize*2));
                            node.setParent(faceNode);
                            //line between eyes
                            node = new Node();
                            node.setParent(faceNode);
                            node.setRenderable(viewRed);
                            float eyeDistance = Vector3.subtract(le, re).length();
                            node.setLocalScale(new Vector3(eyeDistance, pointSize, pointSize));
                            node.setLocalPosition(Vector3.add(le, re).scaled(0.5f));
                        }
                    }

                    // Remove any AugmentedFaceNodes associated with an AugmentedFace that stopped tracking.
                    Iterator<Map.Entry<AugmentedFace, FaceNode>> iter =
                            faceNodeMap.entrySet().iterator();
                    while (iter.hasNext()) {
                        Map.Entry<AugmentedFace, FaceNode> entry = iter.next();
                        AugmentedFace face = entry.getKey();
                        if (face.getTrackingState() == TrackingState.STOPPED) {
                            FaceNode faceNode = entry.getValue();
                            faceNode.setParent(null);
                            iter.remove();
                        }
                    }

Я прикрепил скриншот из Pixel 3 (там, где он работает) и S10 +, где очевидно, что линия длиннее Пиксель 3: pixel3 Samsung S10 +: s10+

...