Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «НаписаниС скриптов для Blender 2.49Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 44

Автор Michel Anders

scn               = Scene.GetCurrent()

context           = scn.getRenderingContext()

current_frame     = context.currentFrame() #Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Π΄Ρ€

start_frame       = context.startFrame()   #ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€

end_frame         = context.endFrame()     #ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€

frames_per_second = context.fps            #Частота

                                           #ΠΊΠ°Π΄Ρ€ΠΎΠ², fps

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, с этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ врСмя, ΠΈΠ»ΠΈ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅, ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ стартового ΠΊΠ°Π΄Ρ€Π°:

absolute_time = current_frame/float(frames_per_second)

relative_time = (current_frame-start_frame)/ \

                 float(frames_per_second)

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎ float (число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ) Π² Π·Π½Π°ΠΌΠ΅Π½Π°Ρ‚Π΅Π»Π΅ (Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ). Π­Ρ‚ΠΈΠΌ способом ΠΌΡ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΎΡΡŒ ΠΊΠ°ΠΊ опСрация с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. НС строго Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ fps возвращаСтся с Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π½ΠΎ мноТСство людСй ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ частоту ΠΊΠ°Π΄Ρ€ΠΎΠ² ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ†Π΅Π»ΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 25 ΠΈΠ»ΠΈ 30. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ‚Π°ΠΊ Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ всСгда (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° NTSC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Ρ€ΠΎΠ±Π½ΡƒΡŽ частоту ΠΊΠ°Π΄Ρ€ΠΎΠ²), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π»ΡƒΡ‡ΡˆΠ΅ сдСлаСм это явно. Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ с этим Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° люди захотят ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ своё Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ частотС ΠΊΠ°Π΄Ρ€ΠΎΠ², ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ.


Всё, Ρ‡Ρ‚ΠΎ выглядит Ρ…ΠΎΡ€ΠΎΡˆΠΎ β€” это Ρ…ΠΎΡ€ΠΎΡˆΠΎ

