<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF93%3ABlender</id>
		<title>LXF93:Blender - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF93%3ABlender"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;action=history"/>
		<updated>2026-05-13T03:13:07Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=6482&amp;oldid=prev</id>
		<title>Yaleks: категория</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=6482&amp;oldid=prev"/>
				<updated>2009-01-07T09:27:52Z</updated>
		
		<summary type="html">&lt;p&gt;категория&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 09:27, 7 января 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 312:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 312:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Итог проекта: несколько разных платформ общаются через ''Blender''.'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Итог проекта: несколько разных платформ общаются через ''Blender''.'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Категория:Blender]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Категория:Python]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Категория:Hardcore Linux]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Категория:Бен Харлинг]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=5544&amp;oldid=prev</id>
		<title>Crazy Rebel: /* Командир, запускай! */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=5544&amp;oldid=prev"/>
				<updated>2008-11-24T07:47:53Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Командир, запускай!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 07:47, 24 ноября 2008&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 309:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 309:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;подходит для небольших переговоров. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;подходит для небольших переговоров. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;LXF92_blender04&lt;/del&gt;.jpg|Рис. 4]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;LXF93_blender04&lt;/ins&gt;.jpg|Рис. 4]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Итог проекта: несколько разных платформ общаются через ''Blender''.'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Итог проекта: несколько разных платформ общаются через ''Blender''.'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=5539&amp;oldid=prev</id>
		<title>Crazy Rebel: /* Командир, запускай! */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=5539&amp;oldid=prev"/>
				<updated>2008-11-24T07:43:35Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Командир, запускай!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 07:43, 24 ноября 2008&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 309:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 309:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;подходит для небольших переговоров. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;подходит для небольших переговоров. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;LXF92_blender03&lt;/del&gt;.jpg|Рис. 4]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;LXF92_blender04&lt;/ins&gt;.jpg|Рис. 4]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Итог проекта: несколько разных платформ общаются через ''Blender''.'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Итог проекта: несколько разных платформ общаются через ''Blender''.'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=5538&amp;oldid=prev</id>
		<title>Crazy Rebel в 07:43, 24 ноября 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=5538&amp;oldid=prev"/>
				<updated>2008-11-24T07:43:18Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 07:43, 24 ноября 2008&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 308:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 308:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Уж не знаю, сколько клиентов выдержит такой сервер, но он вполне&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Уж не знаю, сколько клиентов выдержит такой сервер, но он вполне&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;подходит для небольших переговоров. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;подходит для небольших переговоров. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF92_blender03.jpg|Рис. 4]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''Итог проекта: несколько разных платформ общаются через ''Blender''.'''&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=5537&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF93:Blender&amp;diff=5537&amp;oldid=prev"/>
				<updated>2008-11-24T07:41:56Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Категория:Учебники]]&lt;br /&gt;
&lt;br /&gt;
===Blender: Чат будет почат===&lt;br /&gt;
&lt;br /&gt;
: С помощью ''Python'' и ''Blender'' '''Бен Харлинг''' набросает среду для обмена сообщениями, открывая дорогу ко всестороннему взаимодействию.&lt;br /&gt;
&lt;br /&gt;
Есть отличный мультик, под названием Noob make MMORPG, сделанный парнем с Украины, который часто появляется на форумах ''Ogre 3D''. Его можно найти вот здесь http://snipurl.com/1eff4 Это история про начинающих разработчиков игр, которые, в эйфории от изобилия открытых решений для работы с графикой, хватаются&lt;br /&gt;
за дело и сляпывают собственное жалкое подобие ''World of Warcraft''.&lt;br /&gt;
История способна сильно охладить энтузиазм новичков; и все-таки&lt;br /&gt;
создать 3D-среду взаимодействия за очень короткий промежуток времени возможно – используя ''Blender'' совместно c ''Python''.&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы разработаем простое приложение обмена&lt;br /&gt;
сообщениями с 3D- интерфейсом на ''Blender'', управляемое скриптом&lt;br /&gt;
на ''Python'' и пригодное для обслуживания множества пользователей.&lt;br /&gt;
Приложение предоставит большие возможности для расширения или&lt;br /&gt;
включения его в ваш собственный проект ''Blender'', а также может быть&lt;br /&gt;
легко встроено в игру или же работать отдельно. Примечательно, что&lt;br /&gt;
с этим приложением я сумел установить единую сессию обмена сообщениями между Windows, Linux, OS X и даже Playstation 3 с помощью&lt;br /&gt;
одного и того же файла ''Blender'', произвольно обрабатываемого с&lt;br /&gt;
любой платформы – а это явно вызовет некоторое изумление.&lt;br /&gt;
&lt;br /&gt;
Чтобы добиться такого, нужны всего-навсего последние версии&lt;br /&gt;
''Python'' и ''Blender'' для вашей системы. Вам также потребуется нарисовать интерфейс пользователя для окна чата. Я использовал ''Inkscape'',&lt;br /&gt;
чтобы создать макет простого графического интерфейса с окном для&lt;br /&gt;
текста и с полем ввода. В данном проекте понадобятся растровые&lt;br /&gt;
шрифты для отображения текста в ''Blender'', поэтому я предусмотрел их&lt;br /&gt;
подборку на диске. Шрифты можно создать инструментом ''FTBlender'',&lt;br /&gt;
но на время написания этого руководства были доступны версии только под FreeBSD и Windows.&lt;br /&gt;
&lt;br /&gt;
==Создаем клиента и интерфейс==&lt;br /&gt;
&lt;br /&gt;
Запустите ''Blender'' и удалите куб или любой другой примитив, который&lt;br /&gt;
по умолчанию появится в окне. В качестве окна мы собираемся использовать простую плоскость, поэтому создайте такую, развернув лицом к&lt;br /&gt;
себе; выровняйте камеру и увеличьте изображение, пока оно не займет&lt;br /&gt;
все окно. Затем разделите окно просмотра и измените одну из панелей&lt;br /&gt;
на '''UV-редактор изображения''' ('''UV Image Editor'''). Вернитесь на вид с 3D&lt;br /&gt;
и нажмите '''F''' для перехода к выбору граней UV.&lt;br /&gt;
&lt;br /&gt;
Теперь войдите в редактор изображений, нажмите '''А''', чтобы выбрать&lt;br /&gt;
все вершины, затем нажмите '''Image &amp;gt; Open''' и загрузите свой интерфейс. Вызовите кнопки редактирования нажатием '''F9''', и увидите панель&lt;br /&gt;
'''Texture Face''', которая активна, потому что мы все еще в режиме '''UV Face Select'''. В этой панели активируйте кнопки '''Tex, Light, TwoSide''' и '''Alpha'''.&lt;br /&gt;
Кнопка '''Alpha''' полезна при использовании изображений с альфа-каналом прозрачности.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF93_blender01.jpg|Рис. 1]]&lt;br /&gt;
&lt;br /&gt;
'''Начало окна чата. Кнопки UV диктуют, как объект с текстурой будет выглядеть в движке игры.'''&lt;br /&gt;
&lt;br /&gt;
Перейдите обратно к 3D-виду и проверьте, что кнопка '''Viewport Shading''' установлена в режим '''Texture'''. Вы должны увидеть свой интерфейс отраженным на многоугольник. Если он развернут неправильно, перейдите обратно к '''UV Face Select''', выберите снова все вершины UV, затем нажмите '''R''' для поворота. Чтобы повернуть на нужный&lt;br /&gt;
угол, наберите значение в градусах (скажем, '''90''') и нажмите '''Enter'''.&lt;br /&gt;
Выровняв текстуру, создайте новую небольшую плоскость, перекрывающую фон – проверьте, что она немного ближе к камере, чем большая плоскость. Поместите ее внизу интерфейса (она станет первой&lt;br /&gt;
строкой текста) и еще раз с выбранной плоскостью установите 3D-окно в режим UV Face Select (нажмите '''F''' в окне 3D), затем загрузите растровый шрифт (например '''arailbd.tga''' с компакт-диска) в качестве&lt;br /&gt;
текстуры для плоскости. На этот раз вам понадобится уменьшить масштаб вершин в редакторе изображений, чтобы они комфортно размещались рядом с символом '''@''', который появляется на изображении&lt;br /&gt;
шрифта (показан на панели справа, выше). Как и до этого, активируйте кнопки '''Texture Face''', а также нажмите на кнопку '''Text''' в том же окне, чтобы '''Blender''' знал, как использовать объект для отображения текста.&lt;br /&gt;
Переименуйте объект (не сетку!) во что-нибудь вроде '''txtLine'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь нажмите '''F4''' для активации панели '''Logic'''. Добавьте строковое свойство с именем '''Text''' к плоскости и задайте ему некое тестовое значение, например, '''This is some text!''' или что-нибудь столь же&lt;br /&gt;
оригинальное. Перейдите к 3D-виду, нажмите клавишу '''P''', и если все&lt;br /&gt;
пойдет хорошо, вы увидите ваш текст поверх фона. Если текст имеет&lt;br /&gt;
большие межбуквенные расстояния, уменьшите объект-плоскость в&lt;br /&gt;
режиме '''Edit Mode''' (нажмите '''Tab'' в 3D-виде), потом сделайте предпросмотр, и так пока не будет достигнуто нужное расстояние; затем&lt;br /&gt;
увеличьте масштаб в режиме Object Mode, чтобы восстановить размер шрифта.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF92_blender02.jpg|Рис. 2]]&lt;br /&gt;
&lt;br /&gt;
'''Нажмите ''P'', переведя курсор на окно 3D-вида, для запуска игрового движка и проверки своей работы. Заметьте, что здесь выбран знак ''@''.'''&lt;br /&gt;
&lt;br /&gt;
Доведя до ума первую строку, скопируйте ее несколько раз, размещая строки друг над другом, чтобы заполнить главное графическое&lt;br /&gt;
окно. Это гарантирует нам, что текст будет правильно отображаться&lt;br /&gt;
при каждом новом сообщении. В моем примере у меня получилось 16&lt;br /&gt;
строк, но вы вольны сделать их сколько угодно; надо, однако, записать, сколько именно (не считая строки ввода), так как некоторые скрипты учитывают количество отображаемых строк.&lt;br /&gt;
&lt;br /&gt;
Скопируйте текстовую плоскость и поместите ее над полем ввода&lt;br /&gt;
вашего интерфейса. Переименуйте его как '''txtInput'''. Вам понадобится&lt;br /&gt;
добавить свойство '''sendmessage''' под свойством '''Text''' для этой панели,&lt;br /&gt;
показывающее, что это сообщение готовится к отправке. Наконец,&lt;br /&gt;
создайте пустой объект в любом месте и назовите его '''controller'''.&lt;br /&gt;
&lt;br /&gt;
===Начинаем расширять===&lt;br /&gt;
&lt;br /&gt;
С пустым выбранным объектом переходим на панель '''Logic''', добавляем сенсор '''Always''' и отключаем обе кнопки ('''pulse mode'''). Добавьте контроллер '''Python''' и свяжите сенсор с его вводом. Измените один из&lt;br /&gt;
видов на текстовый редактор и добавьте новый скрипт '''client_connect'''.&lt;br /&gt;
На свежесозданном контроллере '''Python''' есть кнопка '''Script'''. Нажмите ее&lt;br /&gt;
и введите '''client_connect'''.&lt;br /&gt;
&lt;br /&gt;
Теперь мы готовы начинать писать код на ''Python'', чтобы вдохнуть&lt;br /&gt;
жизнь в наше приложение. Все необходимые файлы есть на диске, и&lt;br /&gt;
мы займемся только ключевыми моментами в коде, а за полными листингами обращайтесь к файлам. Обращаем внимание, что код, касающийся сети, в этом проекте не очень безопасен, поэтому испытания&lt;br /&gt;
рекомендуем проводить в частной сети.&lt;br /&gt;
&lt;br /&gt;
Наш контроллер, естественно, должен настроить приложение и&lt;br /&gt;
попытаться подсоединиться к узлу, чтобы начать разговор с другими участниками. Сначала нам нужно импортировать ''игровой движок Blender'' (далее называемый ''ИД Blender'') и стандартную библиотеку&lt;br /&gt;
''Python socket'' c помощью&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
  import GameLogic as g&lt;br /&gt;
  import socket&lt;br /&gt;
  scn = g.getCurrentScene()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Последняя строка получает ссылку на текущую сцену, а заодно и на&lt;br /&gt;
