пятница, 11 июня 2010 г.

автоматическое обновление картинок в сете

Очень много времени уходит на создание модели, работы над ее реализацией, подгонке текстур и прочего, что порою совсем не остается времени и сил на то, чтобы как-то опубликовать свои творения.

Рисовать «в стол», вернее сказать, на жесткий диск – занятие интересное на первых порах знакомства с редактором, но когда уже что-то начало получаться, хочется рассказать всему миру о своих творениях. Желание, конечно, похвальное, но в условиях повального цейтнота, на то, чтобы заняться популяризацией своего творчества, просто не хватает времени.

Раз у самого нет времени, то надо это дело кому-нибудь перепоручить – завести секретаршу. Расходно и не по-программерски, у нас же есть компьютер и интернет. Вот пусть компьютер сам и выкладывает наши картинки – чего ему зря пыль собирать и электричество кушать.

Где размещать наши творения? На многочисленных форумах и сайтах, посвященных 3D моделированию, конечно, надо бы, но это тоже отнимает время и накладывает некоторые обязательства. Мы же с Вами – художники свободные и больше всего ценим, свободу и независимость во всем, что касается жизни.

Лично я использую сервис от Google’а, и ничего в нем плохого не вижу. За любовь, как говорят, не платят, а свобода – в нутрии нас, внешней свободы, живя в обществе не добиться, как бы сильно этого не стараться. Мы же люди активные и контакты с обществом – неотъемлемая часть нашей жизни, без людей мы просто задыхаемся. И ради свободы мы не за что на свете не поедем на необитаемый остров. Вот такая вот математика – хотим свободы, но изолироваться не желаем – ищем компромиссы.

Но переходим к сути поста, у нас имеются творения, которые должны быть загружены на сервис Picasa. Что для этого нужно? Руки, чтобы били не до конца кривые и росли, желательно все же оттуда, откуда должны они и расти – этого, принципе достаточно, еще должен быть действующий аккаунт на Picasa, пароль от этой учетки, самом Python’е должна быть установлена библиотека от Google – но это все лирики и не столь важно. Главное – идея.

Идея проста – мы авторизируемся на сервисе, создаем новый альбом, в который выгружаем наши работы. Естественно все это мы делаем не через браузер, а перепоручаем работу змею.

Итак, наш скрипт состоит из трех частей:

· Авторизироваться на сервисе;

· Создание нового альбома

· Добавить фотографий (в данном случае – одной фотографии, что сути не меняет) в созданный альбом

Чтобы авторизироваться на сервисе, вводим переменные MyLog, password, которые понятно что, будут содержать.

Теперь сразу же переходим к написанию скрипта – а чего медлить-то.

import gdata.photos.service

import gdata.media

import gdata.geo

Следующей строчкой мы определим наши переменные, необходимые для аутификации.

MyLog = ‘ArkSmoke’

password = ‘pass’

теперь создаем клиент для работы сервисом

gd_client = gdata.photos.service.PhotosService()

Дальше выполняем процедуру аутификации

gd_client.email = MyLog # Set your Picasaweb e-mail address...

gd_client.password = password # ... and password

gd_client.source = 'api-sample-google-com'

gd_client.ProgrammaticLogin()

Все, теперь мы полноправные авторизированные хозяева на сервисе – можем создвать свой собственный альбом – чем мы без промедления и займемся.

album = gd_client.InsertAlbum(title ='Album for try', summary = 'this album for blogs')

Всего одна строчка и альбом готов. Тут все прозрачно – мы указываем два параментра: название альбома и краткое к нему пояснение. Переменная album превратилась в объект, со всеми свойствами и атрибутами объекта. В данном примере нам будет интересен лишь одни параетр – порядковый номер, созданного альбома – album.gphotot_id.text.

С добавлением фотографий дело обстоит немного сложнее: нам надо прописать расположение фотографии на носителе информации, с которого мы будем ее добавлять и альбома, в который мы будем эту фотку добавлять – вывод вводим еще две переменные: для расположения альбома, и фотографии.

