рд╕рд╣рдЬ рд╢реЛрд░ рдирдХреНрд╢реЗ рдмрдирд╛рдПрдБ

рдЫрд╡рд┐

рдлрд╝реЛрдЯреЛрд╢реЙрдк рдореЗрдВ рдПрдХ рд╕рд╣рдЬ рдЫрд╡рд┐ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ: рдЫрд╡рд┐ рдХреЛ рдХреНрд░реЙрдк рдХрд░реЗрдВ, рдЫрдВрдЯрдиреА рдХреА рдЧрдИ рджрд╛рдПрдВ рдФрд░ рдирд┐рдЪрд▓реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдкрдХрдбрд╝реЗрдВ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдлреАрдбреЗ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдИрдВ рдФрд░ рд╢реАрд░реНрд╖ рдкрд░ рдЧреЛрдВрдж рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рд╕рд╣рдЬ рд╢реЛрд░ рдирдХреНрд╢реЛрдВ рдХреЗ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЛ рдкреЗрд░рд▓рд┐рди рдХреЗ рд╢реЛрд░ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭ рд╣реИ , рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рджреЛ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЖрдпрд╛рдо рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЪрд▓рддреА рд╣реИ), рддреАрди рдЖрдпрд╛рдореЛрдВ (3 рдбреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреЗрд▓рдирд╛рдХрд╛рд░ рдФрд░ рдЧреЛрд▓рд╛рдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди) рдореЗрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЪрд╛рд░ рдпрд╛ рдкрд╛рдВрдЪ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рднреАред

рд╕рд╣рдЬ 2 рдбреА рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░-рдЖрдпрд╛рдореА рд╢реЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЪрд╛рд░ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдмрд╣реБрдд рдЖрдо рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдЖрдпрд╛рдо рд▓реЗрдВрдЧреЗред

рдореЗрдВ рдореЗрд░реА рдЙрджрд╛рд╣рд░рдг, рдореИрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рджреЛ рд╕рдкреНрддрдХ рд╕рд┐рдВрдкреНрд▓реЗрдХреНрд╕ рд╢реЛрд░ ред рд╕рд┐рдореНрдкреНрд▓реЗрдХреНрд╕ рд╢реЛрд░ рдмрдбрд╝реЗ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рддреЗрдЬ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рддреНрд░рд┐рдХреЛрдгреАрдп рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИред

рдореИрдВрдиреЗ drawNoiseрдПрдХ рдХреИрдирд╡рд╛рд╕ рдмрдирд╛рдиреЗ рдФрд░ рдПрдХ рд▓реВрдк рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдПрд░реЗ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ ред

рдПрдХ рдЖрдпрд╛рдореА рд╕рд╣рдЬ рд╢реЛрд░


рдПрдХ рдЖрдпрд╛рдо рдореЗрдВ, рд╢реЛрд░ рдПрдХ рдЕрдирдВрдд рдЪрд┐рдХрдиреА рд░реЗрдЦрд╛ рд╣реИ (рдореЗрд░реЗ рд╢реЛрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)ред рдпрд╣рд╛рдБ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рдХреЗрд╡рд▓ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВред

// one dimensional line
fNoiseScale = .02;
drawNoise(function(i,x,y){
    var v = Simplex.noise(
         123+x*fNoiseScale
        ,137 // we just need one dimension so this parameter is a constant
    );
    return v*iSize>y?255:0;
}).img();


рдПрдХ-рдЖрдпрд╛рдореА рд╢реЛрд░

рдЖрдк рдПрдиреАрдореЗрд╢рди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд░ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рд╢реЛрд░ рдореВрд▓реНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рд▓реВрдк рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдКрдкрд░ рдХреА рдЫрд╡рд┐ рдореЗрдВ рдорд╛рди рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд▓реВрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдПрдХ рдФрд░ рдЖрдпрд╛рдо рдФрд░ рд▓реВрдк ... рдпрд╛ рд╕рд░реНрдХрд▓, рдЙрд╕рдХреЗ рд▓рд┐рдПред

рдПрдХ рдЖрдпрд╛рдореА рд▓реВрдк


рдЖрдк рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП, рдкреЗрд░реНрд▓рд┐рди рдХрд╛ рд╢реЛрд░ рдиреАрдЪреЗ рдХреА рдЫрд╡рд┐ рдЬреИрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрддрд╛ рд╣реИред


