Для различных демонстраций необходимо менять размеры и положения трехмерных объектов непосредственно при показе модели. Но это делать трудно, так как необходимо перестраивать модель во время работы. VRML модель это просто текстовый файл оформленный несложным способом. Поэтому если изменять этот файл то и модель изменится.
Мы попробуем это сделать на примере примитивов VRML. И начнем с куба.
В VRML куб описывается таким кодом:
1 2 3 4 5 6 7 8 9 |
Cube { width 2 height 2 depth 1 } |
Изменяя эти параметры можно легко изменить, если эти параметры хранить в переменных.
У нашей программы создадим вот такой дизайн:
Соответственно на форме должны быть вот эти объекты:
1 2 3 4 5 6 7 8 9 |
CastleControl1: TCastleControl;; // сюда загружаем модель Memo1: TMemo; // сюда записываем новый код модели TrackBar1: TTrackBar; // ползунок для изменения параметра width TrackBar2: TTrackBar; // ползунок для изменения параметра height TrackBar3: TTrackBar; // ползунок для изменения параметра depth |
Так как модель должна изменяются динамически, то работать будем в событии On Change объектов TrackBar.
Первое что нужно сделать это записать код модели в memo. Будем использовать код
1 |
memo1.Append(' '); |
В место пробелов в параметре запишем первую строку кода модели и так далее запишем остальные строки, определяющие примитив Cube.
1 2 3 4 5 6 7 8 9 10 11 |
memo1.Append('#VRML V1.0 ascii'); memo1.Append('Cube {'); memo1.Append('width '+Inttostr(trackBar1.Position)); memo1.Append('height '+Inttostr(trackBar2.Position)); memo1.Append('depth '+Inttostr(trackBar3.Position)); memo1.Append('}'); |
Inttostr(trackBar1.Position) – в этот код позволяет целочисленное значение положения TrackBar, перевести в текст и добавить к коду модели.
Когда код собран, его необходимо записать в файл. Будем так же использовать функции memo:
1 |
memo1.Lines.SaveToFile('exp.wrl'); |
А теперь осталось только открыть эту модель:
1 2 3 4 5 |
CastleControl1.Load('exp.wrl'); CastleControl1.MainScene.Spatial := [ssRendering, ssDynamicCollisions]; CastleControl1.MainScene.ProcessEvents := true; |
И в конце необходимо очистить Memo, иначе у нас получится много кубиков.
Для того чтобы экономить код, не будем создавать On Change для каждого TrackBar, а создадим только для первого. Затем для второго и третьего TrackBar в окне инспектора событий на вкладке события в поле On Change выбираем TrackBar1Change
И осталось только спрятать memo, в событии On Create для формы набираем:
1 |
memo1.Hide; |
Теперь можно запускать проект!))) (Не забудьте сохранить проект куда-нибудь)
Об авторе