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

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

Автор Michel Anders

def topi(a,h,i):

    m = a%(2*pi)

    r=0.0

    if m<h: r=i

    return r

pydriver-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для ΠΊΠ°Π½Π°Π»Π° энСргии (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ "Energ" Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠšΡ€ΠΈΠ²Ρ‹Ρ… IPO), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    p.topi(ob('DriveShaftPart').RotX/2+m.pi,0.3,0.5)

Как Π²ΠΈΠ΄Π½ΠΎ, это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ запустит «огонь» Π² свСчС заТигания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 17 градусах (0.3 Ρ€Π°Π΄ΠΈΠ°Π½), установив ΡΠ½Π΅Ρ€Π³ΠΈΡŽ для этого Ρ†ΠΈΠΊΠ»Π° Π² 0.5 .


Π‘ΠΎΠ»ΡŒΡˆΠ΅ мощности β€” ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€ΠΎΠ² Π² Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ смодСлировали ΠΎΠ΄ΠΈΠ½ Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€ ΠΈ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈΡΡŒ ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… частСй, нашим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€ΠΎΠ², для создания ΠΌΠΎΡ‚ΠΎΡ€Π° ΠΊΠ°ΠΊ Π½Π° Π²Π²ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ этой Π³Π»Π°Π²Ρ‹. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ всС ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΆΠ°Π²  Shift + D, ΠΎΡ‚Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π² врСмя срабатывания ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ IPO-ΠΊΠ°Π½Π°Π»Π°.

Но Π΅ΡΡ‚ΡŒ прСпятствиС. Если ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Shift + D, вмСсто Alt + D ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ мСшСй ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ссылкой Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ скопировали ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹, тСкстуры ΠΈ IPO. Π‘Π»Π΅Π½Π΄Π΅Ρ€, ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, копируя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π­Ρ‚ΠΎ получится Π½Π΅ΡƒΠΊΠ»ΡŽΠΆΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ IPO ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ€ΡˆΠ½Ρ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΠ»ΠΎ Π±Ρ‹ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅.

ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ впослСдствии (Π½Π°ΠΆΠ°Π² Π½Π° ΠΏΠΎΠ»Π΅ количСства ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ этих ΠΊΡ€ΠΈΠ²Ρ‹Ρ… IPO, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠ² своё согласиС со Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ вопросом make single user?), Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ слишком ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ это для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. 




Π›ΡƒΡ‡ΡˆΠΈΠΌ способом Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ настройки копирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Duplicate with object) Π² ΠΏΠ°Π½Π΅Π»ΠΈ Edit Methods, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Π²Ρ‹ΡˆΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΡ€ΠΈΠ²Ρ‹Π΅ IPO, связанныС с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹ Π² ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ нашСй Ρ€Π°Π±ΠΎΡ‚Ρ‹, Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€ΠΎΠ²Ρ‹ΠΉ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΉ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ Π²Π΅Π΄ΡƒΡ‰Π΅Π³ΠΎ Π²Π°Π»Π° ΠΊ ΠΏΠΎΡ€ΡˆΠ½ΡΠΌ доступСн ΠΊΠ°ΠΊ engine001.blend. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ доступной ΠΏΠΎ адрСсу http://vimeo.com/7170769, ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅.




Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ простых ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ (Constraints) ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈ костям. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ добавляСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° append() Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° constraints. Наш ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ стрСлок часов ΠΈΠ· rigged clock (Π“Π»Π°Π²Π° 3, Π“Ρ€ΡƒΠΏΠΏΡ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹) для вращСния Π²ΠΎΠΊΡ€ΡƒΠ³ оси Z. Код, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для достиТСния поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ начинаСтся с Π΄Π²ΡƒΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ import, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ Π΄Π»ΠΈΠ½Ρƒ ΠΊΠΎΠ΄Π°:

from Blender.Constraint import Type

from Blender.Constraint import Settings

Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: obbones, ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π°, Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€ΠΎΠΉ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρ‹ нСпосрСдствСнно) ΠΈ  bone, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ кости, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ. Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ связываСм с ΠΊΠΎΡΡ‚ΡŒΡŽ, являСтся Π½Π΅ свойством Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρ‹, Π° ΠΏΠΎΠ·ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, содСрТащСго Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρƒ.  ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅  Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Π΅, ΠΈ всС ΠΏΠΎΠ·Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ связаны с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΊ Ρ‚ΠΎΠΉ ΠΆΠ΅ самой Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Π΅, смогут ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΠ·Ρ‹.

Π˜Ρ‚Π°ΠΊ, стартуя, функция сначала ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΠΎΠ·Ρƒ, Π° Π·Π°Ρ‚Π΅ΠΌ ссылку Π½Π° ΠΊΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ. ВыдСлСнная строка ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ (это Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΌΡ‹ связывали ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° вмСсто кости):

def zrotonly(obbones,bone):

    poseob = obbones.getPose()

    bigarmpose = poseob.bones[bone]

    c=bigarmpose.constraints.append(Type.LIMITROT)

     c[Settings.LIMIT]=Settings.LIMIT_XROT|

                          Settings.LIMIT_YROT

    c[Settings.XMIN]=0.0

    c[Settings.XMAX]=0.0

    c[Settings.YMIN]=0.0

    c[Settings.YMAX]=0.0

    poseob.update()

Π’Π½ΠΎΠ²ΡŒ присоСдинСнноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ сохраняСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ c ΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ…  строках Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ограничСния, становятся доступны ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ настраиваСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ LIMIT (это битовая маска), для ограничСния вращСния ΠΏΠΎ осям X ΠΈ Y. Π”Π°Π»Π΅Π΅, ΠΌΡ‹ устанавливаСм минимальноС ΠΈ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ вращСния Π²ΠΎΠΊΡ€ΡƒΠ³ этих осСй Ρ€Π°Π²Π½Ρ‹ΠΌ 0.0, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ останавливаСм любоС Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅. НапримСр, Π² Ρ€ΠΈΠ³Π³ΠΈΠ½Π³Π΅ рСалистичного скСлСта ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ΠΎ этими значСниями ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ вращСния ΠΊ значСниям, сопоставимыми с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ соСдинСниями ΠΌΠ΅ΠΆΠ΄Ρƒ костями. И Π² ΠΊΠΎΠ½Ρ†Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ измСнСния pose (ΠΏΠΎΠ·Ρ‹) Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ, ΠΌΡ‹ обращаСмся ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ update().


ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ слоТныС ограничСния

Π’Π°ΠΌ, Π³Π΄Π΅ pydrivers ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ IPO-ΠΊΡ€ΠΈΠ²ΠΎΠΉ посрСдством измСнСния Π΄Ρ€ΡƒΠ³ΠΎΠΉ, PyConstraints (ΠΏΠΈΡ‚ΠΎΠ½-ограничСния) ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π°ΠΌ способы Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ измСнСния свойств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€ встроСно ΠΌΠ½ΠΎΠ³ΠΎ простых ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, ΠΈ часто ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ простых ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ достаточно для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. Но Ссли Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наши ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π»ΠΈΡΡŒ с мСста Π½Π° мСсто свободно Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π½Π΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ области, Π° Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для упрощСния размСщСния свСтофоров ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½Ρ‹Ρ… Π±ΡƒΠ΄ΠΎΠΊ ΠΏΠΎ сСткС ΡƒΠ»ΠΈΡ†. Как ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ этого? Π’Π²Π΅Π΄ΠΈΡ‚Π΅ pyconstraints.

PyConstraints - ΠŸΠΈΡ‚ΠΎΠ½-скрипты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ тСкстовыС Π±Π»ΠΎΠΊΠΈ Π² тСкстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ со строки коммСнтария, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ… ΠΊΠ°ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅:

#BPYCONSTRAINT

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ doConstraint(), doTarget(), ΠΈ getSettings(). ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²e Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² любоС врСмя, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΈΠ»ΠΈ Ρ†Π΅Π»ΡŒ, ΠΈΠ»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° послСдняя функция вызываСтся Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‰Π΅Π»ΠΊΠ°Π΅Ρ‚ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Options, которая появляСтся, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±Ρ€Π°Π» pyconstraint. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ pyconstraint.




Π‘Π°ΠΌΡ‹ΠΉ Π»Π΅Π³ΠΊΠΈΠΉ ΠΏΡƒΡ‚ΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ β€” ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ встроСнный шаблон ограничСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС основы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ наши собствСнныС ограничСния. Он доступСн Π² тСкстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΏΠΎ мСню Text | Script Templates | Script Constraint. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ этого мСню Π±ΡƒΠ΄Π΅Ρ‚ создан Π½ΠΎΠ²Ρ‹ΠΉ тСкстовый Π±Π»ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ спискС Π²Π½ΠΈΠ·Ρƒ ΠΎΠΊΠ½Π° тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°.


Π¨Π°Π±Π»ΠΎΠ½ ограничСния Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€Π΅

Π¨Π°Π±Π»ΠΎΠ½  ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ содСрТит Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², Π½ΠΎ здСсь ΠΌΡ‹ пСрСчислим, ΠΏΠΎ большСй части Π³ΠΎΠ»Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, шаблон создаСт ΠΎΠΊΠ½ΠΎ с Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ свойствами. ΠœΡ‹ столкнСмся со свойствами Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getSettings() здСсь Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ пуст. Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ  Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½ΠΈΡ‡Π΅Π³ΠΎ фактичСски Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ. РасполоТСниС, Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅, ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π± ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° останутся Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

def doConstraint(obmatrix, targetmatrices, idprop):

    # Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ прСобразования для быстрого

    # доступа.

    obloc = obmatrix.translationPart() # ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅

    obrot = obmatrix.toEuler()         # Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅

    obsca = obmatrix.scalePart()       # ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

    # ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ мСняСт ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ

    # ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, располоТСн здСсь  

    # ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ полоТСния, вращСния,

    # ΠΌΠ°ΡΡˆΡ‚Π°Π±Π°,

    mtxloc = Mathutils.TranslationMatrix(obloc)

    mtxrot = obrot.toMatrix().resize4x4()

    mtxsca = Mathutils.Matrix([obsca[0],0,0,0],

[0,obsca[1],0,0],

               [0,0,obsca[2],0], [0,0,0,1])

    # РСкомбинация ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ

    # прСобразования.

    outputmatrix = mtxsca * mtxrot * mtxloc

    # Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ.

    return outputmatrix

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

ΠŸΠ΅Ρ€Π²Π°Ρ Π²Π΅Ρ‰ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ, - выдСляСм ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ прСобразования β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅, Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅, ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π± ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π§Π°ΡΡ‚ΡŒΡŽ пСрСмСщСния Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ полоТСния x, y, z, Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… коэффициСнтов вдоль осСй x, y, z. Π§Π°ΡΡ‚ΡŒ вращСния Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСна Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Π­ΠΉΠ»Π΅Ρ€Π° с Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ‚Ρ€Π΅Ρ… основных осСй. (ΡƒΠ³Π»Ρ‹ Π­ΠΉΠ»Π΅Ρ€Π° ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с вращСниями Π² Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΠΎΠΌ пространствС, Π½ΠΎ ΠΏΠΎ Π½Π°Ρ‡Π°Π»Ρƒ ΡΠ²Π»ΡΡŽΡ‚ΡΡ довольно Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹ΠΌΠΈ для понимания. Π’ Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π° эту Ρ‚Π΅ΠΌΡƒ http://ru.wikipedia.org/wiki/Π£Π³Π»Ρ‹_Π­ΠΉΠ»Π΅Ρ€Π°, Π½ΠΎ ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ Π»Π΅Π³Ρ‡Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ ΡƒΠ³Π»Π°Ρ… Π­ΠΉΠ»Π΅Ρ€Π° ΠΊΠ°ΠΊ ΠΎ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ Π²ΠΎΠΊΡ€ΡƒΠ³ осСй x, y, z. Π£Π³Π»Ρ‹ Π­ΠΉΠ»Π΅Ρ€Π° Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹? Π’ΠΎΡ‚ ΠΎΡ‚ ΠΊΠ²Π°Ρ‚Π΅Ρ€Π½ΠΈΠΎΠ½ΠΎΠ² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ·Π³ взрываСтся! - Π²ΠΎΠ·ΠΌΡƒΡ‰Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€.) ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ прСобразования Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ прСобразования ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎ своСму ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ.