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

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

Автор Michel Anders

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ скриптсвязи Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ (ΠΎΠΊΠ½ΠΎ Кнопок | панСль Scripts | Scriptlinks. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ Π½Π° Enable Script Links, Ссли это Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ сдСлано). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π‘Π»Π΅Π½Π΄Π΅Ρ€Ρƒ всС Ρ€Π°Π²Π½ΠΎ, ΠΈΠΌΠ΅Π΅ΠΌ Π»ΠΈ ΠΌΡ‹ Π΄Π΅Π»ΠΎ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ пространства ΠΈΠ»ΠΈ скриптсвязями, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.

ПослСдним шагом Π² использовании нашСго ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° пространства Π±ΡƒΠ΄Π΅Ρ‚ ассоциация Π΅Π³ΠΎ с 3D-Π²ΠΈΠ΄ΠΎΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Draw: AuraSpaceHandler.py Π² мСню View - Space Handler Scripts ΠΎΠΊΠ½Π° 3D-Π²ΠΈΠ΄Π°.



ИспользованиС Ρ‚Π΅ΠΌ

Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с фактичСским рисованиСм подсвСтки ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Π΅Ρ€ΡˆΠΈΠ½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ выдСляСм. Он начинаСтся с опрСдСлСния Ρ†Π²Π΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для подсвСтки, ΠΈ тСкста, извлСкая ΠΈΡ… ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Π΅ΠΌΡ‹. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ эти Ρ†Π²Π΅Ρ‚Π° ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ способом ΠΈΠ· ΠΎΠΊΠ½Π° ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… настроСк:

theme     = Window.Theme.Get()[0]

textcolor = [float(v)/255 for v in theme.get(

             Window.Types.VIEW3D ).text_hi[:3]]

color     = [float(v)/255 for v in

             theme.get(Window.Types.VIEW3D).active[:3]]

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС извлСкаСтся список Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈΠ· Π½ΠΈΡ… являСтся Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠΎΠΉ. Из этой Ρ‚Π΅ΠΌΡ‹ ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ пространство VIEW3D, ΠΈ Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ text_hi являСтся списком ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ…, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ Ρ†Π²Π΅Ρ‚ RGBA. ΠœΡ‹ удаляСм ΠΈΠ· списка Π°Π»ΡŒΡ„Π°-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π² список Ρ‚Ρ€Π΅Ρ… чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (floats) Π² Π΄ΠΈΠΏΠ°Π·ΠΎΠ½Π΅ [0, 1], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ°ΠΊ Ρ†Π²Π΅Ρ‚ нашСго тСкста. Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ создаСм Ρ†Π²Π΅Ρ‚ подсвСтки ΠΈΠ· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° active.

НашСй ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ подсвСтку Π² Ρ„ΠΎΡ€ΠΌΠ΅ диска Π² спСцифичСском мСстС. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ диска совсСм нСбольшой (Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ size), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π°ΠΏΠΏΡ€ΠΎΠΊΡΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ„ΠΎΡ€ΠΌΠΎΠΉ Π²ΠΎΡΡŒΠΌΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠœΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ список ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ x ΠΈ y Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²ΠΎΡΡŒΠΌΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π² список diskvertices:

size=0.2

diskvertices=[( 0.0, 1.0),( 0.7, 0.7),

              ( 1.0, 0.0),( 0.7,-0.7),

              ( 0.0,-1.0),(-0.7,-0.7),

              (-1.0, 0.0),(-0.7, 0.7)]


def drawDisk(loc):

   BGL.glBegin(BGL.GL_POLYGON)

   for x,y in diskvertices:

      BGL.glVertex3f(loc[0]+x*size,loc[1]+y*size,loc[2])

   BGL.glEnd()

