Java 如何使用Sceneform、ARCore绘制多边形?
假设我有三个来自ArFragment命中结果的锚 Anchor Anchor=hitResult.createAnchor()Java 如何使用Sceneform、ARCore绘制多边形?,java,android,polygon,arcore,sceneform,Java,Android,Polygon,Arcore,Sceneform,假设我有三个来自ArFragment命中结果的锚 Anchor Anchor=hitResult.createAnchor() 如何使用Sceneform绘制三角形并应用自定义纹理?第一步是创建AnchorNodes的列表,以便能够获取锚点的坐标。我们将在列表中添加所有这些内容: private final List<AnchorNode> anchorsList = new ArrayList<>(); 下面是方法的详细信息makeTriangleWithAnchor
如何使用Sceneform绘制三角形并应用自定义纹理?第一步是创建
AnchorNode
s的列表,以便能够获取锚点的坐标。我们将在列表中添加所有这些内容:
private final List<AnchorNode> anchorsList = new ArrayList<>();
下面是方法的详细信息makeTriangleWithAnchors()
:
私有模型可渲染makeTriangleWithAnchors(@NonNull final List谢谢!我希望他们在他们的文档参考中发布更多类似的东西/示例,并添加对除球体、立方体、圆柱体之外的更多几何图元的支持。不客气。事实上,我在ShapeFactory
中查看了立方体是如何实现的,以适应平面三角形。最后,如果您可以将我的答案标记为问题的解决方案。您是否可以帮助修改代码以将其中一个节点设置为所创建三角形的父节点?当arFragment.getArSceneView().getsceneview()时
已设置-节点三角形连接不太稳定。但当我刚更改父节点时,三角形会变小并移动。谢谢您的帮助!
final Anchor anchor = hitResult.createAnchor();
final AnchorNode anchorNode = new AnchorNode(anchor);
anchorNode.setParent(arFragment.getArSceneView().getScene());
anchorsList.add(anchorNode);
if (anchorsList.size() == 3) {
final Texture.Sampler sampler = Texture.Sampler.builder()
.setMinFilter(Texture.Sampler.MinFilter.LINEAR_MIPMAP_LINEAR)
.setMagFilter(Texture.Sampler.MagFilter.LINEAR)
.setWrapModeR(Texture.Sampler.WrapMode.REPEAT)
.setWrapModeS(Texture.Sampler.WrapMode.REPEAT)
.setWrapModeT(Texture.Sampler.WrapMode.REPEAT)
.build();
Texture.builder()
.setSource(() -> getAssets().open("wall.jpg"))
.setSampler(sampler)
.build()
.thenAccept(texture -> MaterialFactory.makeOpaqueWithTexture(this, texture)
.thenAccept(material -> {
final Node node = new Node();
final ModelRenderable triangle = makeTriangleWithAnchors(anchorsList, material);
node.setParent(arFragment.getArSceneView().getScene());
node.setRenderable(triangle);
})
);
}
private ModelRenderable makeTriangleWithAnchors(@NonNull final List<AnchorNode> anchorNodes, @NonNull final Material material) {
if (anchorNodes.size() != 3) throw new IllegalStateException("Different count of anchorsList than 3");
final Vector3 p0 = anchorNodes.get(0).getLocalPosition();
final Vector3 p1 = anchorNodes.get(1).getLocalPosition();
final Vector3 p2 = anchorNodes.get(2).getLocalPosition();
final Vector3 up = Vector3.up();
final UvCoordinate uvTop = new UvCoordinate(0.5f, 1.0f);
final UvCoordinate uvBotLeft = new UvCoordinate(0.0f, 0.0f);
final UvCoordinate uvBotRight = new UvCoordinate(1.0f, 0.0f);
final List<Vertex> vertices = new ArrayList<>(Arrays.asList(
Vertex.builder().setPosition(p0).setNormal(up).setUvCoordinate(uvTop).build(),
Vertex.builder().setPosition(p1).setNormal(up).setUvCoordinate(uvBotRight).build(),
Vertex.builder().setPosition(p2).setNormal(up).setUvCoordinate(uvBotLeft).build()
));
final List<Integer> triangleIndices = new ArrayList<>(3);
triangleIndices.add(0);
triangleIndices.add(2);
triangleIndices.add(1);
triangleIndices.add(0);
triangleIndices.add(1);
triangleIndices.add(2);
final RenderableDefinition.Submesh submesh = RenderableDefinition.Submesh.builder()
.setTriangleIndices(triangleIndices)
.setMaterial(material)
.build();
final RenderableDefinition renderableDefinition = RenderableDefinition.builder()
.setVertices(vertices)
.setSubmeshes(Arrays.asList(submesh))
.build();
final CompletableFuture future = ModelRenderable.builder()
.setSource(renderableDefinition)
.build();
final ModelRenderable result;
try {
result = (ModelRenderable) future.get();
} catch (InterruptedException | ExecutionException e) {
throw new AssertionError("Error creating renderable.", e);
}
if (result == null) {
throw new AssertionError("Error creating renderable.");
} else {
return result;
}
}