Ниже описано будет построение куба, как я писал ранее работа с GLScene не слишком сложная, по этому я покажу 2 способа. Первый способ чисто для ознакомления , а второй уже может иметь место на практике. Позже я постараюсь описать , самый наиболее простой и легкий способ создания вообще всех 3д объектов в Сцене. №1
Поместим на форму два объекта: GLScene и GLSceneViewer. GLScene – инспектор объектов нашей сцены. GLSceneViewer – окно в котором отображается наша сцена. Если хотите, то можете поменять цвет GlSceneViewer1 в его свойствах поставив Buffer.BackgroundColor=clWhite Двойным щелчком левой кнопки мыши на GLScene1 входим в инспектор объектов и создадим простой объект Cube (Scene objects => Add object => Basic geometry => Cube ). Далее создадим камеру (Cameras => Add camera) и источник света (Scene objects => Add object => LightSource). Теперь в GLSceneViewer1 в разделе Camera выбираем GLCamera1. Займёмся настройкой камеры: Выбрав GLCamera1 в Object Inspector’е находим раздел TargetObject и выбираем Cube1. А теперь поменяем координаты камеры (т.к. всем объектам в момент создания задаются одинаковые координаты и наша камера просто не увидит кубик) в разделе Position устанавливаем x = 1, y = 1 , x = 1 (писать без знака равно естественно). Установим такие же координаты и источнику света GLLightSource1. Теперь немного программного кода (на события OnMouseDown и OnMouseMove у GlSceneViewer1): procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin mx:=x; my:=y; //Запомнить координаты мыши end; procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Shift<>[] then begin //Если нажата клавиша GLCamera1.MoveAroundTarget(my-y, mx-x); //Перемещаем камеру вокруг целевого объекта GLLightSource1.Position:=GLCamera1.Position; //Пусть источник освещения будет рядом с камерой mx:=x; my:=y; end; end; И в разделе public не забудьте объявить переменные mx и my: Код на языке Delphi Должно получиться что-то вроде этого: Теперь с помощью мышки мы можем вращать камеру вокруг куба. 4. Текстуры Во-первых можно изменять цвет объекта без использования текстур. В Object Inspector’е выбрав раздел Material нажимаем на троеточие: В появившемся окне Material Editor можно менять цвет объекта. При запуске приложения будет заметно что световые эффекты остались, но при использовании текстуры световых эффектов не будет видно (затемнение и т.д.). Чтобы они стали видны TextureMode надо указать в tmModulate. Чтобы наложить текстуру на объект необходимо в Material Editor’е выбрать раздел Texture: Нажав на троеточие указать путь к текстуре (ВНИМАНИЕ!!! Текстура должна быть формата *.BMP иначе при использовании других форматов текстура не будет отображаться. Чтобы использовать текстуры других форматов, необходимо подключить соответствующие модули в раздел USES. Например JPEG, для *.jpg). И не забудьте убрать галочку Disable, чтобы текстуру было видно. В общем чуть позже нашел текстуру, так что не буду менять старые скрины) 5. Примитивное движение - вращение Для движения нам понадобится GLCadencer (поместите на форму). Поставьте GLCadencer1.Scene=GLScene1 Теперь от вас необходимо только писать: Cube1.Turn(deltaTime*X) – Вращение объекта (в нашем случае куба), где X скорость вращения. Cube1.Roll(deltaTime*X) – Вращение(качение) объекта, трудно объяснить словами лучше один раз увидеть.
procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double); begin Cube1.Turn(deltaTime*10); end; или
procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double); begin Cube1.Roll(deltaTime*10); end;
№2
А теперь способ который предпочтительнее применять. Смысл способа, создание куба в run time.
Code <br>//В uses нужно добавить если нет GLObjects<br> <br>var<br>Cube1:TGLCube;<br> <br>begin<br> <br> Cube1:=TGLCube.CreateAsChild(GLScene1.Objects); <br>//Мы создали наш куб дочерним объектом в сцене <br>//Далее можно делать с ним всё что угодно<br> Cube1.Position.X:=1; <br> Cube1.Position.Y:=1; <br> Cube1.Position.Z:=0; <br> Cube1.Material.Texture.Image.LoadFromFile('\texture.bmp'); Cube1.Material.Texture.Image.Disabled:=false; <br>//Вообще по уму нужно использовать библиотеку материалов, но для куба хватит прямого доступа к текстуре)<br> GLCamera1.TargetObject:=Cube1; <br>//Ну конечно нужно в таргет указать наш кубик.<br> В общем то и все , как вы видите работа в ран тайме проста, позже я покажу более правильный способ создания объектов.
|