def __call__(self):
twopi = 2*pi
col = [0,0,0,1]
nor = [0,0,1]
tex_coord = self.input.Coords
x = tex_coord[0]
y = tex_coord[1]
a = self.input.a
c = self.input.c
Noise.setRandomSeed(42)
scn = Scene.GetCurrent()
context = scn.getRenderingContext()
current_frame = context.currentFrame()
start_frame = context.startFrame()
end_frame = context.endFrame()
frames_per_second = context.fps
time = current_frame/float(frames_per_second)
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π΄ΠΎΠ»ΠΆΠ½Ρ Π»ΠΈ ΠΌΡ Π²ΡΡΠΈΡΠ»ΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΠΎΡΠ΅ΠΊ ΡΠ΄Π°ΡΠ° ΠΊΠ°ΠΏΠ΅Π»Ρ Π·Π°Π½ΠΎΠ²ΠΎ. ΠΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π²Π΅Π»ΠΈΡΠΈΠ½Π° Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° drops_per_second Π±ΡΠ»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ (ΠΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΡΡΠΎΡ Π²Ρ ΠΎΠ΄ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ Π½ΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΈΠΊΡΠ΅Π»Π΅, Π½ΠΎ ΡΡΠΎ ΠΏΠ»ΠΎΡ Π°Ρ ΠΈΠ΄Π΅Ρ), ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΡΡΠ°ΡΡΠΎΠ²ΡΠΉ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΠΊΠ°Π΄Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ, ΠΊΠ°ΠΊ ΡΡΠΈ Π²Π»ΠΈΡΠ½ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΊΠ°ΠΏΠ΅Π»Ρ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΡΠΈΡΠ»ΡΡΡ. ΠΡΠΎΡ ΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π° Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ Π²Π½ΠΎΠ²Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½ Ρ ΡΠΎΡ ΡΠ°Π½ΡΠ½Π½ΡΠΌΠΈ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°:
drops_per_second = self.input.Drops_per_second
# Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠΈΡΠ»Π° ΠΊΠ°ΠΏΠ΅Π»Ρ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ
# Π² ΠΏΠ΅ΡΠΈΠΎΠ΄ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
ndrops = 1 + int(drops_per_second * \
(float(end_frame) β start_frame+ 1)/ \
frames_per_second )
if self.drops_per_second != drops_per_second \
or self.ndrops != ndrops:
self.drop = [ (Noise.random(), Noise.random(),
Noise.random() + 0.5) for i in range(ndrops)]
self.drops_per_second = drops_per_second
self.ndrops = ndrops
ΠΡΠ»ΠΈ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊΠ°ΠΏΠ΅Π»Ρ Π·Π°Π½ΠΎΠ²ΠΎ, ΠΌΡ Π½Π°Π·Π½Π°ΡΠ°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΡΡΠ΅ΠΆΠ΅ΠΉ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° self.drop, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ x ΠΈ y ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊΠ°ΠΏΠ»ΠΈ ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΊΠ°ΠΏΠ»ΠΈ, ΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ Π²ΡΡΠΎΡΠ° Π²ΠΎΠ»Π½.
Π‘ΡΡΠΎΠΊ ΠΎΡΡΠ°Π²ΡΠ΅ΠΉΡΡ ΡΠ°ΡΡΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π· ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ __call__(), Π½ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½Π½Π°Ρ ΡΡΡΠΎΠΊΠ° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π·Π½Π°ΡΠΈΠΌΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΏΠ»ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΡΠ΅ Π½Π΅ ΡΠΏΠ°Π»ΠΈ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°Π΄ΡΠ΅, Π½Π΅ ΠΏΡΠΈΠ²Π½ΠΎΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π²ΡΡΠΎΡΡ, ΠΌΡ ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΈΡ ΠΈΠ· Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ:
speed=self.input.speed
freq=self.input.freq
dampf=self.input.dampf
height = 0.0
height_dx = 0.0
height_dy = 0.0
nabla = 0.01
for i in range(1+int(drops_per_second*time)):
dropx,dropy,dropsize = self.drop[i]
position_of_maximum=speed*time- \
i/float(drops_per_second)
damping = 1.0/(1.0+dampf*position_of_maximum)
distance = sqrt((x-dropx)**2+(y-dropy)**2)
height += damping*a*dropsize* \
exp(-(distance-position_of_maximum)**2/c)* \
cos(freq*(distance-position_of_maximum))
distance_dx = sqrt((x+nabla-dropx)**2+ \
(y-dropy)**2)
height_dx += damping*a*dropsize* \
exp(-(distance_dx-position_of_maximum)**2/c) \
* cos(freq*(distance_dx-position_of_maximum))
distance_dy = sqrt((x-dropx)**2+ \
(y+nabla-dropy)**2)
height_dy += damping*a*dropsize* \
exp(-(distance_dy-position_of_maximum)**2/c) \
*cos(freq*(distance_dy-position_of_maximum))
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ ΠΌΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ Π²ΡΡΠΎΡΡ Π² ΡΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡΡ , ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΎΡΠΌΠ°Π»Ρ (ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΎ ΡΠ°Π½ΡΡΠ΅). ΠΡΠΈ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΡΠΎΠΊΠ°Ρ , ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ x ΠΈ y ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½ΠΎΡΠΌΠ°Π»ΠΈ (z ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² Π΅Π΄ΠΈΠ½ΠΈΡΡ). Π‘Π°ΠΌΠ° ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½Π°Ρ Π²ΡΡΠΎΡΠ° Π΄Π΅Π»ΠΈΡΡΡ Π½Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ°ΠΏΠ΅Π»Ρ (ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠ΅Π΄Π½ΡΡ Π²ΡΡΠΎΡΠ° Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΊΠ°ΠΏΠ΅Π»Ρ) ΠΈ Π½Π° ΠΎΠ±ΡΠΈΠΉ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ a, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°Π΄Π°Π½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ½ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠΎΠΊΠ΅Ρ (Π²ΡΠ΄Π΅Π»Π΅Π½ΠΎ):
nor[0]=height-height_dx
nor[1]=height-height_dy
height /= ndrops * a
self.output.Height = height
N = (vec(self.shi.surfaceNormal)+0.2 * \
vec(nor)).normalize()
self.output.Normal= N
__node__ = Raindrops
Π Π°ΡΡΡΠΈΡΠ°Π½Π½Π°Ρ Π½ΠΎΡΠΌΠ°Π»Ρ Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΊ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎΠΉ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΡΠΎΠ³ΠΎ ΠΏΠΈΠΊΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²ΠΎΠ»Π½Ρ Π±ΡΠ΄ΡΡ Π²ΡΠ΅ Π΅ΡΠ΅ Ρ ΠΎΡΠΎΡΠΎ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ Π½Π° ΠΈΡΠΊΡΠΈΠ²Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ, ΠΈ Π½ΠΎΡΠΌΠΈΡΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΅Ρ Π² Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠΎΠΊΠ΅Ρ. ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΠΊΠ° ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π·Π½Π°ΡΠΈΠΌΠΎΠ΅ ΠΈΠΌΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Pynode. ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½ΠΎΠ΄ΠΎΠ² Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΊΠ°ΠΊ raindrops.py Π² ΡΠ°ΠΉΠ»Π΅ raindrops.blend. ΠΡΠΈΠΌΠ΅Ρ ΠΊΠ°Π΄ΡΠ° ΠΈΠ· Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ΅:
ΠΡΠΈΠΌΠ΅Ρ Π½ΠΎΠ΄ΠΎΠ²ΠΎΠΉ ΡΠ΅ΡΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ΅:
ΠΡΠΎΠ·ΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π²Π°Π» β ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π», Π·Π°Π²ΠΈΡΠΈΠΌΡΠΉ ΠΎΡ Π½Π°ΠΊΠ»ΠΎΠ½Π°
Π ΠΠ»Π΅Π½Π΄Π΅ΡΠ΅ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ°ΠΊΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ΅ΡΡΠ½ΠΎΡΡΡ (ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΡ, ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² ΡΠ΅ΠΆΠΈΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π²ΡΠ±Π΅ΡΠΈΡΠ΅ Π²ΡΡ, Π·Π°ΡΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅ ΡΡΠ°ΠΊΡΠ°Π»ΡΠ½ΠΎ W > 3). ΠΡΠ»ΠΈ ΠΡ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ΅Π³ΠΎ-ΡΠΎ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ, ΠΠ°ΠΌ Π² ΠΏΠΎΠΌΠΎΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ ΡΠΊΡΠΈΠΏΡΠΎΠ² (ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, http://sites.google.com/site/androcto/Home/python-scripts/ANTLandscape_104b_249.py). ΠΠΎ ΠΊΠ°ΠΊ ΠΡ Π½Π°Π»ΠΎΠΆΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΡΡΡ Π½Π° ΡΠ°ΠΊΡΡ ΠΌΠ΅ΡΡΠ½ΠΎΡΡΡ? Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΈΠ·ΡΡΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄, Π²ΡΠ±ΠΈΡΠ°ΡΡΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ Π²Ρ ΠΎΠ΄Π°ΠΌΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°, ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π° Π²Π΅Π»ΠΈΡΠΈΠ½Π΅ ΡΠ³Π»Π° Π½Π°ΠΊΠ»ΠΎΠ½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π·Π°ΡΠ΅Π½ΡΠ΅ΠΌ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ΅ΠΊΡ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΠ΅Π½Ρ ΠΊΡΡΡΡΠ΅ ΠΎΡΠΊΠΎΡΡ ΠΎΠ±ΡΡΠ½ΠΎ Π»ΠΈΡΠ΅Π½Ρ Π·Π΅Π»Π΅Π½ΠΈ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΈΡΡ Π½ΠΈΠΆΠ΅ Π»ΠΈΠ½ΠΈΠΈ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π². Π ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ Ρ Π²ΡΡΠΎΡΠΎ-Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠΌ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΡΠ΅Π½ΠΈΡΡ Π³ΠΎΡΠΈΡΡΡΡ ΠΌΠ΅ΡΡΠ½ΠΎΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ±Π΅Π΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ.
Π£ΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ:
Pynodes Π² Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ Π·Π°ΡΡΠ°ΡΠ½Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΏΠΈΠΊΡΠ΅Π»Ρ. Π£ΠΌΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π΅ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ-Π½Π°-Π»Π΅ΡΡ (just-in-time compiler). psyco ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ ΠΈ, ΠΌΡ ΡΡΠΎΠ»ΠΊΠ½Π΅ΠΌΡΡ Ρ Π½ΠΈΠΌ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π³Π»Π°Π²Π΅, Π³Π΄Π΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΅Π³ΠΎ Π½Π° Pynodes ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΈΠΌΠ΅Π΅Ρ Π»ΠΈ ΠΎΠ½ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π·Π°ΠΌΠ΅ΡΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ.
Π£ΠΊΠ»ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ ΡΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΡΡ ΠΏΠΎΠ»Π° ΠΈ ΠΊΠ°ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π² ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠ΅ΠΉ Π½Π°Ρ ΡΠΎΡΠΊΠ΅.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π½Π°ΡΡ (Π²ΠΎΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΡ) ΠΏΠ»ΠΎΡΠΊΠΎΡΡΡ ΠΏΠΎΠ»Π° Π²ΡΡΡΠ½ΡΡΠΎΠΉ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎ Π²Π΄ΠΎΠ»Ρ ΠΎΡΠ΅ΠΉ x ΠΈ y, ΡΡΠΎΡ ΡΠ³ΠΎΠ» ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ z-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΉ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΠΊ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π² ΡΡΠΎΠΉ ΠΆΠ΅ ΡΠΎΡΠΊΠ΅. Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΡΡΠΎΡ ΡΠ³ΠΎΠ» ΡΠΎΡΠ½ΠΎ (ΡΡΠΎ arcsin(z/βx2+y2) ), Π½ΠΎ, ΠΊΠ°ΠΊ Ρ ΡΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ°ΠΌ, Π½Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°Ρ ΠΎΡΠ΅ΡΡΡ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π±Π΅ΡΠ΅ΠΌ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ z-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΠΊ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΡ Π²ΡΡ ΠΎΠ΄Π½ΡΡ ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ Π½ΠΎΠ΄Π° color ramp, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΌ Π½ΡΠ°Π²ΠΈΡΡΡ. Π ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ Pynode, Π½ΠΎΡΠΌΠ°Π»Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ: self.input.shi.surfaceNormal. ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠ΅...
ΠΠΎΡΠΌΠ°Π»Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π² ΡΠ°ΡΠΏΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΊΠ°ΠΌΠ΅ΡΡ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π½ΠΎΡΠΌΠ°Π»Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΡΠΌΠΎ Π² ΠΊΠ°ΠΌΠ΅ΡΡ, ΠΎΠ½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ (0, 0,-1). Π Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π°ΡΡ Π½ΠΎΡΠΌΠ°Π»Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π² ΠΌΠΈΡΠΎΠ²ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅. ΠΠΎΡΠΌΠ°Π»Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΡΠΌΠΎ Π²Π²Π΅ΡΡ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ (0,0,1) Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ»ΠΈ Π½Π°ΠΊΠ»ΠΎΠ½Π° ΠΊΠ°ΠΌΠ΅ΡΡ (Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΡΠ°ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π½Π° Π³ΠΎΡΠ½ΠΎΠΌ ΡΠΊΠ»ΠΎΠ½Π΅ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ³Π»Π° ΠΊΠ°ΠΌΠ΅ΡΡ). Π ΡΡΠ°ΡΡΡΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΌΠΈΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π²Π·ΡΠ² ΠΌΠ°ΡΡΠΈΡΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΌΠΈΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈ ΡΠΌΠ½ΠΎΠΆΠΈΠ² Π½ΠΎΡΠΌΠ°Π»Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π½Π° Π²ΡΠ°ΡΠ°ΡΡΡΡ ΡΠ°ΡΡΡ ΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ. Π Π΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ Π½Π° ΡΡΠΎ:
class Slope(Node.Scripted):
def __init__(self, sockets):
sockets.output = [Node.Socket('SlopeX', val = 1.0),
Node.Socket('SlopeY', val = 1.0),
Node.Socket('SlopeZ', val = 1.0),]
self.offset = vec([1,1,1])
self.scale = 0.5
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΊΠΎΠ΄ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π²Ρ ΠΎΠ΄Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ². ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½ΠΎΡΠΌΠ°Π»Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΏΠΈΠΊΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π·Π°ΡΠ΅Π½ΡΠ΅ΠΌ, ΠΈΠ· Π²Ρ ΠΎΠ΄Π° shader (Π²ΡΠ΄Π΅Π»Π΅Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΠΊΠΎΠ΄Π°). ΠΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΡΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π²ΡΡ ΠΎΠ΄Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠ° Π΄Π»Ρ x, y, ΠΈ z ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π°ΠΊΠ»ΠΎΠ½Π° Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² Π½ΠΎΠ΄ΠΎΠ²ΠΎΠΉ ΡΠ΅ΡΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ, ΠΏΠΎ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ z-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π°ΠΊΠ»ΠΎΠ½Π°, ΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΠΌΠ΅ΡΡ Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΡΠΎΠΊΠ΅ΡΠ΅, Π½Π°ΠΌ Π½Π΅ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π΅Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ· Π²Π΅ΠΊΡΠΎΡΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π½ΠΎΠ΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Π΅ΠΊΡΠΎΡΠ°.