Главная » 2011 » Март » 8 » Пишем 3д подарок
06:20
Пишем 3д подарок
хостинг изображений
Всегда охота подарить дорогому человеку уникальный подарок, а как говориться "Лучший подарок тот который сделал сам".

Задача:
Сделать интерактивную открытку с элементами 3д и слайд шоу.
Писать все будем с помощью графической библиотеки GLScene для Delphi/Lazarus/Borland C++, так же желательно подобрать картинки для спрайтов в единой цветовой палитре.

Шаг 1. Расставляем объекты.

фото хостинг
В проекте использоваться 3 спрайта. В первый мы загружаем фон , в второй рамку, а поверх неё уже фотографию. При использовании такой иерархии у нас не будет проблем с перекрытием.

Шаг 2. Настраиваем основную сцену.

Устанавливаем размеры, позиционирование и другие настройки при создании формы.

\\Установим по центру
GLSprite1.Position.X:=Form1.Width/2;
GLSprite1.Position.Y:=Form1.Height/2;

GLSprite1.Width:=Form1.Width;
GLSprite1.Height:=Form1.Height;
GLSprite1.Material.Texture.Disabled:=false;
GLSprite1.Material.Texture.Image.LoadFromFile(ExtractFilePath(Application.ExeName)+'bg0.jpg');

GLHUDText1.Position.X:=Form1.Width/2;
GLHUDText1.Position.Y:=Form1.Height/2+200;

\\Загрузим модель цветка
GLFreeForm1.Direction.SetVector(0,0.5,0);
GLFreeForm1.Scale.SetVector(9,9,9);
GLFreeForm1.LoadFromFile(ExtractFilePath(Application.ExeName)+'model.3ds');
GLMaterialLibrary1.TexturePaths:=ExtractFilePath(Application.ExeName);
GLFreeForm1.MaterialLibrary:=GLMaterialLibrary1;

\\Подготовим Фул Скрин
GLFullScreenViewer1.Width:=Screen.Width;
GLFullScreenViewer1.Height:=Screen.Height;

TimeI:=0;

\\Загрузим рамку и 1ую фотографию
Ram.Width:=294;
Ram.Height:=220;
Ram.Position.X:=Form1.Width/2;
Ram.Position.Y:=Form1.Height/2+190;
Ram.Material.Texture.Disabled:=false;
Ram.Material.Texture.Image.LoadFromFile(ExtractFilePath(Application.ExeName)+'ram.jpg');

Gallery.Position.X:=Form1.Width/2;
Gallery.Position.Y:=Form1.Height/2+200;

Gallery.Width:=210;
Gallery.Height:=140;
Gallery.Material.Texture.Disabled:=false;
Gallery.Material.Texture.Image.LoadFromFile(ExtractFilePath(Application.ExeName)+'gall0.jpg');

Шаг 3. Делаем смену фоновой картинки.

Принцип простой, в таймере увеличиваем переменную каждую секунду на 1, как только значение её равно 10 , мы меняем на следующую картинку (дописывая нужное значение к имени картинки) и так повторяем по кругу.

TimeI:=TimeI+1;
if TimeI=12 then
begin
if count<3 then Count:=Count+1 else count:=0;
GLSprite1.Material.Texture.Image.LoadFromFile(ExtractFilePath(Application.ExeName)+'bg'+FloatToStr(count)+'.jpg');

TimeI:=0;
end;

Шаг 4. Шлифуем сцену.

В принципе костяк готов, но хорошо бы добавить такие вещи как, вращение мышкой цветка, Фул Скрин, галерею.

Фул скрин:

\\ Пусть модель сама вращается
GLFreeForm1.Turn(deltaTime);
GLFreeForm1.Roll(deltaTime);

\\ По нажатию на Enter активируем Фул Скрин
if (IsKeyDown(#13)) then GLFullScreenViewer1.Active:=true

\\Подгоним все на полно экранный режим
if GLFullScreenViewer1.Active=true then
begin
GLSprite1.Width:=Screen.Width;
GLSprite1.Height:=Screen.Height;
GLSprite1.Position.X:=Screen.Width/2;
GLSprite1.Position.Y:=Screen.Height/2;

GLHUDText1.Position.X:=Screen.Width/2;
GLHUDText1.Position.Y:=Screen.Height/2+200;
end;

Вращение модели:

\\Что интересно если сделать так как кажеться логично будут искажения, так что меняем X и Y местами
\\Сработат при зажатой Левой кнопки мыши
if ssLeft in Shift then GLCamera1.MoveAroundTarget(mY-y,mX-x);
mX:=x;
mY:=y;

Сделаем запуск с параметром, что бы можно было без галереи.

if ParamStr(1)='gallery' then begin
Ram.Visible:=true;
Gallery.Visible:=true;
end;

И конечно нужно не забыть про Form Resize

GLSprite1.Width:=Form1.Width;
GLSprite1.Height:=Form1.Height;
GLSprite1.Position.X:=Form1.Width/2;
GLSprite1.Position.Y:=Form1.Height/2;

Ram.Position.X:=Form1.Width/2;
Ram.Position.Y:=Form1.Height/2+190;
Gallery.Position.X:=Form1.Width/2;
Gallery.Position.Y:=Form1.Height/2+190;

В итоге получим что то вроде этого:
хостинг изображений

Заключение.

В заключение хочу сказать, что если вы сами поэкспериментируете то может получиться гораздо интереснее. Например можно добавить стандартные эффекты или подключить шейдеры.
Категория: Статьи | Просмотров: 626 | Добавил: De:Light | Рейтинг: 5.0/1
Всего комментариев: 2
2 De:Light  
0
Там более старая версия GLScene , в новой версии есть только Scene Objects. Вообще в этих 2х статьях расположение камеры разное только из за иерархии.

1 EugeneMad  
0
Молодчина! Мне очень понравилась эта статья!
Надеюсь, что это не последняя статья с использованием GLScene.
У меня вопрос:
Почему в этой статье в "Scene Root" вложен только "Scene Objects", а в статье "НАШ СОБСТВЕННЫЙ УТЯЖЕЛЕННЫЙ КУБ..." в "Scene Root" вложен не только "Scene Objects", но и "Camera...". В чем разница?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Вы вошли как: Гость
15:13
Вы вошли как: Гость
Календарь
«  Март 2011  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Категории
Новости [11]
Статьи [23]
GLscene,Web Design,IT,etc...
Счетчик

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