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

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

Автор Michel Anders

def paste(top,right,front,free,output="result.png"):

   im = pim.open(top)

   w,h= im.size

   edge=4

   edgecolor=(0.0,0.0,0.0)

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

   comp = pim.new(im.mode,(w*2+3*edge,h*2+3*edge),

                  edgecolor)

ΠœΡ‹ ΡƒΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ всё, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ - Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Π½Ρ‚Π΅ нашСго ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ изобраТСния, сдвинув Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π² Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΈ Π² Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΌ направлСниях Π½Π° ΡˆΠΈΡ€ΠΈΠ½Ρƒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹:

   comp.paste(im,(edge,edge))

Вставка Ρ‚Ρ€Ρ‘Ρ… ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ слСдуСт Π·Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ схСмой: ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. НаконСц, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сохраняСтся (Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ). Π’ΠΈΠΏ сохраняСмого Ρ„Π°ΠΉΠ»Π° опрСдСляСтся Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, png), Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ save(). Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ изобраТСния функция open() опрСдСляСт ΠΏΠΎ ΠΈΡ… ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ.

   im = pim.open(right)

   comp.paste(im,(w+2*edge,edge))

   im = pim.open(front)

   comp.paste(im,(edge,h+2*edge))

   im = pim.open(free)

   comp.paste(im,(w+2*edge,h+2*edge))

   comp.save(output)

Наша ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ Π²ΠΈΠ΄ ΠΈΠ· ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ ΠΈ сохраняСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ„Π°ΠΉΠ». ΠšΠ°ΠΌΠ΅Ρ€Π° для Ρ€Π΅Π½Π΄Π΅Ρ€Π° пСрСдаётся ΠΊΠ°ΠΊ имя ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π° Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, это Π½Π΅ имя основного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Camera). ΠŸΠ΅Ρ€Π²Π°Ρ строка ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Camera ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сцСну ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π² сцСнС - Ρ‚ΠΎΠΉ которая Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒ (Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π½ΠΈΠΆΠ΅). Ѐункция setCurrentCamera() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π°, Π° Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠšΠ°ΠΌΠ΅Ρ€Ρ‹, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

def render(camera):

   cam = Object.Get(camera)

   scn = Scene.GetCurrent()

   scn.setCurrentCamera(cam)

   context = scn.getRenderingContext()

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ процСссС, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ renderAnim() контСкста Ρ€Π΅Π½Π΄Π΅Ρ€Π°, Π° Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ render(). Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ render() Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ процСссС. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ устанавливаСм Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Π΄Ρ€Π° ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ, Ρ‚Π°ΠΊ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция renderAnim() ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ СдинствСнный ΠΊΠ°Π΄Ρ€. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСм displayMode Π½Π° 0, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ появлСниС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Ρ€Π΅Π½Π΄Π΅Ρ€Π° (Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ кускС ΠΊΠΎΠ΄Π°):

   frame = context.currentFrame()

   context.endFrame(frame)

   context.startFrame(frame)

   context.displayMode=0

   context.renderAnim()

ΠœΠ΅Ρ‚ΠΎΠ΄ renderAnim() Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ ΠΊΠ°Π΄Ρ€Ρ‹ Π² Ρ„Π°ΠΉΠ»Ρ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ наша ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Ρ‡Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ имя Ρ„Π°ΠΉΠ»Π° Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ. Π’ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π² ΠΎΠΊΠ½Π΅ ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… настроСк, Π½ΠΎ явный Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getFrameFilename() Π΄Π°Ρ‘Ρ‚ Π½Π°ΠΌ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ имя:

   filename= context.getFrameFilename()

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π΄Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ для Π²ΠΈΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠΌ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ„Π°ΠΉΠ», Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ пСрСписан. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ создаём Π½ΠΎΠ²ΠΎΠ΅ подходящСС имя, состоящСС ΠΈΠ· ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΊΠ°Π΄Ρ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ»ΠΈ, ΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ пСрСносимыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡƒΡ‚ΠΈ ΠΈΠ· ΠΏΠΈΡ‚ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ модуля os.path, Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всё Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ Windows, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΠ΄ Linux, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Π’Π°ΠΊ ΠΊΠ°ΠΊ наш скрипт, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΆΠ΅ использовался, ΠΌΡ‹ пытаСмся ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ любой ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ имя ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ ΠΏΠΎΠ΄ Windows. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠΊΠ° ΠΌΠΎΠ³Π»ΠΎ ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ  -  Π² этой ситуации нас Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ Π±Π»ΠΎΠΊ try. НаконСц, наша функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя вновь созданного Ρ„Π°ΠΉΠ»Π°:

   camera = os.path.join(os.path.dirname(filename),camera)

   try:

      os.remove(camera)

   except:

      pass

   os.rename(filename,camera)

   return camera

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ваТная Π·Π°Π΄Π°Ρ‡Π° - ΠΊΠ°Π΄Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Ρ‚Π°ΠΊ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ подходящий ΡƒΠ³ΠΎΠ» для всСх ΠΊΠ°ΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΎΠ³Π½Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΏΠΎΠ΄ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ³ΠΎΠ» ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π±Ρ‹Π»  ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ для всСх ΠΊΠ°ΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Ρ€ΠΈΡ‚Π΅Π»ΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ пСрспСктиву со всСх ΡƒΠ³Π»ΠΎΠ² просмотра. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π½ΠΎ это скучно, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π·Π° нас.

Бпособ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ это сдСлаСм - это Π²Π·ΡΡ‚ΡŒ Π³Π°Π±Π°Ρ€ΠΈΡ‚Π½Ρ‹ΠΉ ящик (bounding box) нашСго ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π° ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡƒΠ³ΠΎΠ» зрСния ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, исходя ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ этот Π³Π°Π±Π°Ρ€ΠΈΡ‚Π½Ρ‹ΠΉ ящик Π΄ΠΎΠ»ΠΆΠ΅Π½ просто Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ наш Π²ΠΈΠ΄. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ расстояниС ΠΎΡ‚ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π΄ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π° Π³Π°Π±Π°Ρ€ΠΈΡ‚Π½ΠΎΠ³ΠΎ ящика, ΡƒΠ³ΠΎΠ» зрСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ острый ΡƒΠ³ΠΎΠ» Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π³Π°Π±Π°Ρ€ΠΈΡ‚Π½Ρ‹ΠΌ ящиком ΠΈ расстояниСм Π΄ΠΎ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹.



ΠœΡ‹ вычисляСм этот ΡƒΠ³ΠΎΠ» для всСх ΠΊΠ°ΠΌΠ΅Ρ€ ΠΈ Π·Π°Ρ‚Π΅ΠΌ настраиваСм ΡƒΠ³ΠΎΠ» для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π² самый ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ ΠΈΠ· вычислСнных, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ отсСчСниС нашСго ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π°. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ, Ссли ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ находятся слишком Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρƒ (ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ссли ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ слишком большой), Π² этом случаС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ отсСчСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ.

Код содСрТит ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΉ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ, импортируя Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

from math import asin,tan,pi,radians

Π‘Π°ΠΌΠ° функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список ΠΈΠΌΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° (ΠΊΠ°ΠΌΠ΅Ρ€) ΠΈ Π³Π°Π±Π°Ρ€ΠΈΡ‚Π½Ρ‹ΠΉ ящик (список Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° Π³Π°Π±Π°Ρ€ΠΈΡ‚Π½ΠΎΠ³ΠΎ ящика). Она начинаСтся с опрСдСлСния минимального ΠΈ максимального Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π³Π°Π±Π°Ρ€ΠΈΡ‚Π½ΠΎΠ³ΠΎ ящика для всСх Ρ‚Ρ€Π΅Ρ… осСй, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΡˆΠΈΡ€ΠΈΠ½Ρ‹. ΠœΡ‹ допускаСм, Ρ‡Ρ‚ΠΎ наш ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΎΡ‚Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ maxw содСрТит ΡΠ°ΠΌΡƒΡŽ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΈΠ· всСх осСй.

