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

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

Автор Michel Anders

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

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


Π’Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ вдоль Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ смогли ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊ блиТайшСй Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ мСшС, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пропустили: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ сориСнтирован Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ Π½Π΅ всСгда являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π²Π²Π΅Ρ€Ρ…, Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ситуациях Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Ссли Π±Ρ‹ ΠΌΡ‹ смогли ΡΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ  ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрпСндикулярно повСрхности. Π­Ρ‚ΠΎ дСлаСтся Ρ‚Π°ΠΊΠΆΠ΅ для всСх практичСских Ρ†Π΅Π»Π΅ΠΉ, ΠΊΠ°ΠΊ ориСнтация ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вдоль Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ Ρ‚ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ сдСлали привязку.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, послС обнаруТСния блиТайшСй Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, ΠΌΡ‹ опрСдСляСм ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΡŽ ΠΈ осью z (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ опрСдСляСм Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Z ΠΊΠ°ΠΊ 'Π²Π²Π΅Ρ€Ρ…'), Π·Π°Ρ‚Π΅ΠΌ Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΡƒΠ³ΠΎΠ» Π²ΠΎΠΊΡ€ΡƒΠ³ оси, пСрпСндикулярной ΠΊΠ°ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ, Ρ‚Π°ΠΊ ΠΈ оси z. Π­Ρ‚ΠΎ сориСнтируСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ вдоль этой Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ. Если ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Ρ‘Ρ€Π½ΡƒΡ‚ Π΄ΠΎ добавлСния  ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ, эти ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ вращСния Π±ΡƒΠ΄ΡƒΡ‚ потСряны. Если это - Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС вращСния ΠΏΠ΅Ρ€Π΅Π΄ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ограничСния.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выравнивания, наш ΠΊΠΎΠ΄ измСнится (zoning_constraint.py ΡƒΠΆΠ΅ содСрТит эти измСнСния): doConstraint() Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ прСобразования. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΡƒΠ³ΠΎΠ» вращСния, ось вращСния, ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ вращСния. ВыдСлСнная Ρ‡Π°ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ основныС инструмСнты для этих вычислСний ΡƒΠΆΠ΅ прСдусмотрСны ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Mathutils:

vnormal = sv.no

if idprop['NormalAlign'] :

    zunit=Mathutils.Vector(0,0,1)

    a=Mathutils.AngleBetweenVecs(vnormal,zunit)

    rotaxis=zunit.cross(vnormal)

    rotmatrix=Mathutils.RotationMatrix(a,4,"r",rotaxis)

    mtxrot = rotmatrix

else:

    mtxrot = obrot.toMatrix().resize4x4()

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сдСлали Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ зависимым ΠΎΡ‚ свойства NormalAlign. Волько Ссли ΠΎΠ½ΠΎ Π·Π°Π΄Π°Π½ΠΎ, ΠΌΡ‹ вычисляСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getSettings(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½ΡƒΠΆΠ΅Π½ способ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π΅ΠΌΡƒ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ‚:

def getSettings(idprop):

    if not idprop.has_key('NormalAlign'):

       idprop['NormalAlign'] = True


    align = Draw.Create(idprop['NormalAlign'])


    block = []

    block.append("Additional restrictions: ")

    block.append(("Alignment: ",align,

                  "Align along vertex normal"))

    retval = Draw.PupBlock("Zoning Constraint", block)

    if (retval):

        idprop['NormalAlign']= align.val

Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, свойство NormalAlign ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ установлСно Π² True (Π˜ΡΡ‚ΠΈΠ½Π°). ΠžΠΏΡ†ΠΈΡ Π·Π°Ρ‚Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСна ΠΊΠ°ΠΊ простоС Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ мСню с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΌ. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‰Π΅Π»ΠΊΠ°Π΅Ρ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ мСню ΠΈΠ»ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Esc,  PupBlock() Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ None, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ свойство NormalAlign. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ установлСно Π² соотвСтствии со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ.

Π­Ρ„Ρ„Π΅ΠΊΡ‚Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π½Π° ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡΡ…. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‘Π»ΠΊΡƒ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ привязки ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ простой ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ плоскости Π·Π΅ΠΌΠ»ΠΈ. Она привязана Π² Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, Π½ΠΎ ось z ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ Π²Π²Π΅Ρ€Ρ… вдоль глобальной оси z. Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‘Π»ΠΊΡƒ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ Π² скалистом ΠΏΠ΅ΠΉΠ·Π°ΠΆΠ΅.




Если ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ свойство NormalAlign, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ модСль Π΄Π΅Ρ€Π΅Π²Π° большС Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ Π²Π²Π΅Ρ€Ρ…, Π½ΠΎ Ρ‡Ρ‚ΠΎ ось z Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π° вдоль направлСния Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ Ρ‚ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° привязана. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π»ΠΊΡƒ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ вдоль Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ.




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




ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅

Π§Ρ‚ΠΎ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Ρ‚Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚? Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Π³Ρ€ΡƒΠΏΠΏΡƒ Π²Π΅Ρ€ΡˆΠΈΠ½, ΠΈ, Π·Π°Ρ‚Π΅ΠΌ, рассматривая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΈΠ· этой Π³Ρ€ΡƒΠΏΠΏΡ‹ Π² качСствС ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ. Код Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для этого, увСличится всСго Π½Π° нСсколько строк, ΠΈ ваТная Ρ‡Π°ΡΡ‚ΡŒ doConstraint() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ (Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ строки, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π΄Π΅Π»ΠΎ с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π²Π΅Ρ€ΡˆΠΈΠ½):

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

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

me = to.getData(mesh=1)

# ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ мСша

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

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

smallest = 1000000.0

delta_ob=tloc-obloc

try:

    verts = me.getVertsFromGroup(idprop['VertexGroup'])

    for vi in verts:

        d = (me.verts[vi].co+delta_ob).length

        if d < smallest :

            smallest = d

            si = vi

        obloc = me.verts[si].co+tloc

        vnormal = me.verts[si].no

except AttributeError:

    for v in me.verts:

        d = (v.co+delta_ob).length

        if d < smallest:

            smallest=d

            sv=v

    obloc = sv.co + tloc

    vnormal = sv.no


Автор здСсь Π½Π°Ρ€ΡƒΡˆΠΈΠ» ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» качСствСнного программирования, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ гласит «НСт Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΊΠΎΠ΄Π°!Β» ВСкст послС try ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ:

try:

    verts = me.getVertsFromGroup(idprop['VertexGroup'])

except AttributeError:

    verts = range(len(me.verts))

for vi in verts:

    d = (me.verts[vi].co+delta_ob).length

    if d < smallest :

        smallest = d

        si = vi

    obloc = me.verts[si].co+tloc

    vnormal = me.verts[si].no

–

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ Π·Π°Π½ΡƒΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Π½Π°Π³Π»ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ° Striver'Π°


ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ try/except Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли свойство VertexGroup ссылаСтся Π½Π° Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ Π²Π΅Ρ€ΡˆΠΈΠ½, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ шанс ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ всС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π°ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ΅Π½ способ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡƒ Π²Π΅Ρ€ΡˆΠΈΠ½, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getSettings() Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠΆΠ΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠœΡ‹ Π΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΡƒΠ΅ΠΌΡΡ простым ΠΏΠΎΠ»Π΅ΠΌ Π²Π²ΠΎΠ΄Π° строки, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ имя Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Π΅Ρ€ΡˆΠΈΠ½. НСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° сущСствованиС Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΈ Ссли ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ привязкой ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π²Π΅Ρ€ΡˆΠΈΠ½, Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ это ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π° пустым, ΠΈΠ»ΠΈ занСсти имя Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹. НС слишком изящно, Π½ΠΎ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ (Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ строки Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹):

def getSettings(idprop):

    if not idprop.has_key('VertexGroup'):

       idprop['VertexGroup'] = 'Zone'

    if not idprop.has_key('NormalAlign'):

       idprop['NormalAlign'] = True

    vgroup = Draw.Create(idprop['VertexGroup'])

    align = Draw.Create(idprop['NormalAlign'])

    block = []

    block.append("Additional restrictions: ")

    block.append(("Vertex Group: ",vgroup,0,30,"Vertex

                   Group to restrict location to"))

    block.append(("Alignment: ",align,

                  "Align along vertex normal"))

    retval = Draw.PupBlock("Zoning Constraint", block)