Flutterでベクトル・行列演算?「vector_math」で2D/3D処理をスマートに

普段のアプリ開発ではあまり意識しないかもしれませんが、ゲーム開発・グラフィック表現・アニメーション制御などにおいて、ベクトルや行列の計算が必要になることがあります。

  • オブジェクトの回転や拡大縮小
  • 衝突判定や物理演算
  • カメラの位置や視点の変換

こうした処理を自力で数式で組もうとすると、煩雑になりやすく、バグも生まれやすい。

そんなときに使えるのが、Dart公式の数学ライブラリ「vector_math」です。


vector_mathとは?

vector_mathは、Dart(Flutter)でベクトル、行列、クォータニオンなどの数学演算を簡単に行うためのユーティリティライブラリです。

主な機能:

  • 2次元・3次元のベクトル(Vector2, Vector3)演算
  • 行列(Matrix3, Matrix4)の乗算、逆行列、変換処理
  • クォータニオンによる回転制御
  • 幾何学的操作(正規化、ドット積、クロス積など)
  • 単位変換やトランスフォーメーション(位置・スケール・回転)

Flutter上でグラフィックや物理演算に必要な低レベル数学処理を支援してくれます。


インストール方法

まずは pubspec.yaml に依存関係を追加します。

dependencies:
  vector_math: ^2.1.4  # 最新バージョンはpub.devで確認

よく使うクラスとメソッド

ベクトル:Vector2 / Vector3

import 'package:vector_math/vector_math_64.dart';

final a = Vector2(1.0, 2.0);
final b = Vector2(3.0, 4.0);

final sum = a + b;          // Vector2(4.0, 6.0)
final dot = a.dot(b);       // 内積(スカラー)
final distance = a.distanceTo(b); // 距離

3次元空間ではVector3を使います。


正規化(単位ベクトル化)

final v = Vector3(10, 0, 0);
v.normalize();  // vは長さ1のベクトルに変換される

移動方向の制御や角度計算に便利です。


行列:Matrix4を使った変換

final matrix = Matrix4.identity()
  ..translate(10.0, 20.0, 0.0)
  ..scale(2.0)
  ..rotateZ(45 * degrees2Radians); // 回転角はラジアン

final point = Vector3(1.0, 1.0, 0.0);
final transformed = matrix.transform3(point);

Matrix4は3Dオブジェクトの位置、スケール、回転などの変換を1つにまとめられるため、ゲームやAR開発でも重宝されます。


クォータニオンでの回転制御

final rotation = Quaternion.axisAngle(Vector3(0, 1, 0), radians(90));
final point = Vector3(1, 0, 0);
final rotated = rotation.rotated(point); // Y軸周りに90度回転

ジンバルロックを回避しつつ滑らかな回転制御をしたい場合に便利です。


Flutter×vector_mathの活用例

1. 物体の動きを滑らかに制御

Vector2 position = Vector2(0, 0);
Vector2 velocity = Vector2(1, 0);

void update(double deltaTime) {
  position += velocity * deltaTime;
}

時間を考慮した移動処理が簡潔に書けます。


2. カスタムペイントでの図形回転

final matrix = Matrix4.identity()..rotateZ(angle);
final offset = matrix.transform3(Vector3(50, 0, 0));

CustomPainterなどの描画処理で動的な回転や変形ができます。


3. 衝突判定や方向ベクトルの算出

Vector2 direction = target - origin;
direction.normalize();

if (playerPosition.distanceTo(enemyPosition) < 50) {
  // 衝突したかも
}

ゲームや物理処理の基礎となるロジックもシンプルに。


まとめ

Flutterの世界で「数学」や「3D処理」と聞くと少し敷居が高く感じるかもしれませんが、vector_mathを使えば、ベクトル・行列・回転の扱いが直感的になります。

  • ゲームエンジンなしで2D/3Dを扱いたい
  • カスタムアニメーションの動きを正確に制御したい
  • ARや3Dオブジェクト操作にチャレンジしたい

そんな時、vector_mathは必ず力になってくれます。

Flutter × 数学の世界、ぜひ体験してみてください。

タイトルとURLをコピーしました