Flutter增强现实功能插件ar_core的使用

Flutter增强现实功能插件ar_core的使用

ar_core 是一个用于移动设备的增强现实应用工具包,使创建增强现实应用变得简单。

感谢 Arslan Raza 的贡献,他的 ar_core 项目为本项目的开发提供了良好的基础和起点。

功能

  • 在小部件中显示实时相机预览。
  • 自定义相机位置,可以放置在屏幕上的任何位置。
  • 选择资源文件、网络图片或PNG格式的3D对象。
  • 可以拖动、缩放、旋转和放大缩小对象。
  • 从Dart访问图像流。

开始使用

安装

首先,将 ar_core 包添加到您的项目中:

flutter pub add ar_core

或者手动将其添加到您的 pubspec.yaml 文件中(并运行 flutter pub get):

dependencies:
  ar_core: ^0.0.1
iOS

相机插件功能适用于 iOS 10.0 或更高版本。如果编译的版本低于 10.0,请确保在使用任何相机插件功能之前,通过程序检查设备上运行的 iOS 版本。例如,您可以使用 device_info_plus 插件来检查 iOS 版本。

ios/Runner/Info.plist 文件中添加两行:

  • 一行带有键 Privacy - Camera Usage Description 和描述。
  • 另一行带有键 Privacy - Microphone Usage Description 和描述。

或者直接在文本格式中添加键:

<key>NSCameraUsageDescription</key>
<string>Can I use the camera please?</string>
<key>NSMicrophoneUsageDescription</key>
<string>Can I use the mic please?</string>
Android

在您的 android/app/build.gradle 文件中,将最小 Android SDK 版本更改为 21(或更高)。

minSdkVersion 21

需要注意的是,MediaRecorder 类在模拟器上无法正常工作,具体信息请参阅文档:https://developer.android.com/reference/android/media/MediaRecorder。特别是当启用声音录制视频时,在回放时会发现视频时长不正确,只看到第一帧。

导入

在您的代码中添加以下导入语句:

import 'package:ar_core/ar_core.dart';
使用或如何使用

替换您的 ScaffoldAugmented(),它将处理所有视图。如果您想传递一张图片,只需在构造函数中传递该图片。

main 方法中写入以下代码:

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

List<CameraDescription> cameras = [];

Future<void> main() async {
  try {
    WidgetsFlutterBinding.ensureInitialized();
    cameras = await availableCameras();
  } on CameraException catch (e) {
    print(e.description);
  }
  runApp(const MyApp());
}
添加主类
class AugmentedReality extends StatefulWidget {
  const AugmentedReality({Key? key}) : super(key: key);

  [@override](/user/override)
  _AugmentedRealityState createState() => _AugmentedRealityState();
}

class _AugmentedRealityState extends State<AugmentedReality> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Augmented(
      /// 提供网络图片链接以添加您的对象
      image: 'https://freepngimg.com/static/img/cat/hair.png'
    );
  }
}

完整示例

以下是完整的示例代码:

import 'package:ar_core/ar_core.dart';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

List<CameraDescription> cameras = [];

Future<void> main() async {
  try {
    WidgetsFlutterBinding.ensureInitialized();
    cameras = await availableCameras();
  } on CameraException catch (e) {
    print(e.description);
  }
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Augmented Reality Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const AugmentedReality(),
    );
  }
}

class AugmentedReality extends StatefulWidget {
  const AugmentedReality({Key? key}) : super(key: key);

  [@override](/user/override)
  _AugmentedRealityState createState() => _AugmentedRealityState();
}

class _AugmentedRealityState extends State<AugmentedReality> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Augmented(
      image: 'https://freepngimg.com/static/img/cat/hair.png'
    );
  }
}

更多关于Flutter增强现实功能插件ar_core的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter增强现实功能插件ar_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现增强现实(AR)功能,可以使用 ar_flutter_plugin 插件,该插件是基于 Google 的 ARCore 和 Apple 的 ARKit 开发的。ar_flutter_plugin 提供了一套统一的 API,方便开发者在 Android 和 iOS 平台上实现 AR 功能。

以下是如何在 Flutter 项目中使用 ar_flutter_plugin 插件来实现增强现实功能的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 ar_flutter_plugin 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ar_flutter_plugin: ^1.0.0

然后运行 flutter pub get 来安装依赖。

2. 配置 Android 和 iOS 项目

Android 配置

确保你的 AndroidManifest.xml 文件中包含以下元数据,以启用 ARCore 支持:

<application>
    <meta-data
        android:name="com.google.ar.core"
        android:value="required" />
</application>

iOS 配置

Info.plist 文件中添加以下键值对,以启用 ARKit 支持:

<key>NSCameraUsageDescription</key>
<string>We need access to the camera to enable AR functionality.</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
    <string>arkit</string>
</array>

3. 基本使用

导入插件

在你的 Dart 文件中导入 ar_flutter_plugin

import 'package:ar_flutter_plugin/ar_flutter_plugin.dart';
import 'package:ar_flutter_plugin/managers/ar_anchor_manager.dart';
import 'package:ar_flutter_plugin/managers/ar_location_manager.dart';
import 'package:ar_flutter_plugin/managers/ar_object_manager.dart';
import 'package:ar_flutter_plugin/managers/ar_session_manager.dart';
import 'package:ar_flutter_plugin/models/ar_anchor.dart';
import 'package:ar_flutter_plugin/models/ar_node.dart';
import 'package:flutter/material.dart';

创建 AR 视图

build 方法中创建 ARView 组件:

class ARScreen extends StatefulWidget {
  [@override](/user/override)
  _ARScreenState createState() => _ARScreenState();
}

class _ARScreenState extends State<ARScreen> {
  ARSessionManager arSessionManager;
  ARObjectManager arObjectManager;

  [@override](/user/override)
  void dispose() {
    arSessionManager.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AR Example'),
      ),
      body: ARView(
        onARViewCreated: _onARViewCreated,
      ),
    );
  }

  void _onARViewCreated(ARSessionManager arSessionManager, ARObjectManager arObjectManager) {
    this.arSessionManager = arSessionManager;
    this.arObjectManager = arObjectManager;

    this.arSessionManager.onInitialize(
          showFeaturePoints: false,
          showPlanes: true,
          customPlaneTexturePath: "assets/images/transparent.png",
          showWorldOrigin: true,
        );

    this.arObjectManager.onInitialize();

    // Add an object to the scene
    _addObject();
  }

  void _addObject() async {
    var newNode = ARNode(
      type: NodeType.localGLTF2,
      uri: "assets/models/example.gltf",
      scale: Vector3(0.2, 0.2, 0.2),
      position: Vector3(0.0, 0.0, -1.0),
      rotation: Vector4(1.0, 0.0, 0.0, 0.0),
    );

    await arObjectManager.addNode(newNode);
  }
}
回到顶部