npm包wavefunctioncollapse使用教程

阅读时长 6 分钟读完

介绍

WaveFunctionCollapse(WFC)是一种广泛应用于可视化和生成算法的技术,其基本思想为: 通过确定一些约束条件,按照某种概率方式,生成满足条件的数据。

npm包wavefunctioncollapse(wfc)是WFC技术的一种实现,它可以支持各种规则的输入,帮助前端开发人员实现复杂的图像和动画效果。本文将详细介绍wfc的使用方法。

安装

使用npm包安装wfc

API

wfc模块提供以下方法

initialize(N, input, periodic, symmetry)

使用给定的输入数据(input),期望输出一个大小为N*N的矩阵

参数

  • N:结果矩阵的大小
  • input:输入数据,包含有颜色、障碍物等约束规则
  • periodic:是否开启周期性规则检测
  • symmetry:使用何种对称形式的约束规则

run(seed)

执行wfc的生成算法,返回一个由0和1组成的数组,表示为确定的数据模式。seed是随机数种子。

setFlag(name, value)

设置wfc的一些参数,例如直接禁用某个颜色、开启多线程模式等。

setOutputMode(mode)

设置输出模式,可以是“array” 或者“texture”。通常使用“texture”模式,减少CPU处理。

setTileset(tileset)

设置Tileset,它描述了每一种状态的颜色、名称、符号等。

核心概念

为了正确地使用WFC,必须先了解一些基本概念。

Tileset

Tileset是整个算法的基础,它描述了同一状态的颜色、符号、名称等。例如,一个Tileset可能包含了名为Green、Red、Blue的三种颜色;名为Rock、Water、Grass的三种类型等。

Tileset是从输入约束中建立的,可以使用TilesetBuilder建立。TilesetBuilder可以将输入数据转换成Tileset,并进行分类。

Tile

Tile是由Tileset定义的状态。例如,一个名为“Green”状态的Tile意味着一个单元格(在2D情况下,这可能是一个像素)中的这一区域应该被渲染为绿色。

Pattern

对于一个特定的尺寸,所有可能的颜色组合都可以定义为一组Pattern。

Wave

Wave是描述Pattem能否出现在可能的解决方案中的一种方法。如果一个Tile不能出现在特定位置,则该Tile的Wave被设置为false。

Model

Model是在WFC算法中使用的图像模型。它由Wave和所有可能的Pattern组成,它描述了在给定约束的情况下可能的图像。

示例代码

下面是一个简单的wfc示例,它将产生一个大小为16x16的结果矩阵,可视化为像素和颜色。需要注意的是,输入约束必须具有明确的类别,如颜色、类型等。

-- -------------------- ---- -------
----- --- - --------------------------------
----- ------ - ---------------------

----- ---- - ---
----- ----- - -
  -- - - - - - - - - - - - - - - --- -- -----------
  -- - - - - - - - - - - - - - --- -- - ----
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - ---
  -- - - - - - - - - - - - - - --
-------------

-- ---------
----- -------------- - --- --------------------
    -----------------------
--------------------------------
--------------------------- ---- ------------
--------------------------- ---------
--------------------------- --------
--------------------------- ---------

----- ----- - -------------------------------- ------

-- ---------------
----- --- - --- --------- ------ ----- ---
----- --- - --- ---------------

-- ----------
----- ------ - -------------
----- --------- - --- --------------- - ---- - ---

-- ---------------
------------------ -- -- -
  -- -- --- -- -
    ----------- - -- - ----
    ----------- - - - -- - ----
    ----------- - - - -- - ----
  - ---- -- -- --- -- -
    ----------- - -- - --
    ----------- - - - -- - --
    ----------- - - - -- - --
  - ---- -- -- --- -- -
    ----------- - -- - ----
    ----------- - - - -- - ----
    ----------- - - - -- - ----
  - ---- -- -- --- -- -
    ----------- - -- - ----
    ----------- - - - -- - ----
    ----------- - - - -- - ----
  - ---- -- -- --- -- -
    ----------- - -- - ----
    ----------- - - - -- - --
    ----------- - - - -- - --
  -
  ----------- - - - -- - ----
---

-- --------
----- ------ - ---------------------------------
----------------------------------
------------ - -----
------------- - -----
----- --- - ------------------------
----- ------------ - --- -------------------- ----- ------
------------------------------ -- ---

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60067350890c4f7277583964

纠错
反馈