diff --git a/app/android/java/com/khronos/vulkan_samples/MainActivity.java b/app/android/java/com/khronos/vulkan_samples/MainActivity.java index 3831105..e22e06e 100644 --- a/app/android/java/com/khronos/vulkan_samples/MainActivity.java +++ b/app/android/java/com/khronos/vulkan_samples/MainActivity.java @@ -23,6 +23,7 @@ import com.google.androidgamesdk.GameActivity; import com.google.common.util.concurrent.ListenableFuture; import com.google.mediapipe.tasks.components.containers.NormalizedLandmark; import com.google.mediapipe.tasks.vision.core.RunningMode; +import com.google.mediapipe.tasks.vision.facelandmarker.FaceLandmarker; import com.google.mediapipe.tasks.vision.facelandmarker.FaceLandmarkerResult; import org.jetbrains.annotations.NotNull; @@ -30,6 +31,7 @@ import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -264,6 +266,41 @@ public class MainActivity extends GameActivity implements FaceLandmarkerHelper.L float[] points = new float[480 * 3]; + public class Vector { + public float x, y, z; + + public Vector(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + } + + public static String toObjString(ArrayList vertices, ArrayList triangleIndices) { + StringBuilder sb = new StringBuilder(); + + // 写入顶点数据 (v x y z) + for (Vector v : vertices) { + sb.append(String.format("v %.6f %.6f %.6f\n", v.x, v.y, v.z)); + } + + // 写入面数据 (f i1 i2 i3),OBJ索引从1开始,因此每个索引+1 + int size = triangleIndices.size(); + for (int i = 0; i < size; i += 3) { + if (i + 2 < size) { + int i1 = triangleIndices.get(i) + 1; + int i2 = triangleIndices.get(i + 1) + 1; + int i3 = triangleIndices.get(i + 2) + 1; + sb.append(String.format("f %d %d %d\n", i1, i2, i3)); + } else { + // 如果剩余索引不足3个,说明数据不完整 + System.err.println("Warning: Incomplete triangle face at the end of index list."); + } + } + + return sb.toString(); + } + @Override public void onResults(FaceLandmarkerHelper.@NotNull ResultBundle resultBundle) { FaceLandmarkerResult faceLandmarkerResult = resultBundle.getResult(); @@ -278,6 +315,19 @@ public class MainActivity extends GameActivity implements FaceLandmarkerHelper.L nativeBuffer.order(ByteOrder.nativeOrder()); } + + +// ArrayList vertexs = new ArrayList<>(); +// ArrayList triangle_index = new ArrayList<>(); +// +// for (var conn : FaceLandmarker.FACE_LANDMARKS_TESSELATION) { +// triangle_index.add(conn.start()); +// } + + +// StringBuilder sb = new StringBuilder(); +// sb.append("["); + int index = 0; // Iterate through each detected face for (List faceLandmarks : faceLandmarkerResult.faceLandmarks()) { @@ -286,14 +336,25 @@ public class MainActivity extends GameActivity implements FaceLandmarkerHelper.L int arrayIndex = 0; for (NormalizedLandmark p : faceLandmarks) { + //sb.append("["); //Log.i(TAG, "Index" + index + " x:"+p.x() + " y:"+p.y() + " z:"+p.z()); points[arrayIndex++] = p.x(); + //sb.append(""+p.x()+","); points[arrayIndex++] = p.y(); + //sb.append(""+p.y()+","); points[arrayIndex++] = p.z() * z_rate; + //sb.append(""+p.z()); + //vertexs.add(new Vector(p.x(), p.y(), p.z())); + //sb.append("],"); index++; } } + //sb.append("]"); + //String objStr = sb.toString(); + + //String objStr = toObjString(vertexs, triangle_index); + // 转换为FloatBuffer并填充数据 FloatBuffer floatBuffer = nativeBuffer.asFloatBuffer(); floatBuffer.put(points);