def frame(cameras,bb):

   maxx = max(v.x for v in bb)

   maxy = max(v.y for v in bb)

   maxz = max(v.z for v in bb)

   minx = min(v.x for v in bb)

   miny = min(v.y for v in bb)

   minz = min(v.z for v in bb)

   wx=maxx-minx

   wy=maxy-miny

   wz=maxz-minz

   m=Mathutils.Vector((wx/2.0,wy/2.0,wz/2.0))

   maxw=max((wx,wy,wz))/2.0

Π—Π°Ρ‚Π΅ΠΌ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Camera, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ расстояниС d Π΄ΠΎ срСднСй Ρ‚ΠΎΡ‡ΠΊΠΈ Π³Π°Π±Π°Ρ€ΠΈΡ‚Π½ΠΎΠ³ΠΎ ящика (Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅). ΠœΡ‹ сохраняСм частноС ΠΎΡ‚ максимальной ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ расстояния:

   sins=[]

   for cam in cameras:

      p=Mathutils.Vector(Object.Get(cam).getLocation(

                                          'worldspace'))

      d=(p-m).length

      sins.append(maxw/d)

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

   maxsin=max(sins)

   angle=asin(maxsin)

   for cam in cameras:

      Object.Get(cam).getData().lens = 16.0/tan(angle)

Другая удобная функция - Ρ‚Π°, которая создаёт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ ΠΈ устанавливаСт ΠΈΡ… Π½Π° сцСну Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. Ѐункция Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ простая, Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ услоТнСна, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° пытаСтся Π·Π°Π½ΠΎΠ²ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΌΠ΅Ρ€, Ссли скрипт Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ cameras индСксируСтся ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ содСрТит список ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ, ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ², ΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ lens:

def createcams():

   cameras = {

      'Top'  : (( 0.0,  0.0,10.0),( 0.0,0.0, 0.0),35.0),

      'Right': ((10.0,  0.0, 0.0),(90.0,0.0,90.0),35.0),

      'Front': (( 0.0,-10.0, 0.0),(90.0,0.0, 0.0),35.0),

      'Free' : (( 5.8, -5.8, 5.8),(54.7,0.0,45.0),35.0)}


Π― это ΡƒΠΆΠ΅ Π²Ρ€ΠΎΠ΄Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π», Π½ΠΎ скаТу здСсь Π΅Ρ‰Ρ‘ Ρ€Π°Π·. ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈ Π½Π΅ рСкомСндуСтся Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ числа (Π΄Π° ΠΈ строки Ρ‚ΠΎΠΆΠ΅) Π² тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. РасстояниС 10.0 взято ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ. А Π²Π΄Ρ€ΡƒΠ³ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° окаТСтся большС? ΠžΡ‚ΠΊΡƒΠ΄Π° взялось 5.8, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ, Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΠΎΠΌΡƒ с ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ нСпонятно, хотя Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это просто Π΄Π»ΠΈΠ½Π° Ρ€Π΅Π±Ρ€Π° ΠΊΡƒΠ±Π°, Π΄Π»ΠΈΠ½Π° Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π½Π° 10.0 (sqrt((10.0**2)/3.0)β‰ˆ5.8). ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ константу, Ρ€Π°Π²Π½ΡƒΡŽ 10.0, Π° расстояниС для ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ 'Free' Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΈΠ· Π½Π΅Ρ‘. Π’ΠΎΠ³Π΄Π° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈΠ»ΠΈ ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всСго ΠΎΠ΄Π½ΠΎΠΉ константы. - Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°.