添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

分形布朗运动FBM(Fractal Brown Motion)是1968年Mandelbrot和Ness两人提出的一种数学模型,它是一种随机运动,粒子的运动方向随时改变,其运动轨迹是一条无规则的折线,不受什么约束和支配。它主要用于描述自然界的山脉、云层、地形地貌以及模拟星球表面等不规则形状阶。

分型布朗运动的原理: https://thebookofshaders.com/13/?lan=ch

从音乐理论上说,每个音符都和一个特定的频率相关联。这些音符和频率的关系遵从一定的模式,也就是我们所说的音阶,一个八度(octave)对应着频率上的加倍或减半。

通过在循环( 循环次数为 octaves ,一次循环为一个八度 )中叠加噪声,并以一定的倍数( lacunarity ,间隙度)连续升高频率,同时以一定的比例( gain ,增益)降低 噪声 的振幅,最终的结果会有更好的细节。这项技术叫“分形布朗运动(fractal Brownian Motion)”( fBM ),或者“分形噪声(fractal noise)”

这一篇我们将自己创建一个布朗运动,通过分型布朗运动改进噪音算法,下面我们创建一个静态的工具类。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class Utils {
    // 分形布朗运动函数,静态方法方便从外部调用
    //要在热点地图中传递一个位置x,y,
    public static float fBM(float x, float y, int oct, float persistance)
        float total = 0;
        float frequency = 1;//频率是波的紧密程度,一个八度(octave)对应着频率上的加倍或减半
        float amplitude = 1;//振幅
        float maxValue = 0;
        for (int i = 0; i < oct; i++)//遍历每个八度
            total += Mathf.PerlinNoise(x * frequency, y * frequency) * amplitude;//通过循环叠加噪声
            maxValue += amplitude;//最大值是每个oct使用的振幅相加
            amplitude *= persistance;//以一定的比例降低噪声的振幅
            frequency *= 2;//以一定的倍数连续升高频率
        return total / maxValue;//注意返回值降到0到1之间的范围内

自定义地形脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Linq;
using UnityEditor;
public class CustomTerrain : MonoBehaviour {
    //首先,我们需要一些值来存储缩放值,而这些是我们将其发送到噪声函数以确定幅度的间隔,
    //如上一篇所讲,随着增量值的变大,噪音曲线将变得更加平滑
    //PERLIN NOISE ----------------------------------------------
    public float perlinXScale = 0.01f;
    public float perlinYScale = 0.01f;
    //地形整体沿X和y偏移
    public int perlinOffsetX = 0;
    public int perlinOffsetY = 0;
    //分型布朗运动新增属性
    public int perlinOctaves = 3;
    public float perlinPersistance = 8;
    public float perlinHeightScale = 0.09f;
    //获取地形(物体)对象
    public Terrain terrain;
    //TerrainData里有地形所有的数据
    public TerrainData terrainData;
    //每次编辑完脚本内容返回编辑器时运行后会执行此方法
    private void OnEnable()
        //初始化地形数据 先获取地形再获取本身的地形数据
        terrain = gameObject.GetComponent<Terrain>();
        terrainData = Terrain.activeTerrain.terrainData;
    public void Perlin()
        float[,] heightMap = terrainData.GetHeights(0, 0, terrainData.heightmapWidth,
                                                terrainData.heightmapHeight);
        for (int y = 0; y < terrainData.heightmapHeight; y++)
            for (int x = 0; x < terrainData.heightmapWidth; x++)
                //heightMap[x, y] = Mathf.PerlinNoise((x + perlinOffsetX) * perlinXScale,
                //                                    (y + perlinOffsetY) * perlinYScale);
                //分型布朗运动
                heightMap[x, y] += Utils.fBM((x + perlinOffsetX) * perlinXScale,
                                               (y + perlinOffsetY) * perlinYScale,
                                               perlinOctaves,
                                               perlinPersistance) * perlinHeightScale;
        terrainData.SetHeights(0, 0, heightMap);

编辑脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(CustomTerrain))]
public class CustomTerrainEditor : Editor {
    SerializedProperty perlinXScale;
    SerializedProperty perlinYScale;
    SerializedProperty perlinOffsetX;
    SerializedProperty perlinOffsetY;
    //分型布朗运动新增属性
    SerializedProperty perlinOctaves;
    SerializedProperty perlinPersistance;
    SerializedProperty perlinHeightScale;
    bool showPerlinNoise = false;
    private void OnEnable()
        //找到需要反复更改的属性
        //地形幅度大小缩放值
        perlinXScale = serializedObject.FindProperty("perlinXScale");
        perlinYScale = serializedObject.FindProperty("perlinYScale");
        //地形偏移量
        perlinOffsetX = serializedObject.FindProperty("perlinOffsetX");
        perlinOffsetY = serializedObject.FindProperty("perlinOffsetY");
        //分型布朗运动新增属性
        perlinOctaves = serializedObject.FindProperty("perlinOctaves");
        perlinPersistance = serializedObject.FindProperty("perlinPersistance");
        perlinHeightScale = serializedObject.FindProperty("perlinHeightScale");
    //绘制编辑面板
    public override void OnInspectorGUI()
        //更新所有序列化的值
        serializedObject.Update();
        //获取自定义的地形属性脚本组件
        CustomTerrain terrain = (CustomTerrain)target;
        #region     
        showPerlinNoise = EditorGUILayout.Foldout(showPerlinNoise, "Single Perlin Noise");
        if (showPerlinNoise)
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
            GUILayout.Label("Perlin Noise", EditorStyles.boldLabel);
            EditorGUILayout.Slider(perlinXScale, 0, 1, new GUIContent("X Scale"));
            EditorGUILayout.Slider(perlinYScale, 0, 1, new GUIContent("Y Scale"));
            EditorGUILayout.IntSlider(perlinOffsetX, 0, 10000, new GUIContent("Offset X"));
            EditorGUILayout.IntSlider(perlinOffsetY, 0, 10000, new GUIContent("Offset Y"));
            EditorGUILayout.IntSlider(perlinOctaves, 1, 10, new GUIContent("Octaves"));
            EditorGUILayout.Slider(perlinPersistance, 0.1f, 10, new GUIContent("Persistance"));
            EditorGUILayout.Slider(perlinHeightScale, 0, 1, new GUIContent("Height Scale"));
            if (GUILayout.Button("Perlin"))
                terrain.Perlin();
        #endregion
        //应用发生的所有更改
        serializedObject.ApplyModifiedProperties();
 在纯Python中模拟短分数布朗运动(FBM)轨迹
快速模拟许多FBM轨迹的简单工具。 该存储库使用基于Riemann-Liouville积分的FBM版本,而不是Mandelbrot基于Weyl积分的版本。 在数值上,通过FBM协方差矩阵的Cholesky分解过滤高斯白噪声来实现仿真。
扩散系数的种类
fbm_sim使用扩散系数的两个不同参数化之一。 有关每种类型的说明,请参见笔记本的definitions.ipynb 。
	import fbm_sim
	# Create the simulator object
	fbm_obj = fbm_sim.FractionalBrownianMotion(
		128,         # simulate 128 steps of this FBM
		0.6,         # Hurst parame
                                    在上面的代码中,我们通过TileMap来生成地图的板块,并随机生成不同种类的TileBase。同时,在生成新地图时,我们需要将玩家的位置移动到新地图的起始点。此外,我们还需要在场景中将玩家添加到一个新的对象上并恰当地配置他的Avatar,以及将Tilemap添加到TileMapGenerator的对象上。当玩家走到地图的边缘时,协程会自动添加新的地图板块,让玩家可以继续探索地图。4.利用unity的协程特性,在游戏运行的过程中,不停地在场景中添加新的地图板块,以组成一个无限的地图。
我们来套用 unity的常规移动方案 的话
1.Transform.Translate;
常规的移动方案,向前走,在斜坡的状态下,人物会嵌入地面,然后再由物理系统把人弹出地面碰撞,
就会出现人物上下抖动,摄像机如果是挂在人物节点下面 跟随移动,那估计得眼花了
2.Rigidbody.MovePosition
3.Rigidbody.AddForce
物理移动方案,是在不规则地形时比较好用的方案,但是实际使用的时候会发
2 在场景中创建一个空物体,命名为Mesh,挂上PolygonDrawer组件
3 在Mesh物体下创建N个Sphere
4 创建一个材质球,选择你需要的shader,比如下文用的是Unlit/Color,并且调整了颜色为蓝色
5 把材质球赋值给PolygonDrawer组件
6 把N个Sphere赋值给PolygonDrawer
一、分形布朗运动FBM
分形布朗运动(Fractal Brownian Motion)也就是fbm,它不是噪声,但是他可以让噪声有更多的细节。可以看成把不同比例位置的一张噪声合并在一起。
通过添加不同的噪声迭代(octaves),我们以规则的步长(lacunarity)连续增加频率并降低噪声的幅度(增益),我们可以获得更精细的噪声粒度并获得更精细的细节。这种技术称为“分形布朗运动”(FBM),或简称为“分形噪声”。
具体原理可参照thebookofshaders一书详细简介。
二、raymarc.
Part 1 Terrain基础:
Terrain可以改变地形,Plane不可以改变
创建方法:在Hierarchy窗口中右键,选择3D Object 一栏下,选择Terrain,则生成平整地形Terrain
Part 2 Terrain功能栏
从左到右分别是:  画笔...
if (screenList[i].activeSelf == true)
Bounds bounds = screenList[i].GetComponent().mesh.bounds;
float x = bounds.size.x * screenList[i].transform.localScale.x;
//  float y = bounds.si
                                    转载自:http://blog.csdn.net/u010019717             起这个标题完全是为了区分于 《Unity 关于UGUI不规则图片响应区域解决方法》          最近看到 《Unity 关于NGUI不规则图片响应区域解决方法》    之所以要记录这个也是多自己之前项目的一个总结, 看看那里不好, 该怎么解决!。  我们卡牌游戏就是 UGUI + spine   ...
转载:https://www.cnblogs.com/msxh/p/9283266.html
设置好图片的属性,勾选Advanced下的Read/Write Enabled,将Mesh Type格式设置为Full Rect,而unity导入时默认帮我们设置的是Tight模式。
用Tight模式的话,如果你的图片周围有空白像素,它会帮你压缩掉减小面积,以减少DrawCall,但是会增加Sprite的面数。如果用Full Rect模式不会压缩,也不会增加面数.
                                    本教程用到的工具:Cocos2d-x 3.7、Unity插件Ferr2D Terrain Tool 1.0.8
热爱技术的童鞋可以来[Cocos2d-x/Unity/AR讨论QQ群],点击加入 238998262
原理:将Unity的优势为Cocos2d-x所用。使用Unity强大插件轻松拖出复杂2D地形,然后将地形点导出到plist文件给Cocos2d-x​使用。
效果如图:​
                                    分形布朗运动FBM(Fractal Brown Motion)是1968年Mandelbrot和Ness两人提出的一种数学模型,它主要用于描述自然界的山脉、云层、地形地貌以及模拟星球表面等不规则形状阶。
布朗运动是1827年英国植物学家R.Brown发现的,它是一种随机运动,粒子的运动方向随时改变,其运动轨迹是一条无规则的折线,不受什么约束和支配。
opengl中使用fbm
//-------------------------------------------------------------