рдпрджрд┐ рд╣рдо рдпрд╣рд╛рдБ рдПрдХ рд╡реГрддреНрдд рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╡реГрддреНрдд рдкрд░ рд╢реЛрд░ рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдЖрдпрд╛рдореА рд▓реВрдк рдорд┐рд▓реЗрдЧрд╛ред


рдПрдХ-рдЖрдпрд╛рдореА рд▓реВрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░реНрдХрд▓ рдХреЗ рд╕рд╛рде рд╢реЛрд░ред

рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

// one dimensional loop
drawNoise(function(i,x,y){
    var fNX = x/iSize // we let the x-offset define the circle
        ,fRdx = fNX*2*Math.PI // a full circle is two pi radians
        ,a = fRdsSin*Math.sin(fRdx)
        ,b = fRdsSin*Math.cos(fRdx)
        ,v = Simplex.noise(
             123+a*fNoiseScale
            ,132+b*fNoiseScale
        )
    ;
    return v*iSize>y?255:0;
}).img().div(2);


рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рд╕рдордЭ рдЧрдП рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рджреЛ-рдЖрдпрд╛рдореА рдЫрд╡рд┐ рдХреЛ рд▓реВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреАрди-рдЖрдпрд╛рдореА (рдХрдо рд╕реЗ рдХрдо) рд╢реЛрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдмреЗрд▓рдирд╛рдХрд╛рд░ рдХрд╛рд░реНрдб


рд╢реЛрд░ рдкреЗрд░рд▓рд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ 3 рдбреА-рдЯреЗрдХреНрд╕рдЪрд░рд┐рдВрдЧ (рдлрд┐рд▓реНрдо "рдЯреНрд░реЙрди") рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЫрд╡рд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рд┐рдкрдЯреА рд╣реБрдИ рдХрд╛рдЧрдЬрд╝ рдХреА рд╢реАрдЯ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреА рдЧрдгрдирд╛ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╢реЛрд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд╛рдЯрддреЗ рд╕рдордп, рд╣рдо рдЕрднреА рднреА рдирдП рдмрдирд╛рдП рдЧрдП рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рдирдХреНрд╢реЗ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд░реНрдмрд╛рдз рдЫрд╡рд┐ рдХреЗ рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд╣рд▓реЗ рдПрдХ рдРрд╕реА рдЫрд╡рд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рд╕реЗ рдЬреБрдбрд╝рддреА рд╣реИред рдпрд╣ рдПрдХ рдЖрдпрд╛рдореА рд▓реВрдк рдХреЗ рд▓рд┐рдП рджреЛ-рдЖрдпрд╛рдореА рд╕рд░реНрдХрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдпрд╛рдо рдХреЗ рд╕рд╛рде: рдПрдХ рд╕рд┐рд▓реЗрдВрдбрд░ред

// three dimensional cylindrical map
drawNoise(function(i,x,y){
    var fNX = x/iSize
        ,fRdx = fNX*2*Math.PI
        ,a = fRdsSin*Math.sin(fRdx)
        ,b = fRdsSin*Math.cos(fRdx)
        ,v = Simplex.noise(
             123+a*fNoiseScale
            ,132+b*fNoiseScale
            ,312+y*fNoiseScale // similar to the one dimensional loop but we add a third dimension defined by the image y-offset
        )
    ;
    return v*255<<0;
}).img().div(2);


рдмреЗрд▓рдирд╛рдХрд╛рд░ рд╢реЛрд░ рдирдХреНрд╢рд╛

рдЧреЛрд▓рд╛рдХрд╛рд░ рдирдХреНрд╢рд╛ рдЫрд╡рд┐


рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╣рдЬ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЛрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЧрд▓рдд рд╣реИрдВред

рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЧреЛрд▓рд╛рдХрд╛рд░ рдЫрд╡рд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

// three dimensional spherical map
document.body.addChild('h2').innerText = 'three dimensional spherical map';
fNoiseScale = .1;
var oSpherical = drawNoise(function(i,x,y){
    var  fNX = (x+.5)/iSize // added half a pixel to get the center of the pixel instead of the top-left
        ,fNY = (y+.5)/iSize
        ,fRdx = fNX*2*Math.PI
        ,fRdy = fNY*Math.PI // the vertical offset of a 3D sphere spans only half a circle, so that is one Pi radians
        ,fYSin = Math.sin(fRdy+Math.PI) // a 3D sphere can be seen as a bunch of cicles stacked onto each other, the radius of each of these is defined by the vertical position (again one Pi radians)
        ,a = fRdsSin*Math.sin(fRdx)*fYSin
        ,b = fRdsSin*Math.cos(fRdx)*fYSin
        ,c = fRdsSin*Math.cos(fRdy)
        ,v = Simplex.noise(
             123+a*fNoiseScale
            ,132+b*fNoiseScale
            ,312+c*fNoiseScale
        )
    ;
    return v*255<<0;
}).img();


рдЧреЛрд▓рд╛рдХрд╛рд░ рд╢реЛрд░ рдХрд╛ рдирдХреНрд╢рд╛


рд╢реЛрд░ рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░

рдШрди рдордиреЛрд░рдо рдирдХреНрд╢рд╛


рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдЧреЛрд▓реЗ рдХреЛ рдкреИрдиреЛрд░рдорд╛ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЧреЛрд▓реЗ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдХреИрдорд░рд╛ рд░рдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдПрдХ рдХреНрдпреВрдмрд┐рдХ рдкреИрдиреЛрд░рдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЪреЗрд╣рд░реЗ рд╣реИрдВред рдЧреЛрд▓реЗ рдХреЛ рдХреНрдпреВрдм рдХреЗ рдЫрд╣ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕реНрдХреЗрдЪ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдХреНрдпреВрдм рдкрд░ рдПрдХ рдЧреЛрд▓реЗ рдХреЛ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдирд╛ рдХреНрдпреВрдм

рдХреА рд╕рддрд╣ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрдВрджреНрд░ рдФрд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реА рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рд╣рдо рд╕реАрдП рд▓рд╛рдЗрди рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╡реИрдХреНрдЯрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдирдХреА рджрд┐рд╢рд╛ рди рдмрджрд▓реЗ, рд▓реЗрдХрд┐рди рд▓рдВрдмрд╛рдИ рдШрдЯ рдЬрд╛рддреА рд╣реИ 1. рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рд╕рднреА рд╡реИрдХреНрдЯрд░ рдПрдХ рд╕рд╛рде рдПрдХ рдЧреЛрд▓реЗ рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред

рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рднреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд╣рдореЗрдВ рдмрд╕ рд╡реЗрдХреНрдЯрд░ рдХреА рдХреБрд▓ рд▓рдВрдмрд╛рдИ рджреНрд╡рд╛рд░рд╛ xyz рджреНрд╡рд╛рд░рд╛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реЗрдХреНрдЯрд░ рдХреА рд▓рдВрдмрд╛рдИ рдкрд╛рдЗрдерд╛рдЧреЛрд░рд╕ рдкреНрд░рдореЗрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рдПрдХ рдЪреЗрд╣рд░реЗ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИред рдлрд┐рд░ рд╢реЛрд░ рдХреЛ рд╕рднреА рдЫрд╣ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд▓реЗ рдЪреЗрд╣рд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ xzz рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлреНрд▓рд┐рдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

// 3D panoramical cube map
document.body.addChild('h2').innerText = '3D panoramical cube map';
// we're not using the drawNoise function because our canvas is rectangular
var mCubemap = document.createElement('canvas')
    ,iW = 6*iSize;
mCubemap.width = iW;
mCubemap.height = iSize;
var  iHSize = iSize/2 // half the size of the cube
    ,oCtx = mCubemap.getContext('2d')
    ,oImgData = oCtx.getImageData(0,0,iW,iSize)
    ,aPixels = oImgData.data
    ,aa = 123
    ,bb = 231
    ,cc = 321
;
for (var i=0,l=iSize*iSize;i<l;i++) {
    var  x = i%iSize        // x position in image
        ,y = (i/iSize)<<0    // y position in image
        ,a = -iHSize + x+.5    // x position on the cube plane, the added .5 is to get the center of the pixel
        ,b = -iHSize + y+.5 // y position on the cube plane
        ,c = -iHSize        // z position of the cube plane
        ,fDistanceAB = Math.sqrt(a*a+b*b) // to calculate the vectors length we use Pythagoras twice
        ,fDistanceABC = Math.sqrt(fDistanceAB*fDistanceAB+c*c)
        ,fDrds = .5*fDistanceABC // adjust the distance a bit to get a better radius in the noise field
        ,v = 1
    ;
    a /= fDrds; // normalize the vector
    b /= fDrds; // normalize the vector
    c /= fDrds; // normalize the vector
    //
    // since we now know the spherical position for one plane we can derive the positions for the other five planes simply by switching the x, y and z values (the a, b and c variables)
    var aNoisePositions = [
         [a,b,c]    // back
        ,[-c,b,a]    // right
        ,[-a,b,-c]    // front
        ,[c,b,-a]    // left
        ,[a,c,-b]    // top
        ,[a,-c,b]    // bottom
    ];
    for (var j=0;j<6;j++) {
        v = Simplex.noise(
             aa + aNoisePositions[j][0]
            ,bb + aNoisePositions[j][1]
            ,cc + aNoisePositions[j][2]
        );
        var pos = 4*(y*iW+j*iSize+x); // the final position of the rgba pixel
        aPixels[pos] = aPixels[pos+1] = aPixels[pos+2] = v*255<<0;
        aPixels[pos+3] = 255;
    }
}
oCtx.putImageData(oImgData,0,0);
document.body.addChild('img',{src:mCubemap.toDataURL("image/jpeg")});

рдпрд╣рд╛рдБ рдПрдХ рдЫрд╡рд┐ рдореЗрдВ рдЫрд╣ рдкрдХреНрд╖ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдПрдХ рдШрди рд╕реЗ рджреЗрдЦрдиреЗ рдкрд░ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯред рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдереНрд░реА рдЬреЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ 3 рдбреА рдЙрджрд╛рд╣рд░рдг рд╣реИ ред


рдШрди рдордиреЛрд░рдо рдирдХреНрд╢рд╛


рдирд┐рд░реНрдмрд╛рдз 2D рдЫрд╡рд┐


рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╣рдЬ 2 рдбреА рдЫрд╡рд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдпрд╣ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЪрд╛рд░ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдХрдЯрддрдо рдЪреАрдЬ рдПрдХ рдмреЗрд▓рдирд╛рдХрд╛рд░ рдирдХреНрд╢рд╛ рдерд╛ (рдХреНрд╖реИрддрд┐рдЬ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде), рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВрдЧреЗред рдмреЗрд▓рдирд╛рдХрд╛рд░ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ, рд╣рдордиреЗ рд╕рд░реНрдХрд▓ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рдХреА рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛; рдЕрд░реНрдерд╛рддреН, рдЫрд╡рд┐ рдХреА рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдерд┐рддрд┐ рд╣рдореЗрдВ рд╢реЛрд░ рдХреНрд╖реЗрддреНрд░ xyz рдореЗрдВ рджреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ x рдФрд░ y рджреЗрддреА рд╣реИред рдЫрд╡рд┐ рдХреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд┐рддрд┐ рд╢реЛрд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ z рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЫрд╡рд┐ рд╕рд╣рдЬ рдФрд░ рд▓рдВрдмрд╡рдд рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдПрдХ рдФрд░ рдЖрдпрд╛рдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд╕рд░рд╛ рд╕рд░реНрдХрд▓ рдмрдирд╛рдиреЗ рдФрд░ z рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реИрдЦрд┐рдХ рдорд╛рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЪрд╛рд░-рдЖрдпрд╛рдореА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рджреЛ рд╕рд┐рд▓реЗрдВрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдореИрдВрдиреЗ рдПрдХ рд╕реНрдХреЗрдЪ рдкрд░ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╣ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдПрдХ рдЪрд╛рд░-рдЖрдпрд╛рдореА рд╕рд┐рд▓реЗрдВрдбрд░ рдирд╣реАрдВ рдЦреАрдВрдЪрд╛ред


рдЪрд╛рд░ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рджреЛ рд╕рд┐рд▓реЗрдВрдбрд░ рдХрд╛ рдПрдХ рд╕реНрдХреЗрдЪ

рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдпреЗ рдЪрд╛рд░-рдЖрдпрд╛рдореА рд╢реЛрд░ рд╕реНрдерд╛рди рдореЗрдВ рд╕рд┐рд░реНрдл рджреЛ рд╕рд░реНрдХрд▓ рд╣реИрдВред

// four dimensional tile
fNoiseScale = .003;
drawNoise(function(i,x,y){
    var  fNX = x/iSize
        ,fNY = y/iSize
        ,fRdx = fNX*2*Math.PI
        ,fRdy = fNY*2*Math.PI
        ,a = fRds*Math.sin(fRdx)
        ,b = fRds*Math.cos(fRdx)
        ,c = fRds*Math.sin(fRdy)
        ,d = fRds*Math.cos(fRdy)
        ,v = Simplex.noise(
             123+a*fNoiseScale
            ,231+b*fNoiseScale
            ,312+c*fNoiseScale
            ,273+d*fNoiseScale
        )
    ;
    return (Math.min(Math.max(2*(v -.5)+.5,0),1)*255)<<0;
}).img().div(2,2);

рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

рдЫрд╡рд┐

All Articles