Я изменил образец 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: Samsung S10 +: