[英]How do I apply perlin noise to a line renderer in unity?
我正在嘗試將 perlin 噪聲應用於統一 2d 中的線渲染器,這是我的代碼:
public class Ground : MonoBehaviour
{
private static bool seedGenerated;
public static float Seed;
public LineRenderer LineR;
public EdgeCollider2D col;
private Vector2[] points;
public int lengthOfLineRenderer;
public float scale = 20f;
public float OffsetX = 0;
public float OffsetY = 0f;
// Start is called before the first frame update
void Start()
{
if(!seedGenerated)
{
Seed = Random.Range(0f,9999f);
seedGenerated = true;
}
OffsetX = Seed + transform.position.x;
points = new Vector2[lengthOfLineRenderer * 10 + 1];
LineR.positionCount = lengthOfLineRenderer * 10 + 1;
for (float i = 0f; i < lengthOfLineRenderer; i += 0.1f)
{
LineR.SetPosition((int)Mathf.Round(i * 10), new Vector3(i,CalculateHeight(i),0.0f));
//points[(int)Mathf.Round(i*10)] = new Vector2(i,CalculateHeight(i));
}
LineR.SetPosition(100,new Vector3(10f,CalculateHeight(10f),0));
points[100] = new Vector2(10f,CalculateHeight(101));
col.points = points;
}
// Update is called once per frame
void Update()
{
}
float CalculateHeight(float x)
{
float width = lengthOfLineRenderer * 10;
float xCoord = x / width * scale + OffsetX;
return Mathf.PerlinNoise(xCoord,OffsetY);
}
}
位置應用正確,變量lengthOfLineRenderer
等於 10,因為我希望線的比例為 10,一切正常,但是當我在OffsetX
中生成另一條偏移量為 10 的線時,它們似乎大部分時間都沒有正確對齊,是我的代碼中的問題還是柏林噪聲方法中的問題?
讓我們做一些簡單的數學運算。 根據您的描述,我們有:
lengthOfLineRenderer = 10
scale = 10
width = lengthOfLineRenderer * 10
= 100
第一行的最后一點是:
xCoord = 10f / width * scale + OffsetX
= 10f / 100 * 10 + OffsetX
= 1 + OffsetX
第二行的第一個點(在 OffsetX 中有 10 個不同的偏移量)是:
xCoord = 0f / width * scale + OffsetX + 10
= OffsetX + 10
顯然1 + OffsetX != OffsetX + 10
,所以要使它們相等,您需要scale = 100
。
這是我修復了一些東西的新代碼:
private static bool seedGenerated;
public static float Seed;
public LineRenderer LineR;
public EdgeCollider2D col;
private Vector2[] points;
public int lengthOfLineRenderer;
public float scale;
public float OffsetX = 0;
public float OffsetY = 0f;
public float frequency;
// Start is called before the first frame update
void Start()
{
if(!seedGenerated)
{
Seed = Random.Range(0,9999);
seedGenerated = true;
}
OffsetX = Seed + transform.position.x;
points = new Vector2[lengthOfLineRenderer * 10+1 ];
LineR.positionCount = lengthOfLineRenderer * 10+1 ;
for (float i = 0f; i < lengthOfLineRenderer+0.1f; i += 0.1f)
{
LineR.SetPosition((int)Mathf.Round(i * 10), new Vector3(i,CalculateHeight(i) * frequency,0.0f));
points[(int)Mathf.Round(i*10)] = new Vector2(i,CalculateHeight(i) * frequency);
}
col.points = points;
}
// Update is called once per frame
void Update()
{
}
float CalculateHeight(float x)
{
float width = lengthOfLineRenderer * 10;
float xCoord = x / width * scale + OffsetX;
return Mathf.PerlinNoise(xCoord,OffsetY);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.