Flutter 3D渲染插件openworld_gl的使用

Flutter 3D渲染插件openworld_gl的使用

这是更新为与最新版本Gradle兼容的Flutter gl包。它用于与https://github.com/forthtemple/openworlddart/ 包一起工作。此版本还包括Linux兼容性。

通过Dart的dart:ffi调用OpenGL API。在Flutter上提供带有纹理的OpenGL。

支持平台:iOS、Android、Web、macOS、Windows、Linux。

OpenGL API

API类似于WebGL。

只支持绘制到FBO(帧缓冲对象)。然后将FBO的纹理共享给原生侧。

导入

import 'package:openworld_gl/flutter_gl.dart';

使用

int width = 200;
int height = 200;
num dpr = 1.0;

flutterGlPlugin = FlutterGlPlugin();

Map<String, dynamic> _options = {
    "width": width, 
    "height": height, 
    "dpr": dpr,
    "antialias": true,
    "alpha": false
};    
await flutterGlPlugin.initialize(options: _options);

// 在Web上,这需要在Web canvas DOM添加到文档后调用
await flutterGlPlugin.prepareContext();

// 您可以通过以下方式获取gl
gl = flutterGlPlugin.gl;

// 然后您可以像这样通过gl调用OpenGL ES API
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

// 使用此方法通知Flutter更新纹理小部件
// sourceTexture是绑定到FBO帧缓冲区的纹理
flutterGlPlugin.updateTexture(sourceTexture);

为什么使用NativeArray替换Dart List

Dart List转换为ffi指针需要内存复制。

运行示例

克隆或下载此存储库:

cd flutter_gl/flutter_gl/example

flutter run

共享OpenGL上下文与flutter_gl

Android

初始化插件时,保存与ThreeEgl共享的OpenGL上下文,

ThreeEgl.setContext("shareContext", shareEglEnv.eglContext);

因此,您可以使用ThreeEgl库获取它,然后创建一个与"shareContext"共享的自己的OpenGL上下文。

shareContext = ThreeEgl.getContext("shareContext");

iOS

对于iOS,关键是3…

eAGLShareContext = ThreeEgl.getContext(key: 3);

更多关于Flutter 3D渲染插件openworld_gl的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter 3D渲染插件openworld_gl的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


openworld_gl 是一个基于 Flutter 的 3D 渲染插件,它允许开发者在 Flutter 应用中集成 3D 地图和地理空间数据。它基于 Mapbox GL JS 和 Mapbox GL Native,提供了高性能的 3D 地图渲染功能。以下是使用 openworld_gl 插件的基本步骤和示例代码。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 openworld_gl 依赖:

dependencies:
  flutter:
    sdk: flutter
  openworld_gl: ^0.1.0  # 请查看 pub.dev 获取最新版本

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

2. 获取 Mapbox 访问令牌

openworld_gl 使用了 Mapbox 的地图服务,因此你需要一个 Mapbox 访问令牌。你可以通过 Mapbox 官网注册并获取访问令牌。

3. 初始化地图

在你的 Flutter 应用中初始化地图并设置 Mapbox 访问令牌:

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

void main() async {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MapScreen(),
    );
  }
}

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

class _MapScreenState extends State<MapScreen> {
  OpenworldGlController? _mapController;

  [@override](/user/override)
  void initState() {
    super.initState();
    OpenworldGl.initialize('YOUR_MAPBOX_ACCESS_TOKEN');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('OpenWorld GL Example'),
      ),
      body: OpenworldGl(
        onMapCreated: _onMapCreated,
        initialCameraPosition: CameraPosition(
          target: LatLng(37.7749, -122.4194), // San Francisco
          zoom: 12.0,
        ),
      ),
    );
  }

  void _onMapCreated(OpenworldGlController controller) {
    _mapController = controller;
  }
}

4. 添加图层和标记

你可以在地图上添加图层和标记。以下是一个添加标记的示例:

void _onMapCreated(OpenworldGlController controller) {
  _mapController = controller;

  controller.addMarker(
    MarkerOptions(
      position: LatLng(37.7749, -122.4194), // San Francisco
      icon: 'assets/marker.png', // 本地资源中的标记图标
    ),
  );
}

5. 控制地图

你可以通过 OpenworldGlController 来控制地图的交互,例如移动相机位置、缩放、旋转等:

void _moveCamera() {
  _mapController?.animateCamera(
    CameraUpdate.newLatLngZoom(LatLng(40.7128, -74.0060), 14.0), // New York
  );
}

6. 处理地图事件

你可以监听地图事件,例如点击、长按、相机移动等:

void _onMapCreated(OpenworldGlController controller) {
  _mapController = controller;

  controller.onMapClick.listen((LatLng position) {
    print('Map clicked at $position');
  });

  controller.onCameraMove.listen((cameraPosition) {
    print('Camera moved to $cameraPosition');
  });
}

7. 样式和图层控制

你可以通过 OpenworldGlController 来动态改变地图样式或添加/移除图层:

void _changeMapStyle() {
  _mapController?.setStyle('mapbox://styles/mapbox/streets-v11');
}

8. 释放资源

在页面销毁时,记得释放地图资源:

[@override](/user/override)
void dispose() {
  _mapController?.dispose();
  super.dispose();
}
回到顶部