Flutter噪声生成插件open_simplex_noise的使用

Flutter噪声生成插件open_simplex_noise的使用

OpenSimplexNoise

OpenSimplex噪声是一种在2、3或4维空间中生成平滑变化的确定性随机值的方法。这可以用于程序化生成纹理、形状或地形。

噪声比较

OpenSimplex噪声是Kurt Spencer专利免费替代品的经典Perlin和Simplex噪声的Dart实现。

使用方法

以下是如何在Flutter项目中使用open_simplex_noise插件的步骤:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('OpenSimplexNoise Demo')),
        body: Center(
          child: NoiseGenerator(),
        ),
      ),
    );
  }
}

class NoiseGenerator extends StatefulWidget {
  @override
  _NoiseGeneratorState createState() => _NoiseGeneratorState();
}

class _NoiseGeneratorState extends State<NoiseGenerator> {
  OpenSimplexNoise noise;

  @override
  void initState() {
    super.initState();
    noise = OpenSimplexNoise(seed: 1); // 初始化噪声生成器
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      width: 200,
      height: 200,
      child: CustomPaint(
        painter: NoisePainter(noise),
      ),
    );
  }
}

class NoisePainter extends CustomPainter {
  final OpenSimplexNoise noise;

  NoisePainter(this.noise);

  @override
  void paint(Canvas canvas, Size size) {
    Paint paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.fill;

    for (int x = 0; x < size.width; x++) {
      for (int y = 0; y < size.height; y++) {
        double value = noise.eval2D(x.toDouble(), y.toDouble()) * 0.5 + 0.5;
        paint.color = Color((value * 255).toInt()).withOpacity(255);
        canvas.drawCircle(Offset(x.toDouble(), y.toDouble()), 1, paint);
      }
    }
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

安装

要将open_simplex_noise插件添加到您的项目中,请执行以下步骤:

  1. 在项目的pubspec.yaml文件中添加依赖项:

    dependencies:
      flutter:
        sdk: flutter
      open_simplex_noise: ^1.0.0 # 请根据最新版本更新
    

更多关于Flutter噪声生成插件open_simplex_noise的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter噪声生成插件open_simplex_noise的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


open_simplex_noise 是一个用于生成 OpenSimplex 噪声的 Flutter 插件。OpenSimplex 噪声是一种用于生成平滑、连续噪声的算法,常用于生成地形、纹理等。它是 Simplex 噪声的改进版本,适用于 2D、3D 和 4D 空间。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 open_simplex_noise 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  open_simplex_noise: ^1.0.0

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的 Dart 文件中导入 open_simplex_noise 包:

import 'package:open_simplex_noise/open_simplex_noise.dart';

3. 创建噪声生成器

你可以通过 OpenSimplexNoise 类来创建一个噪声生成器。你可以指定一个种子(seed)来控制噪声的生成:

final noise = OpenSimplexNoise(seed: 12345);

4. 生成噪声

你可以使用 noise.eval2noise.eval3noise.eval4 方法来生成 2D、3D 或 4D 噪声。

生成 2D 噪声

double x = 0.5;
double y = 0.5;
double noiseValue = noise.eval2(x, y);
print('2D Noise Value: $noiseValue');

生成 3D 噪声

double x = 0.5;
double y = 0.5;
double z = 0.5;
double noiseValue = noise.eval3(x, y, z);
print('3D Noise Value: $noiseValue');

生成 4D 噪声

double x = 0.5;
double y = 0.5;
double z = 0.5;
double w = 0.5;
double noiseValue = noise.eval4(x, y, z, w);
print('4D Noise Value: $noiseValue');

5. 使用噪声值

生成的噪声值通常在 -1.01.0 之间。你可以根据需要对其进行缩放和偏移,例如将其映射到 0.01.0 之间:

double scaledNoiseValue = (noiseValue + 1.0) / 2.0;
print('Scaled Noise Value: $scaledNoiseValue');

6. 应用示例

以下是一个简单的示例,展示了如何在 Flutter 应用中使用 open_simplex_noise 生成 2D 噪声,并将其应用于背景颜色:

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

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

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

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

class _NoiseBackgroundState extends State<NoiseBackground> {
  final noise = OpenSimplexNoise(seed: 12345);
  double x = 0.0;
  double y = 0.0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        onPanUpdate: (details) {
          setState(() {
            x += details.delta.dx / 100;
            y += details.delta.dy / 100;
          });
        },
        child: Container(
          color: _getNoiseColor(),
          child: Center(
            child: Text('Drag to change noise'),
          ),
        ),
      ),
    );
  }

  Color _getNoiseColor() {
    double noiseValue = noise.eval2(x, y);
    double scaledNoiseValue = (noiseValue + 1.0) / 2.0;
    int colorValue = (scaledNoiseValue * 255).toInt();
    return Color.fromARGB(255, colorValue, colorValue, colorValue);
  }
}
回到顶部