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

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

Автор Michel Anders

   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-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Π½Π°ΠΊΠ»ΠΎΠ½Π°, Ρ‚ΠΎ Ссли ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΅Ρ‘ доступной Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ сокСтС, Π½Π°ΠΌ Π½Π΅ придётся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π΅Ρ‘ извлСчСния ΠΈΠ· Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°.