Flutter动画效果插件ballistic的使用

Flutter 动画效果插件 ballistics 的使用

ballistics 是一个用于计算小口径枪械弹道的库。它提供了对各种应用的弹道轨迹计算,包括气枪、弓、火器、火炮等。

该库的 3D 模型根植于 JBM 计算器 2 版本的公共版本的旧 C 源码,经过移植到 C#、优化、修复,并扩展了 Litz 的《应用弹道学》一书中描述的元素,再移植到 Go。

Go 版本的代码位于 GitHub,而 Dart 版本则是从 Go 版本移植过来的。

C# 版本的包位于 GitHub,Go 版本的包位于 GitHub

C# API 文档的在线版本位于 这里

该项目目前处于 ALPHA 版本。

风险提示

该库仅对复杂物理过程进行非常有限的模拟,因此进行了大量的近似处理。因此,计算结果不应被视为完全可靠地反映实际的弹道行为或特性。虽然这些结果可用于教育目的,但它们绝不能作为在错误计算可能导致错误决策、财务损失或危及人类生命的情况下使用的可靠依据。

免责声明

该代码按原样提供,没有任何形式的保证,无论是明示还是暗示,包括但不限于适销性、特定用途适用性和非侵权性的保证。无论是在合同诉讼、侵权或其他情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是由于材料或材料的使用或其他原因引起的。


示例代码

import 'package:ballistic/ballistic.dart';

void main() {
  // 创建一个弹道系数对象
  var bc = createBallisticCoefficient(0.223, DragTableId.g1);
  
  // 创建一个弹丸对象
  var projectile = Projectile(bc, Weight(168, WeightUnit.grain));
  
  // 创建一个弹药对象
  var ammo = Ammunition(projectile, Velocity(2750, VelocityUnit.fps));
  
  // 创建零点信息
  var zero = ZeroInfo.createZeroInfo(Distance(100, DistanceUnit.yard));
  
  // 创建武器对象
  var weapon = Weapon.createWeapon(Distance(2, DistanceUnit.inch), zero);
  
  // 创建大气层对象
  var atmosphere = Atmosphere.createDefaultAtmosphere();
  
  // 创建射击参数对象
  var shotInfo = ShotParameters.createShotParameters(
      Angular(0.001228, AngularUnit.radian),
      Distance(1000, DistanceUnit.yard),
      Distance(100, DistanceUnit.yard));
  
  // 创建风的信息
  var wind = createOnlyWindInfo(Velocity(5, VelocityUnit.mph),
      Angular(-45, AngularUnit.degree));

  // 创建轨迹计算器
  var calc = TrajectoryCalculator(
      maximumCalculatorStepSize: Distance(
          1, DistanceUnit.foot));
  
  // 进行轨迹计算
  var data = calc.trajectory(ammo, weapon, atmosphere, shotInfo, wind);

  // 打印计算结果
  for (var trajectoryData in data) {
    print("子弹飞行${trajectoryData.travelDistance.into(DistanceUnit.meter).toString()}后");
    print("子弹下落距离为${trajectoryData.drop.into(DistanceUnit.inch).toString()}英寸");
  }
}

完整示例 Demo

在下面的完整示例中,我们将展示如何使用 ballistic 库来计算并显示弹道轨迹。

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('弹道计算')),
        body: Center(
          child: Container(
            width: 300,
            height: 300,
            child: CustomPaint(
              painter: TrajectoryPainter(),
            ),
          ),
        ),
      ),
    );
  }
}

class TrajectoryPainter extends CustomPainter {
  [@override](/user/override)
  void paint(Canvas canvas, Size size) {
    Paint paint = Paint()
      ..color = Colors.black
      ..strokeWidth = 2
      ..style = PaintingStyle.stroke;

    // 创建弹道计算器
    var calc = TrajectoryCalculator(
        maximumCalculatorStepSize: Distance(1, DistanceUnit.foot));

    // 创建弹道数据
    var data = calc.trajectory(
        createAmmunition(), createWeapon(), createAtmosphere(), createShotInfo(), createWindInfo());

    // 绘制弹道轨迹
    for (int i = 0; i < data.length - 1; i++) {
      var startPoint = Offset(data[i].travelDistance.into(DistanceUnit.pixel).toDouble(), size.height);
      var endPoint = Offset(data[i + 1].travelDistance.into(DistanceUnit.pixel).toDouble(), size.height - data[i + 1].drop.into(DistanceUnit.pixel).toDouble());
      canvas.drawLine(startPoint, endPoint, paint);
    }
  }

  [@override](/user/override)
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

更多关于Flutter动画效果插件ballistic的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动画效果插件ballistic的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用ballistic插件来实现动画效果的代码案例。ballistic插件主要用于创建抛物线式的动画效果,类似于物理抛射体的运动。

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

dependencies:
  flutter:
    sdk: flutter
  ballistic: ^0.1.0  # 请检查最新版本号并替换

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

下面是一个简单的代码示例,展示了如何使用ballistic插件来实现一个基本的抛物线动画:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Ballistic Animation Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BallisticAnimationDemo(),
    );
  }
}

class BallisticAnimationDemo extends StatefulWidget {
  @override
  _BallisticAnimationDemoState createState() => _BallisticAnimationDemoState();
}

class _BallisticAnimationDemoState extends State<BallisticAnimationDemo> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<Offset> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);

    // 使用BallisticScrollSimulation来创建动画
    final simulation = BallisticScrollSimulation(
      position: 0.0,
      velocity: 1000.0,
      leadingExtent: -300.0, // 开始位置
      trailingExtent: 300.0, // 结束位置
    );

    _animation = Tween<Offset>(
      begin: Offset.zero,
      end: const Offset(1.0, 0.0), // 你可以根据需要调整结束位置
    ).animate(
      AnimationAdapter(simulation: simulation, child: _controller),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Ballistic Animation Demo'),
      ),
      body: Center(
        child: SlideTransition(
          position: _animation,
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Animate',
                style: TextStyle(color: Colors.white),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个AnimationController来控制动画的时长和重复行为。然后,我们使用BallisticScrollSimulation来模拟一个抛物线式的动画效果。BallisticScrollSimulation需要四个参数:当前位置、速度、开始位置和结束位置。这里我们假设动画从屏幕左侧移动到右侧。

注意:BallisticScrollSimulation并不是ballistic包的一部分,而是Flutter SDK自带的模拟类,用于模拟滚动动画。然而,ballistic包通常用于更复杂或自定义的抛物线动画。如果你的需求更加复杂,你可能需要深入了解ballistic包的API文档,并自定义动画行为。

由于ballistic包的具体API和实现可能会随着版本变化,建议查阅最新的pub.dev页面来获取详细的文档和示例。

希望这个示例对你有所帮助!如果你有更具体的需求或问题,请随时提问。

回到顶部