FLOAT32 CFrmPerlin::TileableNoise3(const FLOAT32 x, const FLOAT32 y, const FLOAT32 z, const FLOAT32 w, const FLOAT32 h, const FLOAT32 d) { return ( Noise3( x, y, z ) * ( w - x ) * ( h - y ) * ( d - z ) + Noise3( x - w, y, z ) * x * ( h - y ) * ( d - z ) + Noise3( x, y - h, z ) * ( w - x ) * y * ( d - z ) + Noise3( x - w, y - h, z ) * x * y * ( d - z ) + Noise3( x, y, z - d ) * ( w - x ) * ( h - y ) * z + Noise3( x - w, y, z - d ) * x * ( h - y ) * z + Noise3( x, y - h, z - d ) * ( w - x ) * y * z + Noise3( x - w, y - h, z - d ) * x * y * z ) / ( w * h * d ); }
float PerlinNoiseTurbulence::Turbulence3(float fX, float fY, float fZ, float fFreq) { float t = 0.0f; do { t += Noise3(fFreq*fX, fFreq*fY, fFreq*fZ)/fFreq; fFreq *= 0.5f; } while (fFreq >= 1.0f); return t; }
FLOAT32 CFrmPerlin::Turbulence3( const FLOAT32 x, const FLOAT32 y, const FLOAT32 z, FLOAT32 fFreq ) { FLOAT32 t = 0.0f; do { t += Noise3(fFreq * x, fFreq * y, fFreq * z) / fFreq; fFreq *= 0.5f; } while (fFreq >= 1.0f); return t; }
// 타뷸런스는 진폭의 변화폭을 결정한다.. float GNoise::Turbulence(float *v, float freq) { float t, vec[3]; for (t = 0. ; freq >= 1. ; freq /= 2) { vec[0] = freq * v[0]; vec[1] = freq * v[1]; vec[2] = freq * v[2]; t += fabs(Noise3(vec)) / freq; } return t; }
float GNoise::Noise(float vec[], int len) { switch (len) { case 0: return 0.; case 1: return Noise1(vec[0]); case 2: return Noise2(vec); default: return Noise3(vec); } }
/*! * Multiband Noise 3D * @param[in] * @return */ RXREAL rxWaveletNoise::MultibandNoise3(RXREAL p[3], RXREAL s, RXREAL *normal, int firstBand, int nbands, RXREAL *w) { RXREAL q[3], result = 0, variance = 0; for(int b = 0; b < nbands && s+firstBand+b < 0; ++b){ for(int i = 0; i < 3; ++i){ q[i] = 2*p[i]*pow((RXREAL)2.0, (RXREAL)(firstBand+b)); } result += (normal) ? w[b]*ProjectedNoise(q, normal) : w[b]*Noise3(q); } for(int b = 0; b < nbands; ++b){ variance += w[b]*w[b]; } // Adjust the noise so it has a variance of 1. if(variance) result /= sqrt(variance*((normal) ? 0.296 : 0.210)); return result; }