Flutter三维渲染插件three_js_core的使用

Flutter三维渲染插件three_js_core的使用

Gif of geometries rotating.

此插件是three.js和three_dart的Dart版本转换,由@mrdoob创建,并由@wasabia进行了Dart版本的移植。

使用

这是three.js的核心API。

示例

完整的示例代码可以在以下链接中找到:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:three_js_core/three_js_core.dart' as three;
import 'package:three_js_math/three_js_math.dart' as tmath;
import 'dart:math' as math;

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 此部件是你的应用的根部件。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const WebglGeometries(),
    );
  }
}

class WebglGeometries extends StatefulWidget {
  const WebglGeometries({super.key});

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

class _State extends State<WebglGeometries> {
  late three.ThreeJS threeJs;

  [@override](/user/override)
  void initState() {
    threeJs = three.ThreeJS(
      onSetupComplete: () { setState(() {}); },
      setup: setup,
      settings: three.Settings(
        localClippingEnabled: true,
      )
    );
    super.initState();
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return threeJs.build();
  }

  int startTime = 0;

  Future<void> setup() async {
    threeJs.camera = three.PerspectiveCamera(45, threeJs.width / threeJs.height, 1, 2000);
    threeJs.camera.position.y = 400;

    threeJs.scene = three.Scene();

    three.Mesh object;

    final ambientLight = three.AmbientLight(0xcccccc, 0.4);
    threeJs.scene.add(ambientLight);

    final pointLight = three.PointLight(0xffffff, 0.8);
    threeJs.camera.add(pointLight);
    threeJs.scene.add(threeJs.camera);

    final material = three.MeshPhongMaterial.fromMap({"side": tmath.DoubleSide});
    object = three.Mesh(three.SphereGeometry(75, 20, 10), material);
    object.position.setValues(-300, 0, 200);
    threeJs.scene.add(object);

    object = three.Mesh(three.PlaneGeometry(100, 100, 4, 4), material);
    object.position.setValues(-300, 0, 0);
    threeJs.scene.add(object);

    object = three.Mesh(three.BoxGeometry(100, 100, 100, 4, 4, 4), material);
    object.position.setValues(-100, 0, 0);
    threeJs.scene.add(object);

    startTime = DateTime.now().millisecondsSinceEpoch;

    threeJs.addAnimationEvent((dt) {
      final timer = DateTime.now().millisecondsSinceEpoch * 0.0001;

      threeJs.camera.position.x = math.cos(timer) * 800;
      threeJs.camera.position.z = math.sin(timer) * 800;
      threeJs.camera.lookAt(threeJs.scene.position);

      threeJs.scene.traverse((object) {
        if (object is three.Mesh) {
          object.rotation.x = timer * 5;
          object.rotation.y = timer * 2.5;
        }
      });
    });
  }
}

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

1 回复

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


在Flutter中使用three_js_core插件进行三维渲染,可以结合Dart和Three.js的功能来实现。以下是一个简单的示例代码,展示如何在Flutter应用中集成和使用three_js_core插件进行基本的三维渲染。

首先,确保你已经在pubspec.yaml文件中添加了three_js_core依赖:

dependencies:
  flutter:
    sdk: flutter
  three_js_core: ^最新版本号  # 请替换为实际的最新版本号

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

接下来是示例代码,展示如何在Flutter中使用three_js_core

import 'package:flutter/material.dart';
import 'package:three_js_core/three_js_core.dart' as THREE;
import 'dart:html' as html;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Three.js Core in Flutter'),
        ),
        body: ThreeJSView(),
      ),
    );
  }
}

class ThreeJSView extends StatefulWidget {
  @override
  _ThreeJSViewState createState() => _ThreeJSViewState();
}

class _ThreeJSViewState extends State<ThreeJSView> {
  html.CanvasElement? canvasElement;
  THREE.Scene? scene;
  THREE.Camera? camera;
  THREE.Renderer? renderer;
  THREE.CubeGeometry? cubeGeometry;
  THREE.MeshBasicMaterial? cubeMaterial;
  THREE.Mesh? cube;

  @override
  void initState() {
    super.initState();
    initThreeJS();
  }

  void initThreeJS() {
    // Create canvas element
    canvasElement = html.document.createElement('canvas') as html.CanvasElement;
    html.document.body!.append(canvasElement!);

    // Set up scene
    scene = THREE.Scene()!;

    // Set up camera
    camera = THREE.PerspectiveCamera(
      75,
      window.innerWidth.toDouble() / window.innerHeight.toDouble(),
      0.1,
      1000,
    )!;
    camera!.position.z = 5.0;

    // Set up renderer
    renderer = THREE.WebGLRenderer({
      'canvas': canvasElement!,
    })!;
    renderer!.setSize(window.innerWidth, window.innerHeight);

    // Create cube geometry and material
    cubeGeometry = THREE.BoxGeometry(1.0, 1.0, 1.0)!;
    cubeMaterial = THREE.MeshBasicMaterial({
      'color': THREE.Color(0x00ff00),
      'wireframe': true,
    })!;

    // Create cube mesh and add to scene
    cube = THREE.Mesh(cubeGeometry!, cubeMaterial!)!;
    scene!.add(cube!);

    // Animate
    animate();
  }

  void animate() {
    requestAnimationFrame(animate);

    // Rotate cube
    cube!.rotation.x += 0.01;
    cube!.rotation.y += 0.01;

    // Render scene and camera
    renderer!.render(scene!, camera!);
  }

  @override
  Widget build(BuildContext context) {
    // Use a Container to hold the canvas element
    return Container(
      child: html.HtmlElementView.fromType(
        'canvas',
        createContext: () => canvasElement!,
      ),
    );
  }

  @override
  void dispose() {
    // Clean up resources when the widget is disposed
    renderer?.dispose();
    super.dispose();
  }
}

注意

  1. 由于three_js_core是一个直接封装Three.js的Dart库,所以它的API与Three.js非常相似。在上面的代码中,我们通过html.document.createElement('canvas')创建了一个HTML canvas元素,并将其添加到文档中。
  2. 使用了html.HtmlElementView.fromType来将canvas元素嵌入到Flutter的Widget树中。
  3. 初始化Three.js的场景、相机和渲染器,并创建一个简单的旋转立方体。
  4. 使用requestAnimationFrame进行动画渲染。

此代码示例应能帮助你在Flutter应用中集成和使用three_js_core插件进行三维渲染。根据你的具体需求,你可以进一步扩展和修改这个示例。

回到顶部