все объекты в ней. Следующие три строки определяют узел подключе-&lt;br /&gt;
ния, порт и отдельное имя каждого клиента. Вы можете обернуть эти&lt;br /&gt;
свойства в графическое окно входа, используя те же методы, что были&lt;br /&gt;
описаны выше. Далее мы начинаем назначать глобальные свойства,&lt;br /&gt;
хитро присоединяя их к модулю '''GameLogic'''. Сложно точно сказать,&lt;br /&gt;
когда скрипт будет выполнен в ''ИД Blender'', поэтому простым способом&lt;br /&gt;
избежать ошибок будет использование модуля движка для взаимодействия между скриптами. Мы будем использовать функцию '''hasattr''' для&lt;br /&gt;
создания порядка выполнения. Она запрашивает объект на наличие&lt;br /&gt;
определенного свойства '''GameLogic''', затем создает его, если оно не&lt;br /&gt;
существует, или совершает действия над ним, если существует.&lt;br /&gt;
&lt;br /&gt;
Первое свойство, которое надо определить – это список плоскостей, созданных нами для отображения текста. Создадим его поиском в результатах вызова функции '''getObjectList()''' по ссылке на сцену: скрипт&lt;br /&gt;
будет добавлять плоскости в порядке их создания, и если вы создавали&lt;br /&gt;
их последовательно снизу вверх, то в списке '''mDisplay''' они окажутся в&lt;br /&gt;
нужном порядке.&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Добавьте чат в свои игры&lt;br /&gt;
|Содержание=Вы можете легко включить эту программу обмена сообщениями в качестве отдельной сцены во&lt;br /&gt;
время игровой сессии и вызывать его на лету как&lt;br /&gt;
отдельное меню. Чтобы это сделать, переименуйте сцену, содержащую обмен сообщениями,&lt;br /&gt;
затем начните новую сцену, которая будет содержать вашу игру. Окно беседы может вызываться&lt;br /&gt;
с помощью любой комбинации сенсора ввода,&lt;br /&gt;
контроллера '''Always''' и актуатора '''Scene Actuator'',&lt;br /&gt;
установленного в '''Add Overlay Scene''', все устанавливается на панели '''Logic''' и не требует написания&lt;br /&gt;
скриптов. Добавьте все это в пустой объект в&lt;br /&gt;
вашей игровой сцене для быстрого интегрирования чата. Вы можете также отделить скрипты&lt;br /&gt;
клиента и соединения от программы чата, для&lt;br /&gt;
более гибкого общения с сервером.&lt;br /&gt;
|Ширина=250px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
  # загрузить объекты для отображения сообщений&lt;br /&gt;
  if not hasattr(g, “mDisplay”):&lt;br /&gt;
              g.mDisplay = []&lt;br /&gt;
  for obj in scn.getObjectList():&lt;br /&gt;
              if ‘line’ in obj.name:&lt;br /&gt;
                             g.mDisplay.append(obj)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее мы попробуем подсоединиться к узлу и создадим свойство&lt;br /&gt;
'''GameLogic''', если соединение прошло удачно. Снова используем здесь&lt;br /&gt;
'''hasattr''' – для гарантии, что мы не замещаем предыдущее соединение.&lt;br /&gt;
Начнем с простого объекта '''socket''' и попробуем установить соединение. Хотя это не лучшее решение, мы обрамим все в конструкцию '''try…except''', которая позволит функции «упасть» красивее. После установки соединения, немедленно пошлем серверу наше имя для записи в журнал. Наконец, установим флаг на '''GameLogic''', сигнализируя, что&lt;br /&gt;
соединение было успешно установлено, и остальные скрипты могут&lt;br /&gt;
начать работу.&lt;br /&gt;
&lt;br /&gt;
Контроллеру требуется установить еще один сенсор '''Always''', чтобы&lt;br /&gt;
он издавал сигнал True каждые пять тиков или около того. Он управляет частотой обновления клиента с сервера, и сильно влияет на ширину&lt;br /&gt;
канала, которую пытается занять клиент. Данный проект не использует&lt;br /&gt;
балансировку нагрузки, поэтому потребуется более подробная модель&lt;br /&gt;
взаимодействия с сервером, если вы захотите использовать этот код в&lt;br /&gt;
реальности. Снова, создайте новый Python-контроллер и ассоциируйте&lt;br /&gt;
с ним новый текст скрипта. Назовите его '''client''' и добавьте следующие&lt;br /&gt;
строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 import GameLogic as g&lt;br /&gt;
 import pickle&lt;br /&gt;
 import socket&lt;br /&gt;
 cont = g.getCurrentController()&lt;br /&gt;
 own = cont.getOwner()&lt;br /&gt;
 scn = g.getCurrentScene()&lt;br /&gt;
 if not hasattr(g, ‘message’):&lt;br /&gt;
     g.message = “”&lt;br /&gt;
 if hasattr(g, “connected”):&lt;br /&gt;
     toSend = pickle.dumps(g.message, pos)&lt;br /&gt;
     g.conn.send(toSend)&lt;br /&gt;
     g.message = “”&lt;br /&gt;
     data = g.conn.recv(1024)&lt;br /&gt;
     if data:&lt;br /&gt;
         messages = pickle.loads(data)&lt;br /&gt;
         # display the messages list&lt;br /&gt;
         for n in range(len(g.mDisplay)):&lt;br /&gt;
            g.mDisplay[n].Text = messages[n]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы импортируем игровой движок и модуль '''socket''', как и раньше, а&lt;br /&gt;
также модуль '''Python pickle''', для подготовки наших данных к передаче&lt;br /&gt;
по сети. Далее, мы получаем ссылку на объект, к которому подсоединен скрипт, посредством ссылки на логический блок, представляющий данный Python-контроллер. Мы также добавляем еще одно свойство к&lt;br /&gt;
'''GameLogic''', которое будет содержать любой текст для отправки.&lt;br /&gt;
&lt;br /&gt;
Остальная часть скрипта зависит от того, удачно ли произошло&lt;br /&gt;
соединение с сервером. По каждому сигналу сервера клиент собирает&lt;br /&gt;
все локальные данные – в нашем случае просто свойство '''Text''' входного объекта – и «закатывает» его в файлоподобный объект, пригодный&lt;br /&gt;
для передачи. Затем данные пересылаются на сервер, а '''GameLogic.message''' сбрасывается. Клиент ожидает ответ от сервера, который,&lt;br /&gt;
будучи полученным, «разворачивается» в список строк. Затем мы&lt;br /&gt;
перебираем глобальный список текстовых панелей, определенный&lt;br /&gt;
ранее, и назначаем каждой из них соответствующую строку.&lt;br /&gt;
&lt;br /&gt;
===Обработаем ввод===&lt;br /&gt;
&lt;br /&gt;
Далее нам необходимо присоединить новый скрипт к объекту ввода.&lt;br /&gt;
Он будет обрабатывать ввод с клавиатуры и преобразовывать его в&lt;br /&gt;
символы для отображения в нашем окне. Объекту ввода требуется&lt;br /&gt;
сенсор приема клавиши, подсоединенный к новому Python-контроллеру и новому скрипту. ''ИД Blender'' включает модуль '''GameKeys''', который можно использовать для преобразования кодов клавиш в полезные символы. Модуль '''GameKeys''' – это, попросту говоря, справочник&lt;br /&gt;
имен и номеров кодов клавиш, поиск по которому осуществляется&lt;br /&gt;
сравнительно легко. На самом деле, вы можете и не прибегать к&lt;br /&gt;
скриптам, просто используя логические блоки, слушающие определенные клавиши и добавляющие символы в свойство '''Text'''. Но, скажем честно, вы сохраните кучу времени, используя ''Python'' в качестве&lt;br /&gt;
решения, как и во многих других вещах.&lt;br /&gt;
&lt;br /&gt;
Со скриптом ввода клавиши все ясно, а вызов '''printdir(GameKeys)'''&lt;br /&gt;
быстро выведет все коды клавиш, если у вас настроен консольный&lt;br /&gt;
вывод. Я присоединил сенсоры, слушающие определенные клавиши, к&lt;br /&gt;
тому же скрипту, чтобы продемонстрировать некоторые альтернативные установки. Скрипт получает ссылки на эти сенсоры и автоматически вызывается при нажатии определенной клавиши.&lt;br /&gt;
&lt;br /&gt;
Скрипт ввода также связан и имеет ссылку на объект '''Message Actuator''', именуемый '''send'''. При нажатии клавиши '''Enter''' скрипт устанавливает у актуатора свойство '''Body''' равным свойству ввода '''Text'''. Затем&lt;br /&gt;
он изменяет свойство '''sendmessage''' на '''True''', сигнализируя, что сообщение готово к отправке. Другой сенсор, на сей раз сенсор свойства,&lt;br /&gt;
присоединен, чтобы слушать наличие '''True''' у '''sendmessage'''. Если это&lt;br /&gt;
так, то запускается актуатор сообщения, и оно посылается контроллеру '''Empty'''. Мы добавим к контроллеру еще один сенсор, слушающий сообщение. Тут вызывается новый скрипт, просто вставляющий свойство '''GameLogic.message''' в тело получаемого сообщения. Сообщениеm уже автоматически отослано и очищается скриптом '''client''' каждые пять&lt;br /&gt;
тиков, так что по части клиента у нас все в порядке.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF93_blender03.jpg|Рис. 3]]&lt;br /&gt;
&lt;br /&gt;
'''Логические блоки настроить непросто, зато потом можно обойтись без кода.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Обслуживание клиентов===&lt;br /&gt;
&lt;br /&gt;
Наш сервер выполняет совершенно другую Python-программу, поэтому запустите вашу любимую IDE для работы с ''Python'' и создайте новый файл '''chat_server.py'''. Собственная версия этого файла опять-таки есть&lt;br /&gt;
на диске, поэтому за полным кодом обращайтесь к нему. Наш сервер&lt;br /&gt;
использует преимущества потоков для одновременного обслуживания&lt;br /&gt;
множества клиентов, но помните, что приведенный пример примитивен, и его можно значительно улучшить.&lt;br /&gt;
&lt;br /&gt;
После импорта требуемых модулей приступим к определению&lt;br /&gt;
клиентского класса на стороне сервера. Он будет дублироваться при&lt;br /&gt;
каждом новом соединении и работать одновременно вместе со своими собратьями:&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Скорая помощь&lt;br /&gt;
|Содержание=Мы включили несколько растровых '''.tga''' шрифтов на диск для этого проекта. Приложение ''ftblender'' может легко преобразовать шрифты TrueType в растровые, но оно пока существует только под Windows. ''FTBlender'' можно использовать&lt;br /&gt;
только для преобразования шрифтов, не защищенных авторским правом.&lt;br /&gt;
|Ширина=200px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 # Наш класс потока:&lt;br /&gt;
  class ClientThread ( threading.Thread ):&lt;br /&gt;
     # Создаем этого клиента и его поток&lt;br /&gt;
     def __init__ ( self, channel, details ):&lt;br /&gt;
       self.channel = channel&lt;br /&gt;
       self.details = details&lt;br /&gt;
       self.position = [0,0,0]&lt;br /&gt;
       self.message = “”&lt;br /&gt;
       self.newPosition = [0,0,0]&lt;br /&gt;
       self.newMessage = “”&lt;br /&gt;
       # слушаем имя клиента, которое нам передается&lt;br /&gt;
       self.name = channel.recv(1024)&lt;br /&gt;
      print self.name, ‘connected’&lt;br /&gt;
      # вызываем конструктор суперкласса&lt;br /&gt;
      threading.Thread.__init__ ( self )&lt;br /&gt;
    def run ( self ):&lt;br /&gt;
      # пока клиент не подсоединен&lt;br /&gt;
      while True:&lt;br /&gt;
         try:&lt;br /&gt;
            # слушаем данные от клиента&lt;br /&gt;
            data = self.channel.recv(1024)&lt;br /&gt;
            if data:&lt;br /&gt;
                # распаковываем данные&lt;br /&gt;
                self.newMessage = pickle.loads(data)&lt;br /&gt;
                # если получено сообщение, добавляем его в список&lt;br /&gt;
                if not self.newMessage == “”:&lt;br /&gt;
                    txtList.append(self.name + ‘:’ + self.newMessage)&lt;br /&gt;
            # выбираем последние 16 сообщений, которые отошлем обратно&lt;br /&gt;
            txtToSend = txtList[-16:]&lt;br /&gt;
            # упакуем их и отошлем&lt;br /&gt;
            toSend = pickle.dumps(txtToSend)&lt;br /&gt;
            self.channel.send(toSend)&lt;br /&gt;
         except:&lt;br /&gt;
            # нет, мы потеряли соединение&lt;br /&gt;
            self.channel.close()&lt;br /&gt;
            print ‘Connection to’, self.name, ‘lost’&lt;br /&gt;
      return False&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Клиентский поток постоянно работает в цикле в каждой сессии&lt;br /&gt;
''Blender'', обмениваясь данными «туда-обратно» (регулируется сенсором, установленным в ''Blender''). Сначала поток ожидает сигнала от клиента (помните, в нашем клиентском скрипте ''Blender'' первым действием является отсылка данных), и если получены какие-то данные, они распаковываются и проверяются. Пустые строки мы игнорируем:&lt;br /&gt;
если этого не сделать, GUI быстро переполнится ими. Если у нас есть&lt;br /&gt;
какой-то текст, предваряем его именем клиента и добавляем текст в&lt;br /&gt;
стек. Затем мы обрезаем массив ([-16:]), беря последние 16 записей,&lt;br /&gt;
упаковываем результат и, наконец, посылаем его клиенту, где он будет&lt;br /&gt;
выведен на экран.&lt;br /&gt;
&lt;br /&gt;
Последние строки скрипта сервера определяют бесконечный цикл,&lt;br /&gt;
в котором сервер ожидает на определенном сокете и создает потоки&lt;br /&gt;
клиентов при поступлении соединения.&lt;br /&gt;
&lt;br /&gt;
===Командир, запускай!===&lt;br /&gt;
&lt;br /&gt;
Программу обмена сообщениями легко протестировать локально;&lt;br /&gt;
рекомендуем так и сделать, поскольку скрипт сервера выставит&lt;br /&gt;
ваш компьютер напоказ в сети. Чтобы протестировать программу в&lt;br /&gt;
оффлайне, установите свойство узла в localhost и используйте одинаковый номер порта для сервера и клиента. Может также оказаться, что&lt;br /&gt;
сетевой экран блокирует соединения с локальной машиной, и потребуется разрешить входящие соединения для ''Python''.&lt;br /&gt;
&lt;br /&gt;
Сохраните вашу работу, затем откройте терминал, перейдите в&lt;br /&gt;
каталог с проектом ('''cd''') и наберите ''python chatserver.py'' для запуска.&lt;br /&gt;
Когда он запустился, перейдите в ''Blender'' и нажмите '''P''' в 3D-виде. Если&lt;br /&gt;
все в порядке, то тестовые значения, установленные на вашем дисплее&lt;br /&gt;
будут заменены на пустые, загруженные с сервера. Напечатайте какойнибудь текст, нажмите '''Enter''', и он должен появиться в окне выше.&lt;br /&gt;
Теперь запустите еще одну сессию ''Blender'', нажмите '''P''' в этом окне, и&lt;br /&gt;
магическим образом появится текст другой сессии!&lt;br /&gt;
&lt;br /&gt;
Скрипт сервера можно запустить с любого сервера, на котором есть&lt;br /&gt;
''Python'' – просто установите адрес узла на ваших клиентах, и вы в игре.&lt;br /&gt;
Уж не знаю, сколько клиентов выдержит такой сервер, но он вполне&lt;br /&gt;
подходит для небольших переговоров. '''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>