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 { ARSessionManager? arSessionManager; ARObjectManager? arObjectManager; ARAnchorManager? arAnchorManager; List nodes = []; List 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 onRemoveEverything() async { /*nodes.forEach((node) { this.arObjectManager.removeNode(node); });*/ anchors.forEach((anchor) { this.arAnchorManager!.removeAnchor(anchor); }); anchors = []; } Future onNodeTapped(List nodes) async { var number = nodes.length; this.arSessionManager!.onError("Tapped $number node(s)"); } Future onPlaneOrPointTapped( List 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); }*/ } } }