Π’ΠΎΡ‡Π½ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, ΠΊΠ°ΠΊ выглядят ΠΏΡƒΠ»ΡŒΡΠ°Ρ†ΠΈΠΈ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΏΠ΅Π»Π΅ΠΊ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹ΠΌ, Π½ΠΎ это просто, хотя ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡƒΡ‚Π°Π½ΠΎ. Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ, ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ΡΡ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ, ΠΌΠΎΠ³ΡƒΡ‚   ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ   ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ   ссылки   (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, http://en.wikipedia.org/wiki/Wave). НашСй Ρ†Π΅Π»ΡŒΡŽ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ являСтся ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π° с максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, Π° обСспСчСниС Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ° тСкстурой, которая выглядит Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ управляСтся Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ тСкстуру ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°ΠΆΠ΅ Π² нСрСалистичных ситуациях.

Π’Π°ΠΊ, вмСсто опрСдСлСния скорости, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ двигаСтся Π²ΠΎΠ»Π½Π° Π² зависимости ΠΎΡ‚ Ρ‡Π΅Π³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вязкости Π²ΠΎΠ΄Ρ‹, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² наш Pynode. Π’ΠΎ ΠΆΠ΅ самоС для высоты ΠΈ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ Π²ΠΎΠ»Π½, ΠΈ показатСля, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ высота Π²ΠΎΠ»Π½ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Π’ основном, ΠΌΡ‹ аппроксимируСм наш нСбольшой ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΡƒΠ»ΡŒΡΠ°Ρ†ΠΈΠΉ, Π΅Π³ΠΎ расхоТдСниС Π½Π°Ρ€ΡƒΠΆΡƒ ΠΈΠ· Ρ‚ΠΎΡ‡ΠΊΠΈ падСния капСльки, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ косинуса, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π½Π° ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ тормоТСния.  Π­Ρ‚ΠΎ снова ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ опасным ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΡƒ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π»Π΅Π³ΠΊΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ:



Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ высоту Π² любой ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ x, y Π½Π° нашСй тСкстурС, Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

position_of_maximum=speed*time

damping = 1.0/(1.0+dampf*position_of_maximum)

distance = sqrt((x-dropx)**2+(y-dropy)**2)

height = damping*a*exp(-(distance-

position_of_maximum)**2/c)* \

         cos(freq*(distance-position_of_maximum))

Π—Π΄Π΅ΡΡŒ, dropx ΠΈ dropy - позиция ΡƒΠ΄Π°Ρ€ΠΈΠ²ΡˆΠ΅ΠΉ ΠΊΠ°ΠΏΠ»ΠΈ, a - наш Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ высоты.

Π­Ρ„Ρ„Π΅ΠΊΡ‚Ρ‹ ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π±Ρ€ΠΎΡˆΠ΅Π½Π½Ρ‹Ρ… капСль Π² Ρ€Π°Π·Π½ΠΎΠ΅ врСмя ΠΈ Π² Ρ€Π°Π·Π½Ρ‹Ρ… позициях ΠΌΠΎΠΆΠ½ΠΎ просто Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ суммированиСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… высот.


Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅   дорогостоящих   Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²   для ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ использования

ЕдинствСнная капля - это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ доТдь, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ слоТСнныС эффСкты ΠΎΡ‚ мноТСства случайных капСль. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ врСмя ΡƒΠ΄Π°Ρ€ΠΎΠ² для ΡΡ‚ΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ°ΠΏΠ΅Π»Π΅ΠΊ, сколько ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ Π±Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° __call__() (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΈΠΌΠΎΠ³ΠΎ пиксСля Π² нашСй тСкстурС). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌΠΈ Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ процСссорных сил, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вычислСниС мноТСства случайных чисСл ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ памяти для, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠ½ΠΎΠ³ΠΈΡ… капСль Π΄ΠΎΡ€ΠΎΠ³ΠΎ.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ эти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² качСствС экзСмпляров ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… нашСго Pynode. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ достаточно остороТными, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ __call__ () ΠΈ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ€Ρ‹, Ссли ΠΎΠ½ΠΈ измСнились. ΠžΠ±Ρ‰Π°Ρ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

class MyNode(Node.Scripted):


   def __init__(self, sockets):

      sockets.input   = [Node.Socket('InputParam',

                         val = 1.0)]

      sockets.output  = [Node.Socket('OutputVal' ,

                         val = 1.0)]

      self.InputParam = None

      self.Result     = None

   def __call__(self):

      if self.InputParam == None or \

         self.InputParam != self.input.InputParam :

         self.InputParam = self.input.InputParam

         self.Result     = интСнсивныС_вычислСния ...

      self.output.OutputVal = Π΄Ρ€ΡƒΠ³ΠΈΠ΅_вычислСния …

Π­Ρ‚ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ измСняСтся Ρ€Π΅Π΄ΠΊΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π΅Π³ΠΎ измСняСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Если Π²Ρ…ΠΎΠ΄ измСняСтся с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ пиксСлСм, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ сокСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π½ΠΎΠ΄Π° - схСма с Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ΠΌ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΡ€ΠΎΠΆΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ вмСсто ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ экономии.


ВычислСниС Π½ΠΎΡ€ΠΌΠ°Π»Π΅ΠΉ

НашСй Ρ†Π΅Π»ΡŒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ»Π½ΠΎΠ²ΠΎΠΉ ΡƒΠ·ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π½Π΅ΠΊΠΈΠΉ способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ ΠΈΠ· рассчитанных высот. Π‘Π»Π΅Π½Π΄Π΅Ρ€ Π½Π΅ прСдоставляСт Π½Π°ΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½ΠΎΠ΄Π° для ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ схСму ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π’ противовСс Π½ΠΎΠ΄Π°ΠΌ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ², Π½ΠΎΠ΄Ρ‹ тСкстур Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ 'Value to Normal' (Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ), которая доступна Π² Π½ΠΎΠ΄ΠΎΠ²ΠΎΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ тСкстур ΠΈΠ· мСню Add|Convertor|Value to Normal.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠ°ΠΊ ΠΈ Π² случаС ряби, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ для нашСй ΠΊΠ°ΠΏΠ»ΠΈ доТдя, Π½ΠΎ, вмСсто двиТСния ΠΏΠΎ матСматичСскому ΠΏΡƒΡ‚ΠΈ, ΠΌΡ‹ снова примСняСм ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ встроСнными тСкстурами ΡˆΡƒΠΌΠ° для вычислСния Π½ΠΎΡ€ΠΌΠ°Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нСзависимо ΠΎΡ‚ основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Пока ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ‚Ρ€Π΅Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ…: f(x,y),f(x+nabla,y), ΠΈ f(x,y+nabla), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ Π² x,y, изучая Π½Π°ΠΊΠ»ΠΎΠ½ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² направлСниях x ΠΈ y. ΠΠΎΡ€ΠΌΠ°Π»ΡŒ повСрхности Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ,  пСрпСндикулярным ΠΊ плоскости, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ этими двумя Π½Π°ΠΊΠ»ΠΎΠ½Π°ΠΌΠΈ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·ΡΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΌΠ°Π»ΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ для nabla, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ с Π½Π΅ΠΉ, ΠΈ Ссли это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Ρ‘ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ.


Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ всё это вмСстС

Взяв всС эти ΠΈΠ΄Π΅ΠΈ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ΠΎΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для нашСго Pynode Raindrops (с ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ import):

class Raindrops(Node.Scripted):

   def __init__(self, sockets):

      sockets.input = [

         Node.Socket('Drops_per_second'  ,

                     val = 5.0, min = 0.01, max = 100.0),

         Node.Socket('a',val=5.0,min=0.01,max=100.0),

         Node.Socket('c',val=0.04,min=0.001,max=10.0),

         Node.Socket('speed',val=1.0,min=0.001, max=10.0),

         Node.Socket('freq',val=25.0,min=0.1, max=100.0),

         Node.Socket('dampf',val=1.0,min=0.01, max=100.0),

         Node.Socket('Coords', val = 3*[1.0])]

      sockets.output = [

              Node.Socket('Height', val = 1.0),

              Node.Socket('Normal', val = 3 *[0.0])]

      self.drops_per_second = None

      self.ndrops = None

Код ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ опрСдСляСт мноТСство Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… сокСтов ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π½ΠΎΠ³ΠΎ. Drops_per_second (капСль Π² сСкунду) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ самочитаСмым. a ΠΈ c - общая высота ΠΈ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΏΡƒΠ»ΡŒΡΠ°Ρ†ΠΈΠΉ, Π΄Π²ΠΈΠ³Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π°Ρ€ΡƒΠΆΡƒ ΠΈΠ· Ρ‚ΠΎΡ‡ΠΊΠΈ ΡƒΠ΄Π°Ρ€Π°. speed ΠΈ freq ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, ΠΊΠ°ΠΊ быстро наши ΠΏΡƒΠ»ΡŒΡΠ°Ρ†ΠΈΠΈ Π΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ ΠΈ насколько Π±Π»ΠΈΠ·ΠΊΠΎ Π²ΠΎΠ»Π½Ρ‹ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ. Π’ΠΎ, ΠΊΠ°ΠΊ быстро высота Π²ΠΎΠ»Π½ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π²ΠΎ врСмя ΠΏΡƒΡ‚ΠΈ Π½Π°Ρ€ΡƒΠΆΡƒ, опрСдСляСт dampf.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСм Π΄Π²Π° Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… сокСта: Height Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Π½Π½ΡƒΡŽ высоту ΠΈ Normal Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ Π² этой ΠΆΠ΅ Ρ‚ΠΎΡ‡ΠΊΠ΅. Normal - это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для получСния повСрхностного эффСкта распространСния, Π½ΠΎ рассчитанная высота ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ способности повСрхности.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ заканчиваСтся с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… экзСмпляра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Π½Π°ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ падСния ΠΊΠ°ΠΏΠ»ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ __call__().

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ __call__() начинаСтся с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ мноТСства Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Одно ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ мСсто - Ρ‚ΠΎ, Π³Π΄Π΅ ΠΌΡ‹ установили ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ сСмя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ функциями модуля Noise (Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ убСТдаСмся, Ρ‡Ρ‚ΠΎ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ пСрСсчитываСм Ρ‚ΠΎΡ‡ΠΊΠΈ ΡƒΠ΄Π°Ρ€Π°, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ повторяСмыС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ установили Π±Ρ‹ количСство капСль Π² сСкунду сначала Π½Π° Π΄Π΅ΡΡΡ‚ΡŒ, Π° ΠΏΠΎΠ·ΠΆΠ΅ Π½Π° Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ, ΠΈ, Π·Π°Ρ‚Π΅ΠΌ Π²Π²Π΅Ρ€Π½ΡƒΠ»ΠΈΡΡŒ ΠΊ дСсяти, сгСнСрированный ΡƒΠ·ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΌ ΠΆΠ΅. Если Π’Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это, Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ сокСт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²Ρ…ΠΎΠ΄ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setRandomSeed():