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():