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
更多关于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();
}