Вход/Регистрация
Графика DirectX в Delphi
вернуться

Краснов Михаил

Шрифт:

Например, если в предыдущих примерах единичные значения текстурных координат заменить на 3, образ будет повторяться 9 раз. А если и нулевые значения изменить на -3, мы получим 36 образов, уменьшенных в размерах.

Теперь посмотрите проект каталога Ех08. Текстура здесь накладывается на квадрат, образованный четырьмя десятками независимых треугольников: полный круг разделен на четыре четверти, в пределах каждой из которой строится десять независимых треугольников. Первая вершина каждого треугольника - центр итогового квадрата. Остальные вершины лежат на его границе.

Вот часть кода, посвященная верхней четверти квадрата:

for i := 10 downto 1 do begin

Vertices. := 0; // Центр экрана

Vertices.У := 0;

Vertices.Z := 0;

Vertices.U := 0.5; // Центр текстуры

Vertices.V := 0.5;

Inc(Vertices);

// Вершины перечисляем по часовой стрелке,

// движемся с левого верхнего угла квадрата

Vertices.X = 0.5 - i / 10;

Vertices.Y =0.5; // Верхний край, значение Y не меняется

Vertices.Z = 0;

Vertices.U = 1 - i / 10; // Х-координата текстуры

Vertices.V =1.0; // Y-координата текстуры

Inc(Vertices);

Vertices.X =0.5- (i- 1)/10; //По часовой стрелке,

Vertices.Y =0.5; // точка слева

Vertices.Z = 0;

Vertices.U = 1 - (i - 1) / 10;

Vertices.V = 1.0;

Inc(Vertices);

end;

Таким образом, на каждом из сорока треугольников хранится кусочек целого образа, и сложенные рядом, они складывают картинку исходного растра. Включите проволочный режим воспроизведения, чтобы уяснить, как разбивается растр. Кстати, это нам позволит убедиться также в том, что текстуру можно накладывать и на отрезки.

Зачем так сложно сделано, вам станет ясно после знакомства со следующим примером, проектом каталога Ех09, где по нажатии клавиши <Пробел> треугольники разлетаются в разные стороны (рис. 8.7).

Координаты первой вершины всех треугольников, точки разлома картинки, выбираются случайным образом, а на каждый треугольник генерируется свое направление движения:

for i := 10 downto 1 do begin

Vertices.X := CenterX + Radius * Wl [i] ; // Точка разлома картинки

Vertices.Y := CenterY + Radius * Wl [i];

Vertices.Z := 0;

Vertices.U := CenterX + 0.5; // CenterX находится в точке [-0.5; 0.51

Vertices.V := CenterY +0.5;

Inc(Vertices);

// Точки, расположенные на границе квадрата

Vertices.X =0.5-1/10-1- Radius * Wl [i] ;

Vertices.Y = 0.5 + Radius * Wl [i];

Vertices.Z = 0;

Vertices.U =1-1/10;

Vertices.V = 1.0;

Inc(Vertices) ;

Vertices.X = 0.5 - (i - 1) / 10 + Radius * Wl [i];

Vertices.Y = 0.5 + Radius * Wl [i] ;

Vertices.Z = 0;

Vertices.U = 1 - (i - 1) /10;

Vertices.V = 1.0;

Inc(Vertices);

end;

В программе предусмотрен режим пошагового разрушения, а по нажатии клавиши <Enter> картинка собирается заново:

procedure TfrmD3D.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

var

i : Integer;

begin

if Key = VK_ESCAPE then Close else

// Пошаговое разрушение

if Key = VK_INSERT then Radius := Radius +0.05 else

// Пошаговое движение в обратном направлении

if Key = VK_DELETE then Radius := Radius - 0.05 else

// Пробел - быстрое разрушение

if Key = VK_SPACE then Moving := True else

// Ввод - картинка собирается заново

if Key = VK_RETURN then begin

Moving := False; // Прекратить движение

Radius := 0; // Картинка собирается

CenterX := random -0.5; // Координаты точки разлома

CenterY := random - 0.5;

for i := 1 to 10 do begin // Коэффициенты скорости движения

repeat // треугольников, все ненулевые

Wl [i] := random- 0.5; until Wl [i] о 0.0;

repeat

W2 [i] := random- 0.5; until W2 [i] <> 0.0;

repeat

W3 [i] := random - 0.5; until W3 [i] <> 0.0;

repeat

W4 [i] := random - 0.5; until W4 [i] <> 0.0;

end;

end;

  • Читать дальше
  • 1
  • ...
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: