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

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

Автор Michel Anders

Ѐункция, показанная здСсь, Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ прСобразования ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ API (Π³Π΄Π΅ это доступно), ΠΈ Π·Π°Ρ‚Π΅ΠΌ Ρ€Π΅ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, которая впослСдствии возвращаСтся.

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

def doTarget(target_object, subtarget_bone, target_matrix,

             id_properties_of_constraint):

    return target_matrix

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, Ссли Π½Π΅Ρ‚ нСобходимости ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ   ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ   Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅   свойства, getSettings(), ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ просто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return (Π²ΠΎΠ·Π²Ρ€Π°Ρ‚). Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ мСню, getSettings() - Ρ‚ΠΎ мСсто, Π³Π΄Π΅ это Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ "ничСгонСдСлания":

def getSettings(idprop):

    return


Π’Ρ‹ Ρ‚ΠΎΠΆΠ΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ мСня ΠΏΡ€ΠΈΡ‚ΡΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ?

Когда Π›ΡƒΠ½Π° ΠΈ ЗСмля Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π²ΠΎΠΊΡ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°, каТдая ΠΈΠ· Π½ΠΈΡ… чувствуСт Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ притяТСниС Π΄Ρ€ΡƒΠ³ΠΎΠΉ. На Π·Π΅ΠΌΠ»Π΅ это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΈΠ»ΠΈΠ²Π°ΠΌ ΠΈ ΠΎΡ‚Π»ΠΈΠ²Π°ΠΌ, Π½ΠΎ Ρ‚Π²Π΅Ρ€Π΄Ρ‹Π΅ Ρ‚Π΅Π»Π° Π—Π΅ΠΌΠ»ΠΈ ΠΈ Π›ΡƒΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ исказятся, хотя этот эффСкт нСбольшой. Π’Π΅ΠΏΠ΅Ρ€ΡŒ извСстно Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС ΠΎ ΠΏΡ€ΠΈΠ»ΠΈΠ²Π°Ρ… ΠΈ ΠΎΡ‚Π»ΠΈΠ²Π°Ρ…, Ρ‡Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ притяТСниС (http://ru.wikipedia.org/wiki/ΠŸΡ€ΠΈΠ»ΠΈΠ²_ΠΈ_ΠΎΡ‚Π»ΠΈΠ²), Π½ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ искаТСния Π² Π³ΠΈΠΏΠ΅Ρ€Ρ‚Ρ€ΠΎΡ„ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.

Один ΠΈΠ· способов ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ TrackTo, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ось нашСго ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ ΠΏΡ€ΠΈΡ‚ΡΠ³ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ вдоль этой оси. Π’Π΅Π»ΠΈΡ‡ΠΈΠ½Π° ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ зависима ΠΎΡ‚ расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π­Ρ„Ρ„Π΅ΠΊΡ‚ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅, Π³Π΄Π΅ эффСкт ограничСния TrackTo объСдинСн со скриптовым ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ moon_constraint.py.




ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ это зависимоС ΠΎΡ‚ расстояния ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Если ΠΌΡ‹ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ шаблон ограничСния, прСдоставляСмый Π‘Π»Π΅Π½Π΄Π΅Ρ€ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ doTarget() ΠΈ getSettings() ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, Π½ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ doConstraint() (ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ доступСн ΠΊΠ°ΠΊ moon_constraint.py):

def doConstraint(obmatrix, targetmatrices, idprop):

    obloc = obmatrix.translationPart() # ПолоТСниС

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

    obsca = obmatrix.scalePart()       # ΠœΠ°ΡΡˆΡ‚Π°Π±


    tloc = targetmatrices[0].translationPart()

    d = abs((obloc-tloc).length)

    d = max(0.01,d)

    f = 1.0+1.0/d

    obsca[1]*=f


    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

ΠœΡ‹ пропустили всС строки, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ свойствам, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… настраиваСмых ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ свойств для этого ограничСния. Π’Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ строки ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ для вычислСния зависимого ΠΎΡ‚ расстояния ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ.

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

ЦикличСская Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ:

Если ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΡΡ€Π°Π²Π½ΠΈΠΌΡƒΡŽ массу, Π³Ρ€Π°Π²ΠΈΡ‚Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ искаТСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ сравнимого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΠΎΠ±ΠΎΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…. Π£ нас ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ ΠΈΡΠΊΡƒΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ  ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ TrackTo ΠΈ moon_constraint.py ΠΊ ΠΎΠ±ΠΎΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ эффСкт воздСйствия ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π°, Π½ΠΎ, ΠΊ Π½Π΅ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это создаст Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΈ Π‘Π»Π΅Π½Π΄Π΅Ρ€ запротСстуСт.


ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌ мСша

Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ€Π΅ΠΆΠΈΠΌ "snap to vertex" (привязка ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ доступСн Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€Π΅ ΠΈΠ· мСню Object | Transform | Snap (ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ   ΠΎ   привязках   смотритС   Ρ‚ΡƒΡ‚: http://wiki.blender.org/index.php/Doc:Manual/Modelling/Meshes/Snap_to_ Mesh), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ эффСкт Π½Π΅ постоянный (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ вСрнётся Π² свою ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ) ΠΈ силу ограничСния ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (Π΄Π°ΠΆΠ΅ Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ), измСняя Π΄Π²ΠΈΠΆΠΎΠΊ Influence (ВлияниС).

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

ΠŸΡƒΡ‚ΡŒ Π² ΠΎΠ±Ρ…ΠΎΠ΄ этого прСпятствия - Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ idprop, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаётся Π²  doConstraint(). ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ doConstraint(), Π‘Π»Π΅Π½Π΄Π΅Ρ€ сначала Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ doTarget() для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚Π° функция пСрСдаётся Π² Π²ΠΈΠ΄Π΅ ссылки Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π² свойства ограничСния. Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ссылку Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² эти свойства, ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти свойства ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² doConstraint(), это обСспСчиваСт нас срСдствами для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² doConstraint() для получСния МСш-Π΄Π°Π½Π½Ρ‹Ρ…. Π•ΡΡ‚ΡŒ ΠΌΠ΅Π»ΠΎΡ‡ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ всё-ΠΆΠ΅ рассмотрим здСсь: свойствами Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ числа ΠΈΠ»ΠΈ строки, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π° самом Π΄Π΅Π»Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ имя являСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ, ΠΈ функция Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° Object.Get() прСдоставляСт способ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, это - Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Код для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ doConstraint() ΠΈ doTarget() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ (ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ находится Π² zoning_constraint.py):

def doConstraint(obmatrix, targetmatrices, idprop):

    obloc = obmatrix.translationPart().resize3D()

    obrot = obmatrix.toEuler()

    obsca = obmatrix.scalePart()

    # ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ мСш

    to = Blender.Object.Get(idprop['target_object'])

    me = to.getData(mesh=1)

    # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ мСстополоТСниС Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

    tloc = targetmatrices[0].translationPart().resize3D()


    # ΠΈΡ‰Π΅ΠΌ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΡƒΡŽ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅

    smallest = 1000000.0

    delta_ob=tloc-obloc

    for v in me.verts:

        d = (v.co+delta_ob).length

        if d < smallest:

            smallest=d

            sv=v

    obloc = sv.co + tloc

    # восстанавливаСм ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

    mtxrot = obrot.toMatrix().resize4x4()

    mtxloc = Mathutils.TranslationMatrix(obloc)

    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

def doTarget(target_object, subtarget_bone, target_matrix,

             id_prop_of_constr):

   id_props_of_constr['target_object']=target_object.name

   return target_matrix

Π’Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ строки ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ имя Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² doConstraint(). Π’ doConstraint() ΠΌΡ‹ сначала ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ мСш. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ являСтся мСшСм, Π½ΠΎ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΉΠΌΠ°Π½ΠΎ Π‘Π»Π΅Π½Π΄Π΅Ρ€ΠΎΠΌ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π’ΠΎΠ³Π΄Π°  ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ станСт Π²ΠΎΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, ошибка Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² консоли, Π½ΠΎ Π‘Π»Π΅Π½Π΄Π΅Ρ€ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ нас Π±ΡƒΠ΄ΡƒΡ‚ мСш-Π΄Π°Π½Π½Ρ‹Π΅ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Нам Π½ΡƒΠΆΠ½ΠΎ это, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Ρ‘. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ сравниваСм ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с позициями всСх Π²Π΅Ρ€ΡˆΠΈΠ½ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ мСша ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΡƒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НаконСц, ΠΌΡ‹ восстанавливаСм ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, объСдиняя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅.