আমি এক্সএনএ-তে একটি মাইনক্রাফ্টের মতো ইঞ্জিন তৈরি করছি। আমি যা করতে চাই তা হ'ল এই ভিডিওতে দেখানো মতই ভাসমান দ্বীপগুলি তৈরি করা:
http://www.youtube.com/watch?v=gqHVOEPQK5g&feature=related
বিশ্ব জেনারেটর ব্যবহার করে আমি কীভাবে এটি প্রতিলিপি করব? আমাকে কি কিছু পার্লিন শব্দ শোনার অ্যালগরিদম ব্যবহার করতে হবে? আমি জানি না যে কীভাবে এটি আমাকে ভূমি জনসাধারণের মতো করতে সহায়তা করবে।
আমি যে পার্লিন শব্দ শব্দটি ব্যবহার করছি তার জন্য কোড এখানে রয়েছে:
private double[,] noiseValues;
private float amplitude = 1; // Max amplitude of the function
private int frequency = 1; // Frequency of the function
/// <summary>
/// Constructor
/// </summary>
///
public PerlinNoise(int freq, float _amp)
{
Random rand = new Random(System.Environment.TickCount);
noiseValues = new double[freq, freq];
amplitude = _amp;
frequency = freq;
// Generate our noise values
for (int i = 0; i < freq; i++)
{
for (int k = 0; k < freq; k++)
{
noiseValues[i, k] = rand.NextDouble();
}
}
}
/// <summary>
/// Get the interpolated point from the noise graph using cosine interpolation
/// </summary>
/// <returns></returns>
public double getInterpolatedPoint(int _xa, int _xb, int _ya, int _yb, double x, double y)
{
double i1 = interpolate(
noiseValues[_xa % Frequency, _ya % frequency],
noiseValues[_xb % Frequency, _ya % frequency]
, x);
double i2 = interpolate(
noiseValues[_xa % Frequency, _yb % frequency],
noiseValues[_xb % Frequency, _yb % frequency]
, x);
return interpolate(i1, i2, y);
}
public static double[,] SumNoiseFunctions(int width, int height, List<PerlinNoise> noiseFunctions)
{
double[,] summedValues = new double[width, height];
// Sum each of the noise functions
for (int i = 0; i < noiseFunctions.Count; i++)
{
double x_step = (float)width / (float)noiseFunctions[i].Frequency;
double y_step = (float)height / (float)noiseFunctions[i].Frequency;
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
int a = (int)(x / x_step);
int b = a + 1;
int c = (int)(y / y_step);
int d = c + 1;
double intpl_val = noiseFunctions[i].getInterpolatedPoint(a, b, c, d, (x / x_step) - a, (y / y_step) - c);
summedValues[x, y] += intpl_val * noiseFunctions[i].Amplitude;
}
}
}
return summedValues;
}
/// <summary>
/// Get the interpolated point from the noise graph using cosine interpolation
/// </summary>
/// <returns></returns>
private double interpolate(double a, double b, double x)
{
double ft = x * Math.PI;
double f = (1 - Math.Cos(ft)) * .5;
// Returns a Y value between 0 and 1
return a * (1 - f) + b * f;
}
public float Amplitude { get { return amplitude; } }
public int Frequency { get { return frequency; } }
তবে বিষয়টি হ'ল কোডটির লেখক শব্দটি উত্পন্ন করতে নিম্নলিখিতটি ব্যবহার করেন এবং আমি এটি কমপক্ষে বুঝতে পারি না।
private Block[, ,] GenerateLandmass()
{
Block[, ,] blocks = new Block[300, 400, 300];
List<PerlinNoise> perlins = new List<PerlinNoise>();
perlins.Add(new PerlinNoise(36, 29));
perlins.Add(new PerlinNoise(4, 33));
double[,] noisemap = PerlinNoise.SumNoiseFunctions(300, 300, perlins);
int centrey = 400 / 2;
for (short x = 0; x < blocks.GetLength(0); x++)
{
for (short y = 0; y < blocks.GetLength(1); y++)
{
for (short z = 0; z < blocks.GetLength(2); z++)
{
blocks[x, y, z] = new Block(BlockType.none);
}
}
}
for (short x = 0; x < blocks.GetLength(0); x++)
{
for (short z = 0; z < blocks.GetLength(2); z++)
{
blocks[x, centrey - (int)noisemap[x, z], z].BlockType = BlockType.stone;
}
}
//blocks = GrowLandmass(blocks);
return blocks;
}
এবং আমি যে সাইটটি ব্যবহার করছি তা এখানে: http://lotsacode.wordpress.com/2010/02/24/perlin-noise-in-c/ ।
এবং আমি মার্টিন সোজকার দ্বারা নির্দিষ্টভাবে পার্লিন শব্দের প্রয়োগ করার চেষ্টা করছি।
ঠিক আছে, তাই আমি এ পর্যন্ত এটি পেয়েছি: