青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評!!!)

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks
This method gives a much smother curve than Linear Interpolation. It's clearly better and worth the effort if you can afford the very slight loss in speed.

公告

王一偉 湖南商學院畢業 電子信息工程專業

常用鏈接

留言簿(19)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 389594
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

Perlin Noise


Many people have used random number generators in their programs to create unpredictability, make the motion and behavior of objects appear more natural, or generate textures. Random number generators certainly have their uses, but at times their output can be too harsh to appear natural. This article will present a function which has a very wide range of uses, more than I can think of, but basically anywhere where you need something to look natural in origin. What's more it's output can easily be tailored to suit your needs.

If you look at many things in nature, you will notice that they are fractal. They have various levels of detail. A common example is the outline of a mountain range. It contains large variations in height (the mountains), medium variations (hills), small variations (boulders), tiny variations (stones) . . . you could go on. Look at almost anything: the distribution of patchy grass on a field, waves in the sea, the movements of an ant, the movement of branches of a tree, patterns in marble, winds. All these phenomena exhibit the same pattern of large and small variations. The Perlin Noise function recreates this by simply adding up noisy functions at a range of different scales.

To create a Perlin noise function, you will need two things, a Noise Function, and an Interpolation Function.

Introduction To Noise Functions

A noise function is essentially a seeded random number generator. It takes an integer as a parameter, and returns a random number based on that parameter. If you pass it the same parameter twice, it produces the same number twice. It is very important that it behaves in this way, otherwise the Perlin function will simply produce nonsense.

Here is a graph showing an example noise function. A random value between 0 and 1 is assigned to every point on the X axis.

By smoothly interpolating between the values, we can define a continuous function that takes a non-integer as a parameter. I will discuss various ways of interpolating the values later in this article.

Definitions

Before I go any further, let me define what I mean by amplitude and frequency. If you have studied physics, you may well have come across the concept of amplitude and frequency applied to a sin wave.

The wavelength of a sin wave is the distance from one peak to another. The amplitude is the height of the wave. The frequency is defined to be 1/wavelength.
In the graph of this example noise function, the red spots indicate the random values defined along the dimension of the function. In this case, the amplitude is the difference between the minimum and maximum values the function could have. The wavelength is the distance from one red spot to the next. Again frequency is defined to be 1/wavelength.

Sin Wave

Noise Wave


Creating the Perlin Noise Function
Now, if you take lots of such smooth functions, with various frequencies and amplitudes, you can add them all together to create a nice noisy function. This is the Perlin Noise Function.
You can see that this function has large, medium and small variations. You may even imagine that it looks a little like a mountain range. In fact many computer generated landscapes are made using this method. Of course they use 2D noise, which I shall get onto in a moment.
Take the following Noise Functions

Add them together, and this is what you get.

You can, of course, do the same in 2 dimensions.
Some noise functions are created in 2D
Adding all these functions together produces a noisy pattern.

Persistence

When you're adding together these noise functions, you may wonder exactly what amplitude and frequency to use for each one. The one dimensional example above used twice the frequency and half the amplitude for each successive noise function added. This is quite common. So common in fact, that many people don't even consider using anything else. However, you can create Perlin Noise functions with different characteristics by using other frequencies and amplitudes at each step. For example, to create smooth rolling hills, you could use Perlin noise function with large amplitudes for the low frequencies , and very small amplitudes for the higher frequencies. Or you could make a flat, but very rocky plane choosing low amplitudes for low frequencies.

To make it simpler, and to avoid repeating the words Amplitude and Frequency all the time, a single number is used to specify the amplitude of each frequency. This value is known as Persistence. There is some ambiguity as to it's exact meaning. The term was originally coined by Mandelbrot, one of the people behind the discovery of fractals. He defined noise with a lot of high frequency as having a low persistence. My friend Matt also came up with the concept of persistence, but defined it the other way round. To be honest, I prefer Matt's definition. Sorry Mandelbrot. So our definition of persistence is this:


frequency = 2i
amplitude = persistencei

Where i is the ith noise function being added. To illustrate the effect of persistence on the output of the Perlin Noise, take a look at the diagrams below. They show the component noise functions that are added, the effect of the persistence value, and the resultant Perlin noise function.

Frequency12481632
Persistence = 1/4+++++=
Amplitude:11/41/161/641/2561/1024result
Persistence = 1/2+++++=
Amplitude:11/21/41/81/161/32result
Persistence = 1 / root2+++++=
Amplitude:11/1.4141/21/2.8281/41/5.656result
Persistence = 1+++++=
Amplitude:111111result


Octaves

Each successive noise function you add is known as an octave. The reason for this is that each noise function is twice the frequency of the previous one. In music, octaves also have this property.
Exactly how many octaves you add together is entirely up to you. You may add as many or as few as you want. However, let me give you some suggestions. If you are using the perlin noise function to render an image to the screen, there will come a point when an octave has too high a frequency to be displayable. There simply may not be enough pixels on the screen to reproduce all the little details of a very high frequency noise function. Some implementations of Perlin Noise automatically add up as many noise functions they can until the limits of the screen (or other medium) are reached.
It is also wise to stop adding noise functions when their amplitude becomes too small to reproduce. Exactly when that happens depends on the level of persistence, the overall amplitude of the Perlin function and the bit resolution of your screen (or whatever).

Making your noise functions

What do we look for in a noise function? Well, it's essentially a random number generator. However, unlike other random number generators you may have come across in your programs which give you a different random number every time you call them, these noise functions supply a random number calculated from one or more parameters. I.e. every time you pass the same number to the noise function, it will respond with the same number. But pass it a different number, and it will return a different number.

Well, I don't know a lot about random number generators, so I went looking for some, and here's one I found. It seems to be pretty good. It returns floating point numbers between -1.0 and 1.0.
  function IntNoise(32-bit integer: x)			 

    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    

  end IntNoise function

Now, you'll want several different random number generators, so I suggest making several copies of the above code, but use slightly different numbers. Those big scarey looking numbers are all prime numbers, so you could just use some other prime numbers of a similar size. So, to make it easy for you to find random numbers, I have written a little program to list prime numbers for you. You can give it a start number and an end number, and it will find all the primes between the two. Source code is also included, so you can easily include it into your own programs to produce a random prime number. Primes.zip

Interpolation

Having created your noise function, you will need to smooth out the values it returns. Again, you can choose any method you like, but some look better than others. A standard interpolation function takes three inputs, a and b, the values to be interpolated between, and x which takes a value between 0 and 1. The Interpolation function returns a value between a and b based on the value x. When x equals 0, it returns a, and when x is 1, it returns b. When x is between 0 and 1, it returns some value between a and b.

Looks awful, like those cheap 'plasmas' that everyone uses to generate landscapes. It's a simple algorithm though, and I suppose would be excusable if you were trying to do perlin noise in realtime.

Linear Interpolation:

  function Linear_Interpolate(a, b, x)
	return  a*(1-x) + b*x
  end of function

Cosine Interpolation:

  function Cosine_Interpolate(a, b, x)
	ft = x * 3.1415927f = (1 - cos(ft)) * .5

	return  a*(1-f) + b*f
  end of function

Cubic Interpolation:

This method gives very smooth results indeed, but you pay for it in speed. To be quite honest, I'm not sure if it would give noticeably better results than Cosine Interpolation, but here it is anyway if you want it. It's a little more complicated, so pay attention. Whereas before, the interpolation functions took three inputs, the cubic interpolation takes five. Instead of just a and b, you now need v0, v1, v2 and v3, along with x as before. These are:
v0 = the point before a
v1 = the point a
v2 = the point b
v3 = the point after b
  function Cubic_Interpolate(v0, v1, v2, v3,x)
	P = (v3 - v2) - (v0 - v1)
	Q = (v0 - v1) - PR = v2 - v0S = v1

	return Px3 + Qx2 + Rx + S
  end of function

Smoothed Noise

Aside from Interplolation, you can also smooth the output of the noise function to make it less random looking, and also less square in the 2D and 3D versions. Smoothing is done much as you would expect, and anyone who has written an image smoothing filter, or fire algorithm should already be familiar with the process.
Rather than simply taking the value of the noise function at a single coordinate, you can take the average of that value, and it's neighbouring values. If this is unclear, take a look at the pseudo code below.
On the right, you can see a little diagram illustrating the difference between smoothed noise, and the same noise function without smoothing. You can see that the smooth noise is flatter, never reaching the extremes of unsmoothed noise, and the frequency appears to be roughly half. There is little point smoothing 1 dimensional noise, since these are really the only effects. Smoothing becomes more useful in 2 or three dimensions, where the effect is to reduce the squareness of the noise. Unfortunately it also reduces the contrast a little. The smoother you make it, obviously, the flatterthe noise will be.

1-dimensional Smooth Noise
  function Noise(x)
    ..
  end function

  function SmoothNoise_1D(x)

    return Noise(x)/2  +  Noise(x-1)/4  +  Noise(x+1)/4

  end function

2-dimensional Smooth Noise

  function Noise(x, y)
    ..
  end function

  function SmoothNoise_2D(x>, y)
    
    corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16sides   = ( Noise(x-1, y)  +Noise(x+1, y)  +Noise(x, y-1)  +Noise(x, y+1) ) /  8center  =  Noise(x, y) / 4

    return corners + sides + center


  end function

Putting it all together

Now that you know all that, it's time to put together all you've learned and create a Perlin Noise function. Remember that it's just several Interpolated Noise functions added together. So Perlin Noise it just a function. You pass it one or more parameters, and it responds with a number. So, here's a simple 1 dimensional Perlin function.
The main part of the Perlin function is the loop. Each iteration of the loop adds another octave of twice the frequency. Each iteration calls a different noise function, denoted by Noisei. Now, you needn't actually write lots of noise functions, one for each octave, as the pseudo code seems to suggest. Since all the noise functions are essentially the same, except for the values of those three big prime numbers, you can keep the same code, but simply use a different set of prime numbers for each.

1-dimensional Perlin Noise Pseudo code

  function Noise1(integer x)
    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
  end function


  function SmoothedNoise_1(float x)
    return Noise(x)/2  +  Noise(x-1)/4  +  Noise(x+1)/4
  end function


  function InterpolatedNoise_1(float x)

      integer_X    = int(x)
      fractional_X = x - integer_Xv1 = SmoothedNoise1(integer_X)
      v2 = SmoothedNoise1(integer_X + 1)

      return Interpolate(v1 , v2 , fractional_X)

  end function


  function PerlinNoise_1D(float x)

      total = 0p = persistencen = Number_Of_Octaves - 1

      loop i from 0 to nfrequency = 2iamplitude = pitotal = total + InterpolatedNoisei(x * frequency) * amplitude

      end of i loop

      return total

  end function

Now it's easy to apply the same code to create a 2 or more dimensional Perlin Noise function:

2-dimensional Perlin Noise Pseudocode

  function Noise1(integer x, integer y)
    n = x + y * 57n = (n<<13) ^ n;
    return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
  end function

  function SmoothNoise_1(float x, float y)
    corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16sides   = ( Noise(x-1, y)  +Noise(x+1, y)  +Noise(x, y-1)  +Noise(x, y+1) ) /  8center  =  Noise(x, y) / 4
    return corners + sides + center
  end function

  function InterpolatedNoise_1(float x, float y)

      integer_X    = int(x)
      fractional_X = x - integer_Xinteger_Y    = int(y)
      fractional_Y = y - integer_Yv1 = SmoothedNoise1(integer_X,     integer_Y)
      v2 = SmoothedNoise1(integer_X + 1, integer_Y)
      v3 = SmoothedNoise1(integer_X,     integer_Y + 1)
      v4 = SmoothedNoise1(integer_X + 1, integer_Y + 1)

      i1 = Interpolate(v1 , v2 , fractional_X)
      i2 = Interpolate(v3 , v4 , fractional_X)

      return Interpolate(i1 , i2 , fractional_Y)

  end function


  function PerlinNoise_2D(float x, float y)

      total = 0p = persistencen = Number_Of_Octaves - 1

      loop i from 0 to nfrequency = 2iamplitude = pitotal = total + InterpolatedNoisei(x * frequency, y * frequency) * amplitude

      end of i loop

      return total

  end function


Applications of Perlin Noise

Now that you have this fantastic function, what can you do with it? Well, as the cliche goes, you're limited only by your imagination. Perlin Noise has so many applications that I can't think of them all, but I'll have a go.

1 dimensional

Living objects rarely stay still for very long (except students). Use perlin noise to constantly adjust the joint positions of a virtual human player, in a game for example, to make it look like it's more alive.

Computer drawn lines are always totally straight, which can make them look unnatural and unfriendly. You can use Perlin Noise to introduce a wobblyness to a line drawing algorithm to make it appear as if it's been drawn by hand. You can also draw wobbly circles and boxes. Some research has been done on making a Sketchy User Interface.
See: Creating Informal Looking Interfaces.

Controlling virtual beings:
Drawing sketched lines:


2 dimensional

These are a perfect application for 2D Perlin Noise. Unlike the subdivision method, you do not have to store the landscape anywhere in memory, the height of any point on the landscape can be calculated easily. What's more, the land stretches indefinitely (almost), and can be calculated to minute detail, so it's perfect of variable level of detail rendering. The properties of the landscape can be defined easily too.
Again, cloud rendering is well suited to Perlin Noise.
All sorts of textures can be generated using Perlin Noise. See the table below for some examples. The textures generated can go on for ages before repeating (if ever), which makes them much more pleasant to look at than a repeating tiled texture map.
Landscapes:
Clouds:
Generating Textures:


3 dimensional

You can, of course, produce volumetric clouds. You'll probably have to use some sort of ray tracing to visualise them.
You can produce animated 2 dimensional clouds with 3D Perlin Noise, if you consider one dimension to be time.
Some rendering / raytracing programs, like POVray, apply texture to objects by literally carving them from a 3-dimensional texture. This was, the textures do not suffer from the warping usually associated with mapping 2D textures onto (non-flat) 3D objects.
3D Clouds:
Animated Clouds:
Solid Textures:


4 dimensional

Moving into higher dimensions, you can easily produce animated clouds and solid textures. Just consider the extra dimension to be time.
Animated 3D Textures and Clouds:



Copyright Matt Fairclough 1998
The land, clouds and water in this picture were all mathematically generated with Perlin Noise, and rendered with Terragen.
The clouds in this demo are animated with 3D perlin Noise. The algorithm had to be modified slightly to be able to produce Perlin Noise in real time. See the Clouds Article for more info on how this was done.


Generating Textures with Perlin Noise

Perlin is fantastic for generating textures. You can produce textures that are (for all practical purposes) infinitely large, but take up almost no memory. You can create marble, wood, swirly patterns, probably anything if you try hard. You can also define a 3D texture. You can think of this as a solid block of material, from which you can 'carve' an object. This allows you to produce textures which can be applied to any shaped object without distortion. It can take a lot of imagination, thought and experimentation to get a texture to look really good, but the results can be very impressive indeed.

Play around as much as you like. Use several Perlin functions to create a texture, try different persistences and different frequencies in different dimensions. You can use one Perlin function to affect the properties of another. Apply functions to their output. Do whatever you want, there's almost certainally a way to produce almost any texture you can dream up.

The following textures were made with 3D Perlin Noise

Standard 3 dimensional perlin noise. 4 octaves, persistence 0.25 and 0.5
Low persistence. You can create harder edges to the perlin noise by applying a function to the output.
To create more interesting and complicated textures, you should try mixing several Perlin functions. This texture was created in two parts. Firstly a Perlin function with low persistence was used to define the shape of the blobs. The value of this function was used to select from two other functions, one of which defined the stripes, the other defined the blotchy pattern. A high value chose more of the former, a low value more of the latter. The stripes were defined by multiplying the first Perlin Function by some number (about 20) then taking the cosine.
A marbly texture can be made by using a Perlin function as an offset to a cosine function.


    texture = cosine( x + perlin(x,y,z) )
Very nice wood textures can be defined. The grain is defined with a low persistence function like this:

    g = perlin(x,y,z) * 20
    grain = g - int(g)
The very fine bumps you can see on the wood are high frequency noise that has been stretched in one dimension.

    bumps = perlin(x*50, y*50, z*20)
    if bumps < .5 then bumps = 0  else bumps = 1t