Π‘Π°ΠΌΠΎ рисованиС Π²ΠΎΡΡŒΠΌΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° сильно зависит ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, прСдоставляСмых ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° BGL (Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅). ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с установки Ρ€Π΅ΠΆΠΈΠΌΠ° рисования ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π·Π°Ρ‚Π΅ΠΌ добавляСм Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π² спискС diskvertices. ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ, пСрСданная Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ drawDisk(), Π±ΡƒΠ΄Π΅Ρ‚ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ, Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π² ΠΊΡ€ΡƒΠ³Π΅ с радиусом, Ρ€Π°Π²Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ size. Когда ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ glEnd(), Π±ΡƒΠ΄Π΅Ρ‚ нарисован ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рисования Π·Π½Π°ΡŽΡ‚, ΠΊΠ°ΠΊ пСрСвСсти мСстополоТСниС Π² 3D Π² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π½Π° экранС, ΠΈ Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большС, Ρ‡Π΅ΠΌ каТСтся Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΠΊΠΎΠ΄Π°. НСобходимая функция, вызываСмая для сообщСния графичСской систСмС, ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ 3D-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ экрана, Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ drawDisk() (Π² ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ кускС ΠΊΠΎΠ΄Π°). Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ вычислСниС этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ диска Π΄ΠΎΠ»ΠΆΠ½ΠΎ привСсти ΠΊ лишнСй ΠΏΠΎΡ‚Π΅Ρ€Π΅ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эта информация одинаковая для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ диска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ рисуСм.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ drawAuras(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список locations (ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ) ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ groupname (имя Π³Ρ€ΡƒΠΏΠΏΡ‹, строкового Ρ‚ΠΈΠΏΠ°). Она вычислит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ прСобразования, Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ drawDisk() для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² спискС, ΠΈ, Π·Π°Ρ‚Π΅ΠΌ, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ имя Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΊΠ°ΠΊ Π½Π°-ΡΠΊΡ€Π°Π½Π½ΡƒΡŽ этикСтку ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ справа ΠΎΡ‚ Ρ†Π΅Π½Ρ‚Ρ€Π° подсвСтки. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° Window прСдоставляСт Π½Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ  GetPerspMatrix(), которая ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ прСобразования Ρ‚ΠΎΡ‡ΠΊΠΈ Π² пространствС 3D Π² Ρ‚ΠΎΡ‡ΠΊΡƒ Π½Π° экранС. Π­Ρ‚Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 4x4 являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠŸΠΈΡ‚ΠΎΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² СдинствСнный список чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠ³Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ графичСская систСма. Π’Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ строки Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ заботятся ΠΎΠ± этом. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ строки ΡΠ±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ Ρ€Π΅ΠΆΠΈΠΌ проСцирования ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ графичСской систСмС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€ΡΠΏΠ΅ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ для вычислСния экранных ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этих Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² проСцирования ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… настроСк Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π½Π΅ влияСт Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ сам Π‘Π»Π΅Π½Π΄Π΅Ρ€ рисуСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π° экранС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эти настройки ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ нашСго скрипта ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ впослСдствии:

def drawAuras(locations,groupname):

   viewMatrix = Window.GetPerspMatrix()

   viewBuff = [viewMatrix[i][j] for i in xrange(4) 

               for j in xrange(4)]

   viewBuff = BGL.Buffer(BGL.GL_FLOAT, 16, viewBuff)

   BGL.glLoadIdentity()

   BGL.glMatrixMode(BGL.GL_PROJECTION)

   BGL.glLoadMatrixf(viewBuff)

   BGL.glColor3f(*color)

   for loc in locations:

      drawDisk(loc)

   n=len(locations)

   if n>0:

      BGL.glColor3f(*textcolor)

      x=sum([l[0] for l in locations])/n

      y=sum([l[1] for l in locations])/n

      z=sum([l[2] for l in locations])/n

      BGL.glRasterPos3f(x+2*size,y,z)

      Draw.Text(groupname,'small')

По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ рисуСм наши диски с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ glColor3f(). Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ сохранили Ρ†Π²Π΅Ρ‚ Π² Π²ΠΈΠ΄Π΅ списка Ρ‚Ρ€Π΅Ρ… чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π° функция glColor3f() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΌΡ‹ распаковываСм этот список с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΈ. Π—Π°Ρ‚Π΅ΠΌ, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ drawDisk() для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² спискС locations.

OpenGL Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π°:

ДокумСнтация ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° BGL Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OpenGL. МногиС ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² большом количСствС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ дСйствиС, Π½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ   способами.   НапримСр, BGL.glRasterPos3f() тСсно   связана   с BGL.glRasterPos3fv(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Ρ‚Ρ€Π΅Ρ… чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ точности вмСсто Ρ‚Ρ€Π΅Ρ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π—Π° подробностями ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ API ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Blender.BGL ΠΈ Blender.Draw ΠΈ ΠΊ справочнику ΠΏΠΎ OpenGL Π½Π° http://www.opengl.org/sdk/docs/man/.

Если число подсвСток, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ нарисовали, Π½Π΅ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅, ΠΌΡ‹ Π·Π°Π΄Π°Ρ‘ΠΌ Ρ†Π²Π΅Ρ‚ рисования Π² textcolor ΠΈ Π·Π°Ρ‚Π΅ΠΌ вычисляСм срСдниС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ всСх подсвСчиваСмых Π²Π΅Ρ€ΡˆΠΈΠ½. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ glRasterPos3f(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ тСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π² этих усрСднённых ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… с нСбольшим пространством, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ ΠΊ x-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ тСкст Π²ΠΏΡ€Π°Π²ΠΎ. Π—Π°Ρ‚Π΅ΠΌ функция Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° Draw.Text() ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ имя Π³Ρ€ΡƒΠΏΠΏΡ‹ нСбольшим ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ Π² Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ.


Π‘Π½ΠΎΠ²Π° ΠΎ ΠΌΠ΅ΡˆΠ°Ρ… β€” созданиС ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΎΠ²

Π₯отя мягкиС Ρ‚Π΅Π»Π° (softbody) ΠΈ ΠΈΠΌΠΈΡ‚Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‚ΠΊΠ°Π½ΠΈ (cloth), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ доступны Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€Π΅, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ситуациях Π΄Π΅Π»Π°ΡŽΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ, ΠΈΠ½ΠΎΠ³Π΄Π° Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΠΌΠ΅Ρ‚ΡŒ большС управлСния Π½Π°Π΄ процСссом Π΄Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ мСша, ΠΈΠ»ΠΈ Π’Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ спСцифичСскоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ совсСм Π½Π΅ ΠΎΡ…Π²Π°Ρ‡Π΅Π½ΠΎ встроСнными систСмами симуляции Π‘Π»Π΅Π½Π΄Π΅Ρ€Π°. Π­Ρ‚ΠΎ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π΄Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ мСша, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ коснулся, Π½ΠΎ Π½Π΅ ΠΏΠΎΡ€Π²Π°Π» Π΄Ρ€ΡƒΠ³ΠΎΠΉ мСш. Оно Π½Π΅ смоТСт Π±Ρ‹Ρ‚ΡŒ физичСски Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ. ΠœΡ‹ стрСмимся ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ вСроятныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для Ρ‚Π²Π΅Ρ€Π΄Ρ‹Ρ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΡ…ΡΡ Π»Π΅Π³ΠΊΠΎ Π΄Π΅Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΈΠ»ΠΈ ΠΊΠ»Π΅ΠΉΠΊΠΎΠΉ повСрхности, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ°Π»Π΅Ρ†, ΠΏΡ€ΠΎΠ΄Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ масло, ΠΈΠ»ΠΈ колСсо, Π΅Π΄ΡƒΡ‰Π΅Π΅ ΠΏΠΎ мягкой ΠΎΠ±ΠΎΡ‡ΠΈΠ½Π΅.

На рисункС Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ нСсколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΎΠ². Π”ΠΎΡ€ΠΎΠΆΠΊΠΈ созданы Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ катящСйся Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΡˆΠΈΠ½Ρ‹ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ плоскости:



Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΠΌΡ‹ обратимся ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, мСш ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС исходного, ΠΈ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠΌ Π΄Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² качСствС Ρ†Π΅Π»ΠΈ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС, это ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ (constraint) ΠΈ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ эти Π΄Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ pycontraints. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ исполнимым, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ограничСния ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° исходный мСш ΠΈΠ»ΠΈ Ρ†Π΅Π»ΠΈ Π΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ; этим самым вызываСтся интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΌΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ остановкам, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ расчСт пСрСсСчСний ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Π΄Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ мСшСй Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ интСнсивных вычислСний. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π³Π΄Π΅ ΠΌΡ‹ вычисляСм ΠΈ ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° смСняСтся ΠΊΠ°Π΄Ρ€.

Наш скрипт прСдоставит нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½:

β€’ Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΈ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠ°Π΄Ρ€Π°