Как сделать текст в блендере
Текст в Blender Game Engine
В этом уроке Вы узнаете, как добавлять текст в игру, изменять его цвет, размер, шрифт… Как переносить длинные строки текста с помощью скрипта, а также научитесь создавать счетчик боеприпасов.
Добавление текста
Blender может использовать текст в режиме реального времени в игровом движке. Создайте новую сцену, перейдите на вид из камеры, расположите 3D-курсор в левом верхнем углу и добавьте объект Text. Скорее всего выровняется он относительно глобальных координат. Вы можете вручную повернуть его, но лучше перейти в настройки (User Preferences) и на вкладке Editing изменить опцию Align To на View. Таким образом вновь созданные объекты будут выравниваться относительно текущего вида, а не глобальных координат. Теперь запустите игру (P) и вы увидите в ней Ваш текст:
Изменение разрешения шрифта
Не трудно заметить, что качество надписи оставляет желать лучшего. Мы может улучшить его двумя способами. Вы можете отдалить текст от камеры и увеличить его в размерах (при необходимости) или же написать небольшой скрипт на Python. Лучше использовать второй способ 🙂
Добавьте окно Text Editor, создайте новый файл с названием “text_res” и вставьте в него следующий скрипт:
cont = bge.logic.getCurrentController() own = cont.owner own.resolution = 5
Не снимая выделения с текста, перейдите в окно Logic Editor. Добавьте сенсор Always и подключите его к контроллеру Python. Для контроллера укажите использовать скрипт под названием “text_res“. Запустив игру Вы заметите что текст стал значительно лучше выглядеть. Изменяйте значение resolution до тех пор, пока не достигните желаемого результата, но не устанавливайте слишком высокие значения, иначе игра начнет подтормаживать. Значение 1 является разрешением по умолчанию. Начинайте со значения 2 и так до достижения результата:
Так значительно лучше:
Настройка внешнего вида шрифта
Вы можете изменить цвет шрифта изменив цвет объекта. Для этого перейдите на вкладку Object и измените параметр Object Color. Сам шрифт можно изменять на вкладке шрифта:
Добавление текста в игру (HUD)
Теперь, когда мы знаем как добавлять и настраивать текст займемся созданием игровой сцены, в которой будет присутствовать Head-Up Display (HUD). Также, Вы узнаете как форматировать длинные строки текста (создавать переносы) при помощи Python и логических блоков.
Когда Вы откроете файл, то заметите что в нем уже присутствуют камера и куб из предыдущего урока. Также, для куба и камеры была добавлена анимация ходьбы, чтобы перемещение по сцене было более реалистичным. На вкладке рендера частота обновления установлена равной 60 кадров в секунду для более плавной анимации.
Нажмите P, чтобы запустить игру. Перемещение по ней производится при помощи W,A,S,D + мышь, а также можно приседать с помощью Ctrl.
В центре сцены находится коробка с боеприпасами. Как только Вы ее подберете, она исчезнет. Нашей целью будет выводить на экран количество собранных боеприпасов. Для этого нам понадобится новая сцена, которая будет выступать в качестве HUD:
Переименуйте новую сцену в “HUD“. Перейдите на вид спереди и добавьте в сцену камеру. Сместите камеру в сторону от центра оси координат. Теперь перейдите на вид из камеры и добавьте слева вверху текст, как мы делали это в начале урока. Измените надпись на “Ammo:” и при желании настройте разрешение, цвет и шрифт для текста. Затем продублируйте надпись, сместите ее немного вправо и измените ее на “0“. Этот второй текст будет выступать в роли счетчика каждый раз, когда куб (наш персонаж) будет соприкасаться с боеприпасами.
С выделенной надписью “0” в окне Logic Editor на панели свойств добавьте для него новое свойство “Add Text Game Property“. Измените тип на Integer (целое число). После этого займемся настройкой вывода HUD в сцену с игрой:
Переключитесь на сцену с игрой и выделите камеру. В окне Logic Editor соедините сенсор Always, контроллер And и актуатор Scene. Измените режим актуатора на Add Overlay Scene и укажите использовать сцену HUD:
Теперь запустите игру и в ней Вы должны увидеть созданный текст в сцене HUD:
Выделите коробку с боеприпасами в центре сцены. Вы заметите что у нее уже присутствуют логические блоки отвечающие за ее вращение и исчезновение при столкновении с чем-либо.
Добавьте актуатор Message и подключите его к тому же контроллеру, что и сенсор Collision. В поле Subject введите “ammo“. Теперь при столкновении с персонажем боеприпасы будут исчезать и отправлять сообщение “ammo“:
Переключитесь на сцену HUD и выберите счетчик. Добавьте сенсор Message и в поле Subject введите “ammo“. Подключите его к контроллеру And, а контроллер к актуатору Property. Измените его режим на Add, Property на Text и установите Value равным 1. Вся эта связка добавляет единицу к переменной Text когда получает сообщение “ammo”:
Вернитесь в сцену с игрой, запустите ее и подберите коробку. Счетчик должен измениться с 0 на 1. Вы можете продублировать коробку с припасами несколько раз, расположить ее в разных частях сцены и попробовать собрать их все.
Перенос слов
Если в Вашей игре присутствуют длинные диалоги, то скорее всего Вы захотите выводить их параграфами. Можно сделать это вручную, добавляя “\n” в код скрипта или же использовать для этих целей отдельный модуль. С помощью этого модуля можно взять длинные строки и разделить их на отдельные линии определенной длины. Использование моноширинных шрифтов дает наилучший результат, так как длина линии определяется по количеству символов в ней, а не по ширине линии в пикселях.
Перейдите в сцену HUD. Чуть ниже надписи “Ammo” добавьте новый объект Text. Если нужно, отредактируйте разрешение. На вкладке шрифта измените шрифт на моноширинный, например Courier. В окне Logic Edotor добавьте новое свойство “Add Text Game Property” и оставьте тип String (строка). Создайте новый текстовый файл, назовите его “text_wrap” и вставьте в него следующий скрипт:
import textwrap cont = bge.logic.getCurrentController() own = cont.owner startmessage = «Welcome to this tutorial on text in the game engine.» own[«Text»] = textwrap.fill(startmessage, 20)
Добавьте сенсор Always и соедините его с контроллером Python, в котором указан скрипт “text_wrap“. Запустите игру и посмотрите на результат. Переменная startmessage хранит наш текст, который нужно вывести. Переменная own[“Text”] изменяет объект текст и с помощью функции textwrap.fill(startmessage, 20) выводит его строками по 20 символов:
Этот текст будет отображаться на экране на протяжении всей игры. Очевидно что в этом нет нужды, поэтому его нужно убрать по истечению некоторого времени.
Выделите надпись и добавьте для нее сенсор Delay, контроллер And и актуатор Visibility. Delay установите равным 200, а в актуаторе Visibility отключите пункт Visibility. Эта связка говорит, что после 200 “тиков” (по умолчанию 60 “тиков” = 1 секунда) надпись исчезнет с экрана. Запустите игру и проверьте работу.
На этом урок закончен! Вы также можете использовать любые другие функции по работе с текстом: capitalize(), lower(), upper() и т.д.
Blender Basics 4-rd edition/Chapter 10- Adding 3D Text
Материал из Blender3D.
Содержание
Глава 10: Добавление 3D Текста
Автор: James Chronister
Оригинальный перевод: Юлия Корбут aka Balista
Переработка текста: Азовцев Юрий aka gumanoed
Настройки 3D Текста в Blender
Панель Shape:
Установки качества отображения шрифта (Resolution) и параметры заполнения (Fill).
Панель Geometry:
Наиболее часто используемые настройки: Offset сделает текст несколько более толстым; Extrude создаст объем текста (глубину); bevel сглаживает углы объемного текста. Вы можете использовать объект-кривую для задания формы основания и формы фаски.
Панель Font:
Здесь вы можете выбрать стиль шрифта, который хотите использовать. Шрифт Blender выбран по умолчанию, но вы можете изменить его на любой True-Type шрифт. Если вы используете Windows, шрифты обычно распологаются в каталоге C:\Windows. В Linux шрифты можно найти в каталоге /usr/share/fonts/truetype. Параметр Shear создаст эффект наклонного шрифта, по аналогии со стилем Italic. Поле «Text to Curve» можно использовать для изменения формы текста вдоль кривой.
Панель Paragraph:
Обычные параметры выравнивания и отступа.
Панель Text Boxes:
По умолчанию, текст будет продлеваться вправо столько, сколько вы захотите. Здесь вы можете настроить область, по которой текст будет форматироваться (переноситься).
Текст на иллюстрации слева был экструдирован и к нему была добавлена фаска (bevel). Некоторые шрифты при экструдировании будут выглядеть лучше, чем другие. Экспериментируйте! |
Размещение Текста на Кривой:
Blender может изменять форму текста в соответствии с формой Кривой (Curve), которой он следует. Для создания изогнутого текста нажмите Shift-«A», в меню «Add» выберите «Curve», затем «Path» (или любой другой вид кривой). Перейдите в Режим Редактирования и по желанию измените форму кривой. Затем выйдите из Режима Редактирования, нажав клавишу Tab. |
После создания текста, убедитесь что текст выделен, перейдите в раздел Font в Окне Свойств и найдите поле «Text on Curve». Щелкните в поле и из появившегося меню выберите нужную вам кривую. Текст примет форму выбранной кривой. Возможно, вам потребуется настроить расстояние между буквами для лучшего внешнего вида текста.
РобоЧувак Говорит: Преобразование Текста в МешЕсли вы чувствуете некоторые ограничения при использовании стандартных инструментов создания 3D-текста в Blender (хотя с каждой новой версией они становятся все лучше и лучше), вам стоит попробовать использовать внешнюю программу для создания 3D-текста. Например Elefont. Она сохраняет файлы в формате DXF, которые затем могут быть импортированы в Blender. Как в blender’е наложить плоский текст на плоскую поверхность?Blender 2.63. Вопрос в заголовке. Много гуглил, но не помогло. Почему странного? По моему, всё вполне логично. Нужно просто написать текст без использования текстур и чтобы при отображении гарантированно не возникало проблем с Z-буфером. почему нельзя наложить текстурой?
Потому что текстуры не умеет программа, в которой будет выводиться моделька. так текст в каком виде должен быть? геометрией что ли? Если бы выводил картинку блендером, то можно было бы использовать для имитации свойство Z Offset. А так, похоже, только руками растянуть из сетки с текстом плоскость. vertex paint тоже не умеет? Не знаю, как эта операция называется в блендере и есть ли там готовая, но делается это примерно так: (к сож., под рукой сейчас нет даже Wings3D, в котором это можно показать в картинках) создай группу вершин и назначь ей другой материал. текст придется делать геометрией или побольше полигонов в сетке и выделяй нужные вершины. В общем, как я понял, нет простого способа сделать то, что мне нужно. Я просто сделал трёхмерный текст небольшой толщины и разместил его на поверхности грани. Для моих целей этого хватит. Вообще, было бы идеально, если бы blender мог нормально делать булевы операции над плоскими объектами. Сейчас они выдают совершенно неожиданные результаты: например, куб & плоскость = трёхмерная_поверхность_с_вдавленным_участком. Результаты вполне ожидаемые и расписаны в доках буквально по каждому пакету трехмерного моделирования, которые умеют делать булевы операции над геометрией.
Если на плоскости найти пересечение прямой и, например, круга, то может получиться всего три варианта: Любые другие варианты нелогичны. Точно так же, при пересечении трёхмерной фигуры и плоскости никак не может получиться трёхмерная фигура*.
Смысл я понял, спасибо. Просто мне не хочется вручную удалять ненужные треугольники 8). P.S. * Случай с хитро свёрнутыми пространствами мы не рассматриваем. Почитай, что-ли, про нормали к поверхности.
Для человека, не знакомого с компьютерной трёхмерной графикой, это кажется сильно нелогичным. В общем, спасибо за ликбез. 1. Растяни объект с текстом вдоль горизонтальной поперечной оси, чтобы буквы стали сильно выступать вперёд и назад. Так же отмечу что Boolean в Blender работает качественно, а теперь и быстро (после того как библиотеку Carve впихнули). Неожиданные результаты возникают из за того что ты хочешь заставить работать его так, как он не работает. Не забывай про направление нормалей у фэйсов и про замкнутость поверхности над которой производишь операцию (дырки). А можешь показать какая у тебя сетка получилась в случае с «плоским» текстом (левый кубик)? Не сохранил проект, но сетка у кубика получилась поделенной на много острых треугольников, естественно, и я понимаю что это не красиво.
А внутри кубика не осталось ошмётков от 3D-текста? У меня получилось только вот так: http://img600.imageshack.us/img600/1395/boxandtext.png. Ошмётки остались, как у тебя, но я смог легко удалить их выделив вертексы, находящиеся внутри куба.
А автоматом вообще это никак не сделать? Ну или расскажи как их быстро руками уничтожить, а то я умею только по одному выделять. Как сделать автоматом я пока не придумал, но при знании Python точно можно. Чтобы такого не было, кубик надо создавать не из восьми вертексов, а чтобы его сторона была сеткой подходящего размера. Согласен, но скоро булевы операции будут поддерживать bmesh n-гоны (надеюсь) и мы заживём лучше. Спасибо! Результат получился именно такой, какой я изначально хотел.
|