Среда, 24.04.2024, 06:44

Delphi

Приветствую Вас Гость

Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня были:
Самые активные пользователи

Меню сайта
Категории каталога
Звук и музыка [1]
Графика и игры [6]
Базы данных [1]
Стандартные компоненты [0]
3D графика [4]
Исходники [10]
DirectX и OpenGL [5]
Разное [1]
Интернет и сети [7]
Наш опрос
Чему уделять больше внимания?
Всего ответов: 64
Главная » Статьи » Delphi » 3D графика

Работа со спрайтами в GLScene
Итак, для начала давайте выясним, что же такое спрайт? Спрайт – это двумерная картинка, то есть растровое изображение. Как все знают, спрайты нужны для реализации интерфейса. Они также могут накладываться поверх трёхмерной картинки, что является очень важной особенностью для игр.

Ну, что ж – приступим к GLScene. В GLScene за статические спрайты (без анимации) отвечает класс TGLHUDSprite. Он мало чем отличается за наличием свойств от обычного 3D объекта. Ну, да ладно – разработчики сэкономили своё время .
Любой спрайт имеет позицию на плоскости экрана. Она задаётся двумя координатами – X и Y. Значение Z определяет порядок их отображения. Эти три значения хранятся в стандартном для таких случаев свойстве Position. Стоит отметить, что X, Y задают размещение центра спрайта. Имейте это ввиду. Для вычисления координат левого-верхнего и правого-нижнего используйте следующие формулы:

Var
TopLeft, BottomRight: TPoint;

TopLeft.Y:=Sprite.Position.Y-Sprite.Height/2;
TopLeft.X:=Sprite.Position.X-Sprite.Width/2;
BottomRight.Y:=Sprite.Position.Y+Sprite.Height/2;
BottomRight.X:=Sprite.Position.X+Sprite.Width/2;

Кстати, в GLScene координаты спрайта могут задаваться не только целыми, но и дробными значениями. Правда, разницу между X=1 и X=1,223 вы не заметите – экран не будет резать пиксели . Просто программисты GLScene не захотели переопределять Position для спрайтов. И правильно сделали. Это убирает необходимость следить за типами и их переведениями (никакой кутерьмы с Div, Round, Trunc и т.д.).
Каждый спрайт кроме позиции должен иметь размеры – высоту и ширину. Запомните – спрайт всегда прямоугольный . Эти показатели задаются в параметрах Height и Width. Если картинка будет иметь меньший или больший размер, то она растянется, чтобы занимать спрайт (а точнее его прямоугольную область) полностью. Очень полезная особенность. Особенно, когда приходится делать интерфейс игрушки подстраиваемым под любые разрешения экрана.
А теперь мы подобрались к самому главному – к изображению спрайта. За это отвечает Material.Texture.Image. С помощью метода LoadFromFile можно загрузить любое изображение. Лишь бы знать путь к нему .
Ну, что ж. Всё – основы знаем. Пишем код для вывода спрайта:

Sprite.Material.Texture.Image.LoadFromFile(‘Image.jpg’);
Sprite.Width:=100;
Sprite.Height:=100;
Sprite.Position.X:=70;
Sprite.Position.Y:=290;

Запускаем… Ой, что-то не так. Нету изображения! В чём проблема? Вспоминаем, как мы включали текстуру для объектов. Дописываем вначале строчку Sprite.Material.Texture.Disabled:=false. Вот, теперь пашет! Поздравляю!

А теперь займёмся такой штукой, как работа с масками. Что же такое маска? В классической теории, маска – это некоторое монохромное изображение, цвет пикселей которого задаёт прорисовку (видимость) аналогичным по размещению в спрайте. Иначе говоря, маска – это аналогичное по размерам спрайту изображение из двух цветов (зачастую это чёрный и белый цвета). И в зависимости от цвета каждого пикселя на маске, мы будем задавать, будет ли прорисовываться аналогичный по размещению пиксель на спрайте. В GLScene сделано немного по-другому – более оптимально. Вам не надо иметь два изображения – спрайт и его маску. Нужно всего лишь сделать фоном для спрайта какой-то цвет, который не используется на самом спрайте и поставить его в качестве цвета прозрачности. Вот код, до пишите его перед предыдущим (не забудьте подключить модуль GLTexture!):

Sprite.Material.BlendingMode:=bmTransparency;
Sprite.Material.Texture.ImageAlpha:=tiaSuperBlackTransparent;
Sprite.Material.Texture.TextureMode:=tmReplace;

В данном случае, цветом фона является чёрный. Режим bmTransparency указывает на то, что спрайт собственно имеет маску некотрого цвета, который мы и задали константой в параметре ImageAlpha. Обязательно ставьте TextureMode на tmBlend. Он задаёт прорисовку спрайта поверх сцены самого изображения. Если поставить на tmModulate, то спрайт будет зависеть от источников света. В случае с tmDecal у меня вообще прозрачность отрубилась.
Наконец, займёмся таким приёмом, как прозрачность. Зачем нужны прозрачные спрайты? Немножко прозрачный игровой интерфейс смотрится более круто (только в том случае, если информация и сам спрайт хорошо различимы), можно сделать плавное появление и затухание окон интерфейса. Или используя видеоролики на движке игры, сделать красивые затмения изображения и его появление из темноты. Ладно, хватит слов – давайте к делу!
За прозрачность отвечает свойство Material.FrontProperties.Diffuse.Alpha. Если оно равно 1, то спрайт не позрачный, 0 – спрайт настолько прозрачный, что невидный . Но есть одно но. Чтобы использовать прозрачность надо поставить TextureMode в tmDecal (это значение по умолчанию), а BlendingMode в bmTransparency. Тогда спрайт будет нормально отображаться (без затенений, как в tmModulate) и собственно, хорошо менять прозрачность. Правда тогда проблема с масками. Ну, ничего – на то тут вы, чтобы всё это исправлять, переписывать коды GLScene – общем шевелить мозгами и пробовать да эксперементировать!
На этом слове я и прощаюсь… Так как моя миссия выполнена. Если будут вопросы (а таковые будут, так как статья очень поверхностна) – задавайте их в комментариях, я постараюсь на всё ответить.
GLScene forever!

Статья взята с сайта http://glscene.ru/
Категория: 3D графика | Добавил: Ivin (02.04.2008)
Просмотров: 6371 | Рейтинг: 0.0/0 |