posted on 2006-10-16 08:40 @王一偉 閱讀(1618) 評論(0)  編輯 收藏 引用 所屬分類: 2. 3D渲染

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品一区二区你懂得| 亚洲三级观看| 韩日视频一区| 国产日韩在线看片| 国产精品一级久久久| 欧美视频不卡| 国产精品一区二区视频| 国产日产精品一区二区三区四区的观看方式 | 亚洲精品老司机| 最新亚洲一区| av成人天堂| 一本久久综合亚洲鲁鲁五月天| 亚洲精品影院在线观看| 亚洲国产女人aaa毛片在线| 999在线观看精品免费不卡网站| 亚洲靠逼com| 在线一区观看| 午夜在线精品| 久久九九国产精品| 免费观看日韩av| 亚洲欧洲日产国产综合网| 亚洲日本理论电影| 一区二区三区欧美日韩| 午夜精品久久久久久久99水蜜桃 | 久久久久亚洲综合| 亚洲制服av| 在线一区二区日韩| 久久成人精品视频| 免费观看日韩| 欧美日韩亚洲一区二区三区| 欧美视频一区二区三区在线观看| 久久国产精品一区二区| 欧美电影免费观看高清完整版| 午夜久久影院| 老鸭窝毛片一区二区三区 | 久久久久中文| 欧美激情亚洲精品| 免费成人美女女| 久久久噜噜噜久久| 午夜欧美精品| 免费亚洲网站| 一区二区三区 在线观看视| 亚洲欧美在线另类| 免费在线国产精品| 亚洲国产三级网| 亚洲永久在线观看| 欧美a级一区| 国产精品一级| 日韩一级成人av| 欧美一区二区三区久久精品| 欧美激情欧美狂野欧美精品 | 国产色产综合色产在线视频| 亚洲精品乱码久久久久久| 欧美一区二区三区在线免费观看| 亚洲一区自拍| 欧美一级久久久| 麻豆精品在线观看| 在线亚洲一区| 欧美日韩国产区| 亚洲激情网站免费观看| 一本色道久久综合亚洲精品不卡| 亚洲嫩草精品久久| 狂野欧美激情性xxxx| 欧美大学生性色视频| 亚洲精品在线二区| 亚洲女同精品视频| 久久久夜精品| 国产精品久久久久久久久久免费 | 亚洲美女av黄| 毛片基地黄久久久久久天堂| 亚洲香蕉网站| 欧美日韩国产免费观看| 亚洲第一在线综合在线| 午夜在线a亚洲v天堂网2018| 亚洲国产精品成人一区二区| 久久精品国产成人| 国产欧美三级| 亚洲综合电影| 中日韩男男gay无套| 久久琪琪电影院| 99国产精品久久久久老师| 欧美电影美腿模特1979在线看| 欧美一区二区三区播放老司机| 国产精品毛片大码女人| 亚洲精品老司机| 日韩视频在线观看国产| 欧美电影免费观看高清| 久久综合久久久| 亚洲国产合集| 欧美激情一区二区三区成人| 一本久久a久久免费精品不卡| 亚洲精品亚洲人成人网| 欧美另类高清视频在线| 亚洲全部视频| 亚洲人精品午夜| 欧美日韩中文精品| 欧美在线关看| 欧美中文字幕久久| 欧美精品一区二区三区久久久竹菊| 伊人久久成人| 亚洲福利国产| 欧美午夜激情视频| 欧美伊人久久久久久午夜久久久久 | 午夜日本精品| 久久久久国产精品一区| 尤物精品在线| 日韩视频在线一区| 国产精品一区二区三区观看| 久久久久久综合网天天| 免费观看在线综合| 亚洲国产成人porn| 欧美日韩直播| 久久深夜福利| 欧美日韩国产一中文字不卡| 欧美一级电影久久| 老牛国产精品一区的观看方式| 亚洲麻豆国产自偷在线| 亚洲午夜av电影| 亚洲承认在线| 亚洲视频播放| 国产精品久久久久久久久动漫| 在线一区日本视频| 久久不射网站| 中文一区二区| 久久综合狠狠综合久久综合88 | 影音先锋久久久| 亚洲精品综合| 在线成人小视频| 亚洲尤物视频在线| 亚洲美女免费视频| 久久久久久久久伊人| 国产精品日产欧美久久久久| 久久久综合视频| 国产精品电影网站| 国产日韩欧美综合一区| 一区二区三区精品| 久久久www免费人成黑人精品 | 午夜免费在线观看精品视频| 国产精品一区一区| 亚洲精品中文字| 亚洲国产天堂网精品网站| 亚洲欧美视频一区| 中文亚洲视频在线| 欧美激情第一页xxx| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品久久久久久久浪潮网站 | 亚洲国产高清自拍| 欧美亚洲视频一区二区| 国产日韩欧美在线观看| 亚洲视频免费在线观看| 一区二区三区我不卡| 亚洲高清不卡在线| 国产精品v一区二区三区| 欧美与欧洲交xxxx免费观看| 老司机67194精品线观看| 亚洲一级在线观看| 久久精品国产91精品亚洲| 99国产精品久久久久老师| 午夜欧美精品| 中国女人久久久| 久久久久这里只有精品| 亚洲一区二区三区免费观看| 久久久久国产精品麻豆ai换脸| 亚洲在线中文字幕| 久久综合亚州| 亚洲在线视频观看| 欧美成人精品一区二区| 久久久噜噜噜久久中文字免| 欧美日本免费| 亚洲美女色禁图| 亚洲视屏在线播放| 欧美视频在线观看免费| 亚洲高清视频中文字幕| 国产欧美日韩中文字幕在线| 午夜激情一区| 蜜桃av一区二区在线观看| 亚洲国产成人porn| 欧美大片第1页| 亚洲另类自拍| 欧美专区中文字幕| 国外精品视频| 女女同性精品视频| 亚洲精品欧美日韩| 亚洲精品午夜| 欧美激情一区在线观看| 一本色道久久99精品综合| 欧美在线精品免播放器视频| 激情亚洲网站| 欧美日韩成人综合| 亚洲欧美国产日韩天堂区| 久久亚洲国产精品一区二区 | 亚洲精品一区二区三区蜜桃久| 午夜精品久久一牛影视| 激情视频一区二区| 欧美影院成人| 国产视频欧美视频| 欧美激情视频免费观看| 亚洲欧美一区二区三区在线| 伊人成人在线视频| 欧美伦理在线观看|