@H_404_1@
我正试图在我的XNA游戏中实现改进的噪音,但我的改进的噪音功能保持返回0.0f.它与Ken Perlin(
http://mrl.nyu.edu/~perlin/noise/)的代码完全相同,只是移植到C#.
我已经尝试重写类,甚至直接从站点复制和粘贴(然后移植到C#,当然),但它不会输出任何值,而是0.
这是我正在使用的代码:
public class PerlinNoise { private int[] permutations = new int[512]; private Random random; public PerlinNoise() : this(Environment.TickCount) { } public PerlinNoise(int seed) { random = new Random(seed); for (int i = 0; i < 256; i++) { permutations[i] = i; } for (int i = 0; i < 256; i++) { int k = random.Next(256 - i) + i; int l = permutations[i]; permutations[i] = permutations[k]; permutations[k] = l; permutations[i + 256] = permutations[i]; } } private int fastfloor(float x) { return x > 0 ? (int)x : (int)x - 1; } private float fade(float t) { return t * t * t * (t * (t * 6 - 15) + 10); } private float lerp(float t,float a,float b) { return a + t * (b - a); } public float grad(int hash,float x,float y,float z) { int h = hash & 15; float u = h < 8 ? x : y,v = h < 4 ? y : h == 12 || h == 14 ? x : z; return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); } public float noise3d(float x,float z) { int X = fastfloor(x) & 0xff,Y = fastfloor(y) & 0xff,Z = fastfloor(z) & 0xff; x -= fastfloor(x); y -= fastfloor(y); z -= fastfloor(z); float u = fade(x); float v = fade(y); float w = fade(z); int A = permutations[X] + Y,AA = permutations[A] + Z,AB = permutations[A + 1] + Z,B = permutations[X + 1] + Y,BA = permutations[B] + Z,BB = permutations[B + 1] + Z; return lerp(w,lerp(v,lerp(u,grad(permutations[AA],x,y,z),grad(permutations[BA],x - 1,z)),grad(permutations[AB],y - 1,grad(permutations[BB],z))),grad(permutations[AA + 1],z - 1),grad(permutations[BA + 1],z - 1)),grad(permutations[AB + 1],grad(permutations[BB + 1],z - 1)))); } public float noise2d(float x,float y) { return noise3d(x,0f); } } `
为了测试它,我只是做了:
string[] args = Console.ReadLine().Split(' '); PerlinNoise noise = new PerlinNoise(); int x = args[0]; int y = args[1]; int z = args[2]; Console.WriteLine(noise.noise3d(x,z));
正如我上面所说,它总是输出0.
解决方法
如果所有参数都是整数,它似乎输出0.0f.将您的测试代码更改为
var input = Console.ReadLine() .Split(' ') .Select(s => float.Parse(s,System.Globalization.CultureInfo.InvariantCulture)) .ToArray();
并尝试输入,例如,4234.2123 3123.12312 423.2434.
我不太确定它是否是所希望的行为,但是
x -= Math.Floor(x); // FIND RELATIVE X,Y,Z y -= Math.Floor(y); // OF POINT IN CUBE. z -= Math.Floor(z);
将永远制作x,y&如果它们是整数,则z = 0;淡入淡出(0.0f)也始终为零.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。