album_url = '/data/feed/api/user/%s/albumid/%s' % ('Ark', album.gphotot_id.text)

filename = 'dsb.jpg'

В адрес альбомы мы подставляем Ваш никнайм на сервисе и номер альбома (в дано случае только что созданного.

Теперь создаем обект для работы с фотогрфиями – мы просо добавим новую и все.

photo = gd_client.InsertPhotoSimple(album_url, 'fistTry', 'Uploaded using the API', filename, content_type='image/jpeg')

Собственно говоря, пока все. Теперь мы можем добавлять свои творения в автоматическом режиме.

четверг, 25 февраля 2010 г.

Ко дню защитника о защите.

Хоть праздник и прошел, но самое время поговорить об защите в Blender, вообще этот разговор я заводить не хотел, но наткнулся на статью, и не отреагировать не смог.

Дело в том, что за простоту и мощность Blender’а как студии программирования приходится платить некой уязвимостью. Я говорю о том факте, что в Blender есть возможность автоматически запускать скрипты при открытии файла. Чем это грозит? А грозит это тем, что во время старта файла с расширением .blend можно запустить любой исполняемый файл. Я Вас не призываю этого делать и не несу никакой ответственности за Ваши действия, но призываю быть осторожнее при открытии файлов от неизвестного автора.

Как работает этот механизм? Пишем простенький скрипт, например такой:

import os

os.system('calc.exe')

Дальше переходим в Buttons Window переходим в Script. Там нажимаем кнопку New, выбираем имя нашего скрипта, указываем событие, при котором, скрипт срабатывает. Я указал OnLoad – при загрузке. Теперь сохраяню файл. Отрываю его – скрипт срабатывает – я могу пользоваться калькулятором! Иногда очень полезно.

И помните, что эта особенность не баг, а фича, так что будьте внимательны и осмотрительны. Никакая программная защита не спасет, если нет головы. Удачи. Защищайте себя сами – угроза можете придти с любой стороны, будьте готовы.

воскресенье, 21 февраля 2010 г.

Управление Камерой



С того времени, когда я начал рассматривать Blender не как мощный инструмент 3D моделирования, а как среду программирования, меня интересовал вопрос управления в виртуальном мире.

В предыдущих постах я показывал, как решать совершенно не стандартные для Blender задачи.

Итак, хоть я скрытый злодей, помышляющий о том, как завоевать вселенную, она мне не нужна, как и власть и деньги, хотя без денег на «железо» и интернет не обойтись, мной больше двигают исследовательские цели. Ну, скажите, какой смысл от мира, если его нельзя пощупать и поизучать? На мой взгляд – никакого. Поэтому, создав виртуальный мир, мне стало интересно, а как же все-таки в него пустить меня, исследователя?

Решение простое и одно – надо писать скрипт и запустить его в Blendr. Скрипт управления камерой. Возиться самому мне в ту пору, естественно, не хотелось. Я только представил все эти аффинные преобразования да еще в трех мерном мире, мне сразу плохо стало. Другой математической модели управления камерой тогда я не видел. И перспектива возиться с матрицами меня, прямо скажу, очень сильно, тогда еще студента, угнетала. Но ведь к тому времени на Blender уже писались игры, а, значит, управление камерой было реализовано. Значит, задача сводится к нахождению удовлетворительного и, по возможности, универсального скрипта управления камерой. Несколько вариантов с преобразованиями матриц я отмел, как меня не устраивающие, и стал искать дальше.

Все же странно устроен человек, не представляя, как это можно сделать иначе, отметает варианты и ищет, уж поистине то, не знаю что. Но, самое интересное, в людском мире то, что это «не знаю что» находится. Удовлетворивший меня скрипт находится на www.tutorialforblender3D.com, но так же файл с этим же скриптом я выкладываю здесь. В тексте ничего не меняю, считаю, что не имею на это право. А вот здесь объясню механизм его работы.

Считается одной из самых сложных задач по обучению программирования – перевод текста программы на человеческий язык, то есть словами объяснить алгоритм работы Вашей программы. Лично я не люблю взять готовый скрипт и использовать его, не разобравшись в механизмах его работы, если, что-то не понял, то изучаю этот скрипт до дыр. Но для того, чтобы понять работу скрипта управления логикой, нужно понимать логику управления логическими блоками (считайте это каламбуром, а не тавтологией). Про работу логических блоков я объяснять не стану (в обозримом будущем выйдет моя статья по созданию игр в Blender, а повторяться, я не люблю – если возникнет необходимость что-то уточнить, можно задать вопрос и посмотреть на демонстративный файл).


На рисунке продемонстрированы все необходимые настройки логических блоков:

Сенсер одни – Mouse, он настроен на событие Movement, контроллер тоже одни, в нем находится наш скрипт, управления камерой. А вот актуаторов – 2: одни, LookLeftRight, отвечает за движения камеры по горизонтали, второй, LookUpDown, - по вертикали.

Условно я делю скрипт на две части: get и set части. В первой части мы объясняем скрипку откуда он берет исходные данные и что с ними делает, во второй части присваиваем полученные результаты – все как всегда просто:

# импортируем библиотекуt Rasterizer

import Rasterizer

# для удобства чтения скрипта вводим переменную, которой присваиваем текущий

# контроллер

controller = GameLogic.getCurrentController()

# назначаем переменную, к которой этот скрипт присоединяем

player = controller.getOwner()

# присваиваем переменной сенсор с именем Mouse

#здесь имеется ввиду то имя, которым Вы назвали сенсор в логических блоках

mouse = controller.getSensor("Mouse")

# вводим переменные, которым присваиваем наши актуаторы

lookLeftRight = controller.getActuator("LookLeftRight")

lookUpDown = controller.getActuator("LookUpDown")

В этом мы связали входящие данные и выходящие, на мой взгляд, именно эта связь является самой трудной для понимания: тут происходит основная связь скрипта с логикой самого файла – если скрипт универсальный, то файл надо подстраивать под этот скрипт, вот для это на и назначаются все переменные, но идем дальше.

# назначаем переменным ширину и высоту экрана, это надо для перемещения

width = Rasterizer.getWindowWidth()

height = Rasterizer.getWindowHeight()

# определяем mouse movement функцию

def mouseMove():

# определяем расстояние, пройденное от центра экрана

x = width/2 - mouse.getXPosition()

y = height/2 - mouse.getYPosition()

# инициализируем mouse если еще не сделали этого

if hasattr(player, 'mouseInit') == False:

x = 0

y = 0

# тут баг

# и вместо True. надоиспользовать 1

player.mouseInit = 1

# возвращаем передвижение мыши

return (x, y)

# присваиваем mouse значения, полученные функцией, их два X,Y

move = mouseMove()

# задаем чувствительность

sensitivity = 0.001

# Суммируем направление и чувствительность

#на самом деле умножаем, но оставил термин из комментария к скрипту

# move[0] – это перемещение мыши по X

# move[1] – это перемещение мыши по Y

leftRight = move[0] * sensitivity

upDown = move[1] * sensitivity

# устанавливаем, полученные значения в актуаторы

lookLeftRight.setDRot( 0.0, 0.0, leftRight, False)

lookUpDown.setDRot( upDown, 0.0, 0.0, True)

# используем, уже полученные актуаторы в нашем файле

GameLogic.addActiveActuator(lookLeftRight, True)

GameLogic.addActiveActuator(lookUpDown, True)

# размещаем mouse в центре экрана

Rasterizer.setMousePosition(width/2, height/2)


Вот и все – скрипт работает, можете проверять.

Это один из лучших скриптов для управления камерой при создании игр, у меня он лежит в качестве боевого скрипта.

Желаю Вам успехов.

суббота, 6 февраля 2010 г.

О начале года

Год начался с некоторых изменений в жизни. Как всегда всякие изменения приводят к тому, что нужно подвести анализ сделанной работы. С чего, собственно говоря, я и начинаю второй месяц года. Из-за занятости на основной работе и небольшого смещения интересов (цикл статей, посвященных Blender я завершил еще в 2009 году, хотя до сих пор они не все опубликованы), но так же, чтобы было удобнее работать с материалом, который я уже здесь приводил, выкладываю файлы скриптов, использованных мною в качестве примеров.

Скачать архив со скриптами можно здесь.

Сам же я на время сменю направленность блога (надеюсь, что это изменение станет более информативно) и некоторое время буду наполнять содержимое своего блога переводами англоязычных статей (с личными комментариями к коду), иногда будет полезно выкладывать статьи из API в переводе и объяснением, как это работает.

Надеюсь на понимание.

суббота, 9 января 2010 г.

Создаем аудиобазу иностранных слов

Начался новый год, завершаются праздники и каникулы, скоро предстоят рабочие будни. Хотя у кого-то они уже начались: сессия, консультации, экзамены. Не знаю, как Вы, а я с нового года решил подтянуть свой английский язык и в очередной раз взяться за изучение японского. Слово дал, но вот что с ним делать? Надо же когда-то браться за свое образование, вот я и решил отгулять праздники, подумать и собраться.
Собрался, но подошел в этом плане по-программерски, чтобы было интересно и полезно ни только мне. Вообще, при изучении иностранного языка самое сложное – произношение (как я с ним намучался, и сколько мучений еще предстоит), но суть не в том, а в том, чтобы всегда под рукой иметь некий аудиофайл, чтобы сверить сове произношение, ну или, как в случае с английским языком, понять, как данное слов читается. Вот попробуйте с ходу прочитать pronunciation. У меня, когда я этот ужас увидел в первый раз, не получилось его прочитать, а очень бы хотелось.
Попробуем собрать собственную аудиобазу изучаемых слов – лингво нам не подходит – слишком громоздкий, да и не бесплатный, а мы Фаны свободного программного обеспеченья. Что же делать – лазить по Интернету и искать подходящий словарь с аудибзой не хочется – время дорого. Ключевое слово – искать. Кто у нас все знает? – Google. Да в добавок еще и сервисы свои бесплатно предоставляет. Вот и воспользуемся одним из его серверов - http://translate.google.com. Если не использовали этот он-лайн переводчик – обязательно попробуйте, но о его методах перевода – если время будет, поговорим отдельно.
Сильно не ругайтесь, что отошел от темы Python в Blender. Просто я все еще работаю с Blender, как средой программирования. Но вернемся к базе адиофайлов. Переводчик, предлагаемый Google’ом, может произносить слова – здорово этим и воспользуемся. Заставим диктора произнести наше pronunciation. Заставили – послушали, а дальше-то что? Надо понять, откуда диктор его читает. Запускаем сниффер и перехватываем вот такой адрес – URL = http://translate.google.com/translate_tts?q=pronunciation&tl=en. Принцип работы ясен: на url-адрес http://translate.google.com/translate_tts - передаем два параметра: q – что будем произносить, tl – язык, а результатом этого запроса будет нужный нам аудиофайл – не верите, скопируйте адрес в броузер, загрузите файл, допишите ему расширение .mp3 и прослушайте.
Алгоритм добывания слов ясен, как добыть слово руками – понятно, теперь автоматизируем это добывание, с помощью Python.

У нас будет процедура speach с двумя параметрами: язык и слово. Слово будет так же и именем аудифайла, чтобы знать, какое слово, где лежит. Формируем запрос, отправляем запрос, получаем результат, сохраняем результат – вот и все.

import sys
import urllib2
import urllib
'''
autor : ArkSmoke
url : http://arkpython.blogspot.com

'''

def speach(tl, text):
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'My')]

live_word = opener.open(
"http://translate.google.com/translate_tts?" +
urllib.urlencode({'tl': tl}),
data = urllib.urlencode({'tl': tl,
'q': text})
)

snd = live_word.read()
open(text +'.mp3','wb').write(snd)

speach('en', 'Yes')
print 'done'


По большому счету в данном скрипте и комментировать нечего – все словами описано выше. Удачи Вам. И приятного изучения языка.