Flutter 的 3D 模型查看器

https://pub.dev/packages/model_viewer – Fork 自一个已停止维护的包,并为其添加了 Web 支持。

这是一个用于在 glTFGLB 格式中渲染交互式 3D 模型的 Flutter 小部件。

该小部件将 Google 的 <model-viewer> Web 组件嵌入到 WebView 中。

截图

Screenshot of astronaut model

Screenshot of astronaut model

兼容性

Android、iOS、Web,需要 最近的系统浏览器版本

注意事项

我们在 Android 上使用 Google 应用 com.google.android.googlequicksearchbox 来显示交互式 3D 模型。模型默认以“ar_preferred”模式显示,场景查看器以 AR 原生模式作为入口模式启动。如果不存在 Google Play 服务的 AR(ARCore,com.google.ar.core,场景查看器会优雅地回退到 3D 模式作为入口模式。

安装

pubspec.yaml

dependencies:
   model_viewer_plus: ^(newest from https://pub.dev/packages/model_viewer_plus)

AndroidManifest.xml (仅限 Android 9+)

要在 Android 9+ 设备上使用此小部件,您的应用必须允许与 https://:XXXXX 进行 HTTP 连接。Android 9 (API level 28) 将 android:usesCleartextTraffic 的默认值从 true 更改为 false,因此您需要将应用的 android/app/src/main/AndroidManifest.xml 配置如下:

--- a/example/android/app/src/main/AndroidManifest.xml
+++ b/example/android/app/src/main/AndroidManifest.xml
@@ -8,7 +8,8 @@
     <application
         android:name="io.flutter.app.FlutterApplication"
         android:label="model_viewer_example"
-        android:icon="@mipmap/ic_launcher">
+        android:icon="@mipmap/ic_launcher"
+        android:usesCleartextTraffic="true">
         <activity
             android:name=".MainActivity"
             android:launchMode="singleTop"

这不影响 Android 8 及更早版本。有关更多信息,请参阅 #7

app/build.gradle (仅限 Android)

将 minSdkVersion 设置为 19。

defaultConfig {
    // TODO: Specify your own unique Application ID (https://developer.android.com.cn/studio/build/application-id.html).
    applicationId "com.example.lab_rat"
    minSdkVersion 19
    targetSdkVersion flutter.targetSdkVersion
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}

Info.plist (仅限 iOS)

要在 iOS 上使用此小部件,您需要通过向应用的 ios/Runner/Info.plist 文件添加一个布尔属性,键为 io.flutter.embedded_views_preview,值为 YES,来选择加入嵌入式视图预览。

<key>io.flutter.embedded_views_preview</key>
<true/>

web/index.html (仅限 Web)

修改您 web/index.html<head> 标签以加载 JavaScript,如下所示:

<head>

  <!-- Other stuff -->

  <script type="module" src="./assets/packages/model_viewer_plus/assets/model-viewer.min.js" defer></script>
</head>

./assets/packages/model_viewer_plus/assets/model-viewer.min.js 将使用此包资产中包含的默认 JS 文件。 官方网站 使用 unpkg,通过使用 https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js,您正在使用最新版本的 <model-viewier>。您可以将 src 属性的值替换为另一个 CDN 镜像的 URL。但请注意,我们的 model-viewer-plus 可能无法跟上 <model-viewier> 的最新版本。

功能

  • 渲染 glTF 和 GLB 模型。(同样,USDZ 模型在 iOS 12+ 上也支持。)

  • 支持动画模型,并具有可配置的自动播放设置。

  • 可选支持将模型启动到 AR 查看器。

  • 可选自动旋转模型,并具有可配置的延迟。

  • 支持小部件的可配置背景颜色。

示例

导入库

import 'package:model_viewer_plus/model_viewer_plus.dart';

创建 ModelViewer 小部件

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Model Viewer")),
        body: ModelViewer(
          src: 'https://modelviewer.dev/shared-assets/models/Astronaut.glb',
          alt: "A 3D model of an astronaut",
          ar: true,
          autoRotate: true,
          cameraControls: true,
        ),
      ),
    );
  }
}

加载捆绑的 Flutter 资源

class MyApp extends StatelessWidget {
// ...
          src: 'assets/MyModel.glb',
// ...
}

从文件系统加载模型

这在 Web 上不可用。

class MyApp extends StatelessWidget {
// ...
          src: 'file:///path/to/MyModel.glb',
// ...
}

从 Web 加载模型

class MyApp extends StatelessWidget {
// ...
          src: 'https://modelviewer.dev/shared-assets/models/Astronaut.glb',
// ...
}

请注意,由于浏览器的 CORS 安全限制,模型文件必须使用 Access-Control-Allow-Origin: * HTTP 标头进行托管。

常见问题解答

问:为什么我收到 net::ERR_CLEARTEXT_NOT_PERMITTED 错误?

您没有按照本文档前面安装说明中的要求配置您的 AndroidManifest.xml。另请参阅 #7

问:为什么示例应用只显示一个空白屏幕?

答: 最有可能的原因是您设备或模拟器上的平台浏览器版本太旧,不支持 Model Viewer 所需的功能。

例如,Android 10 模拟器上的 stock Chrome 版本太旧,会显示一个空白屏幕;需要从 Play 商店更新才能使用此包。(Android 11 模拟器上的 stock Chrome 版本可以正常工作。)有关更多信息,请参阅 google/model-viewer#1109

问:为什么我的 3D 模型无法加载和/或渲染?

答: 您的模型 URL 可能因多种原因而无法加载和渲染

  1. 由于 CORS 安全限制,可能无法加载模型 URL。托管模型文件的服务器必须发送适当的 CORS 响应标头,Model Viewer 才能加载文件。请参阅 google/model-viewer#1015

  2. 可能无法解析提供的 glTF 或 GLB 文件。一些工具在导出 glTF 时可能会生成无效文件。请始终使用 glTF Validator 运行您的模型文件以检查此问题。

  3. 平台浏览器可能不支持 Model Viewer 所需的功能。请参阅 google/model-viewer#1109

GitHub

查看 Github