Пример #1
0
        public override float[,,] getValues(float[,,] values, Noise3D.noiseSumFunction sumFunc, Point3 samples, Vector3 origin, Vector3 area)
        {
            values = new float[samples.X, samples.Y, samples.Z];

            for (int i = 0; i < noises.Count; i++)
            {
                noises[i].getValues(values, sumFunctions[i], samples, origin, area);
            }

            Vector3 position = new Vector3();
            Vector3 step     = new Vector3(area.X / (samples.X - 1), area.Y / (samples.Y - 1), area.Z / (samples.Z - 1));

            for (int i = 0; i < values.GetLength(0); i++)
            {
                for (int j = 0; j < values.GetLength(1); j++)
                {
                    for (int k = 0; k < values.GetLength(2); k++)
                    {
                        position.X = i * step.X + origin.X;
                        position.Y = j * step.Y + origin.Y;
                        position.Z = k * step.Z + origin.Z;

                        values[i, j, k] = filter(values[i, j, k], position);
                    }
                }
            }

            return(values);
        }
Пример #2
0
        public static Noise3D RegularNoise(float period, int steps, Point3 periodLoop, int seed)
        {
            if (steps == 0)
            {
                throw new Exception("Can't create a noise regular noise with 0 steps");
            }

            SumNoise3D sumNoise = new SumNoise3D();
            Random     rdm      = new Random(seed);

            LoopableNoise3D noise;

            float[] weights = new float[steps];
            weights[0] = 0.5f;
            float weightSum = 0.5f;

            for (int i = 1; i < steps; i++)
            {
                weights[i] = weights[i - 1] * 0.5f;
                weightSum += weights[i];
            }

            //float weight;
            Noise3D.noiseSumFunction simpleSum = (float a, float b) => { return(a + b); };
            for (int j = 0; j < steps; j++)
            {
                noise = new LoopableNoise3D(rdm.Next(), period, periodLoop);
                float weight = weights[j] / weightSum;
                noise.filter = (float value, Vector3 position) => { return(value * (weight)); };

                sumNoise.addNoise(noise, simpleSum);


                period       *= 0.5f;
                periodLoop.X *= 2;
                periodLoop.Y *= 2;
                periodLoop.Z *= 2;
            }

            return(sumNoise);
        }
Пример #3
0
        public override float[,,] getValues(float[,,] values, Noise3D.noiseSumFunction sumFunc, Point3 samples, Vector3 origin, Vector3 area)
        {
            origin *= 1f / period;
            area   *= 1f / period;


            float   difX, difY, difZ;
            Vector3 difVector = new Vector3();
            Vector3 step = new Vector3(area.X / (samples.X - 1), area.Y / (samples.Y - 1), area.Z / (samples.Z - 1));
            Vector3 pos = new Vector3();
            int     cubeX, cubeY, cubeZ;
            Vector3 gradientVector;
            float   lll, llu, lul, luu, ull, ulu, uul, uuu;
            float   ll, lu, ul, uu;
            float   l, u;
            float   value;

            for (int i = 0; i < samples.X; i++)
            {
                for (int j = 0; j < samples.Y; j++)
                {
                    for (int k = 0; k < samples.Z; k++)
                    {
                        pos.X = origin.X + i * step.X;
                        pos.Y = origin.Y + j * step.Y;
                        pos.Z = origin.Z + k * step.Z;

                        cubeX = (int)Math.Floor(pos.X);
                        cubeY = (int)Math.Floor(pos.Y);
                        cubeZ = (int)Math.Floor(pos.Z);

                        difX = pos.X - (float)cubeX;
                        difY = pos.Y - (float)cubeY;
                        difZ = pos.Z - (float)cubeZ;

                        pos *= period;


                        //lll llu luu  lul uul uuu ulu ull
                        //lll
                        difVector.X    = difX;
                        difVector.Y    = difY;
                        difVector.Z    = difZ;
                        gradientVector = getGradientVector(cubeX, cubeY, cubeZ);
                        Vector3.Dot(ref gradientVector, ref difVector, out lll);

                        //llu
                        difVector.Z    = difZ - 1f;
                        gradientVector = getGradientVector(cubeX, cubeY, cubeZ + 1);
                        Vector3.Dot(ref gradientVector, ref difVector, out llu);

                        //luu
                        difVector.Y    = difY - 1f;
                        gradientVector = getGradientVector(cubeX, cubeY + 1, cubeZ + 1);
                        Vector3.Dot(ref gradientVector, ref difVector, out luu);

                        //lul
                        difVector.Z    = difZ;
                        gradientVector = getGradientVector(cubeX, cubeY + 1, cubeZ);
                        Vector3.Dot(ref gradientVector, ref difVector, out lul);

                        //uul
                        difVector.X    = difX - 1f;
                        gradientVector = getGradientVector(cubeX + 1, cubeY + 1, cubeZ);
                        Vector3.Dot(ref gradientVector, ref difVector, out uul);

                        //uuu
                        difVector.Z    = difZ - 1f;
                        gradientVector = getGradientVector(cubeX + 1, cubeY + 1, cubeZ + 1);
                        Vector3.Dot(ref gradientVector, ref difVector, out uuu);

                        //ulu
                        difVector.Y    = difY;
                        gradientVector = getGradientVector(cubeX + 1, cubeY, cubeZ + 1);
                        Vector3.Dot(ref gradientVector, ref difVector, out ulu);

                        //ull
                        difVector.Z    = difZ;
                        gradientVector = getGradientVector(cubeX + 1, cubeY, cubeZ);
                        Vector3.Dot(ref gradientVector, ref difVector, out ull);

                        ll = NGInterp(lll, ull, difX);
                        lu = NGInterp(llu, ulu, difX);
                        ul = NGInterp(lul, uul, difX);
                        uu = NGInterp(luu, uuu, difX);

                        l = NGInterp(ll, ul, difY);
                        u = NGInterp(lu, uu, difY);

                        value           = NGInterp(l, u, difZ);
                        value           = (float)Math.Cos((value + 1) * Math.PI / 2);
                        values[i, j, k] = sumFunc(values[i, j, k], filter(value, pos));
                    }
                }
            }

            return(values);
        }