[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)