139 lines
5.0 KiB
Dart
139 lines
5.0 KiB
Dart
import 'package:ar_flutter_plugin/managers/ar_location_manager.dart';
|
|
import 'package:ar_flutter_plugin/managers/ar_session_manager.dart';
|
|
import 'package:ar_flutter_plugin/managers/ar_object_manager.dart';
|
|
import 'package:ar_flutter_plugin/managers/ar_anchor_manager.dart';
|
|
import 'package:ar_flutter_plugin/models/ar_anchor.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:ar_flutter_plugin/ar_flutter_plugin.dart';
|
|
import 'package:ar_flutter_plugin/datatypes/config_planedetection.dart';
|
|
import 'package:ar_flutter_plugin/datatypes/node_types.dart';
|
|
import 'package:ar_flutter_plugin/datatypes/hittest_result_types.dart';
|
|
import 'package:ar_flutter_plugin/models/ar_node.dart';
|
|
import 'package:ar_flutter_plugin/models/ar_hittest_result.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:vector_math/vector_math_64.dart';
|
|
import 'dart:math';
|
|
|
|
class ObjectsOnPlanesWidget extends StatefulWidget {
|
|
ObjectsOnPlanesWidget({Key? key}) : super(key: key);
|
|
@override
|
|
_ObjectsOnPlanesWidgetState createState() => _ObjectsOnPlanesWidgetState();
|
|
}
|
|
|
|
class _ObjectsOnPlanesWidgetState extends State<ObjectsOnPlanesWidget> {
|
|
ARSessionManager? arSessionManager;
|
|
ARObjectManager? arObjectManager;
|
|
ARAnchorManager? arAnchorManager;
|
|
|
|
List<ARNode> nodes = [];
|
|
List<ARAnchor> anchors = [];
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
arSessionManager!.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text('Anchors & Objects on Planes'),
|
|
),
|
|
body: Container(
|
|
child: Stack(children: [
|
|
ARView(
|
|
onARViewCreated: onARViewCreated,
|
|
planeDetectionConfig: PlaneDetectionConfig.horizontalAndVertical,
|
|
),
|
|
Align(
|
|
alignment: FractionalOffset.bottomCenter,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
children: [
|
|
ElevatedButton(
|
|
onPressed: onRemoveEverything,
|
|
child: Text("Remove Everything")),
|
|
]),
|
|
)
|
|
])));
|
|
}
|
|
|
|
void onARViewCreated(
|
|
ARSessionManager arSessionManager,
|
|
ARObjectManager arObjectManager,
|
|
ARAnchorManager arAnchorManager,
|
|
ARLocationManager arLocationManager) {
|
|
this.arSessionManager = arSessionManager;
|
|
this.arObjectManager = arObjectManager;
|
|
this.arAnchorManager = arAnchorManager;
|
|
|
|
this.arSessionManager!.onInitialize(
|
|
showFeaturePoints: false,
|
|
showPlanes: true,
|
|
customPlaneTexturePath: "Images/triangle.png",
|
|
showWorldOrigin: true,
|
|
);
|
|
this.arObjectManager!.onInitialize();
|
|
|
|
this.arSessionManager!.onPlaneOrPointTap = onPlaneOrPointTapped;
|
|
this.arObjectManager!.onNodeTap = onNodeTapped;
|
|
}
|
|
|
|
Future<void> onRemoveEverything() async {
|
|
/*nodes.forEach((node) {
|
|
this.arObjectManager.removeNode(node);
|
|
});*/
|
|
anchors.forEach((anchor) {
|
|
this.arAnchorManager!.removeAnchor(anchor);
|
|
});
|
|
anchors = [];
|
|
}
|
|
|
|
Future<void> onNodeTapped(List<String> nodes) async {
|
|
var number = nodes.length;
|
|
this.arSessionManager!.onError("Tapped $number node(s)");
|
|
}
|
|
|
|
Future<void> onPlaneOrPointTapped(
|
|
List<ARHitTestResult> hitTestResults) async {
|
|
var singleHitTestResult = hitTestResults.firstWhere(
|
|
(hitTestResult) => hitTestResult.type == ARHitTestResultType.plane);
|
|
if (singleHitTestResult != null) {
|
|
var newAnchor =
|
|
ARPlaneAnchor(transformation: singleHitTestResult.worldTransform);
|
|
bool? didAddAnchor = await this.arAnchorManager!.addAnchor(newAnchor);
|
|
if (didAddAnchor!) {
|
|
this.anchors.add(newAnchor);
|
|
// Add note to anchor
|
|
var newNode = ARNode(
|
|
type: NodeType.webGLB,
|
|
uri:
|
|
"https://github.com/KhronosGroup/glTF-Sample-Models/blob/main/2.0/Duck/glTF-Binary/Duck.glb",
|
|
scale: Vector3(0.2, 0.2, 0.2),
|
|
position: Vector3(0.0, 0.0, 0.0),
|
|
rotation: Vector4(1.0, 0.0, 0.0, 0.0));
|
|
bool? didAddNodeToAnchor =
|
|
await this.arObjectManager!.addNode(newNode, planeAnchor: newAnchor);
|
|
if (didAddNodeToAnchor!) {
|
|
this.nodes.add(newNode);
|
|
} else {
|
|
this.arSessionManager!.onError("Adding Node to Anchor failed");
|
|
}
|
|
} else {
|
|
this.arSessionManager!.onError("Adding Anchor failed");
|
|
}
|
|
/*
|
|
// To add a node to the tapped position without creating an anchor, use the following code (Please mind: the function onRemoveEverything has to be adapted accordingly!):
|
|
var newNode = ARNode(
|
|
type: NodeType.localGLTF2,
|
|
uri: "Models/Chicken_01/Chicken_01.gltf",
|
|
scale: Vector3(0.2, 0.2, 0.2),
|
|
transformation: singleHitTestResult.worldTransform);
|
|
bool didAddWebNode = await this.arObjectManager.addNode(newNode);
|
|
if (didAddWebNode) {
|
|
this.nodes.add(newNode);
|
|
}*/
|
|
}
|
|
}
|
|
} |