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

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

Шрифт:

DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 50 * 2 - 2);

end;

// Конус стрелки по оси Z

SetTranslateMatrix(matTranslate, 0.0, 0.0, 2.0);

SetScaleMatrix(matScale, 0.5, 0.5, 1.0); with FD3DDevice do begin

SetTransform(D3DTS_WORLD, MatrixMul(matScale, matTranslate));

DrawPrimitive(D3DPT_TRIANGLEFAN, 100, 49);

DrawPrimitive(D3DPT_TRIANGLEFAN, 151, 50);

end;

// Чайник, вращающийся вокруг осей X и Y

SetRotateXMatrix(matRotateX, Angle);

SetRotateYMatrixfmatRotateY, Angle);

SetTranslateMatrix(matTranslate, 0.0, -1.5, 0.0);

SetScaleMatrix(matScale, 0.5, 0.5, 0.5); // Уменьшаем в два раза

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, MatrixMul(matRotateX, MatrixMul(matRotateY, MatrixMul(matScale, matTranslate))));

SetMaterial(MaterialYellow);

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

SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

DrawPrimitive(D3DPT_TRIANGLELIST, 100 + 51 * 2, 6322);

end;

// Матрица вида

SetViewMatrix(matView, DSDVector(FromX, FromY, FromZ),

D3DVector(AtX, AtY, AtZ), DSDVector(WorldUpX, WorldUpY, WorldUpZ));

FD3DDevice.SetTransform(D3DTS_VIEW, matView); // Матрица проекций

SetProjectionMatrix(matProj, fFOV, fAspect, fNearPlane, fFarPlane);

FD3DDevice.SetTransform(D3DTS_PROJECTION, matProj);

end;

Поначалу, наверняка, вам будет тяжело разбирать последовательности манипуляций с матрицами при воспроизведении нескольких объектов. Для приобретения опыта попробуйте решить простейшие задачи, например удлините цилиндры и конусы осей.

Но главное предназначение этого примера - разрешить все возможные вопросы об установках матриц вида и проекций. По нажатии клавиши <Пробел> появляется вспомогательное окно, в полях редактирования которого выводится текущее значение управляющих переменных:

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

Shift: TShiftState);

begin

if Key = VKJESCAPE then Close else

if Key = VK_SPACE then with Form2 do begin

edtFromX.Text := FloatToStr (FromX);

edtFromY.Text := FloatToStr (FromY);

edtFromZ.Text := FloatToStr (FromZ);

edtAtX.Text := FloatToStr (AtX);

edtAtY.Text := FloatToStr (AtY) ;

edtAtZ.Text := FloatToStr (AtZ);

edtWorldUpX.Text := FloatToStr (WorldUpX);

edtWorldUpY.Text := FloatToStr (WorldUpY);

edtWorldUpZ.Text := FloatToStr (WorldUpZ);

edtFOV.Text := FloatToStr (fFOV);

edtAspect.Text := FloatToStr (fAspect);

edtNearPlane.Text := FloatToStr (fNearPlane);

edtFarPlane.Text := FloatToStr (fFarPlane);

Show;

end;

end;

Первоначально мы видим только две оси: стрелка оси Z закрыта вращающейся моделью. Меняя значения координат вектора "From", мы передвигаем точку обзора - координаты той точки в пространстве, где находится глаз наблюдателя. Вектор "At" определяет точку, находящуюся в середине сцены. Если здесь задавать отличные друг от друга значения, то наша композиция будет перемещаться по плоскости экрана, т. е. этот вектор соответствует направлению взгляда наблюдателя. Вектор "WorldUp" указывает направление и величину поворота головы. Если менять значения его составляющих, оси нашей сцены начнут "меняться местами".

Значение FOV задает величину производимого увеличения в радианах. Чем меньше это число, тем крупнее выглядит наша картинка. Обратите внимание, что сами объекты при этом не перемещаются, мы как будто просто вращаем колесико настройки бинокля. Значение величины Aspect определяет степень сжатия картинки по горизонтали: чем больше это число, тем сильнее растягивается изображение. Обычно здесь передается отношение ширины окна к его высоте.

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

Надеюсь, неспешная работа с этим примером позволит вам хорошо разобраться с матрицами, определяющими вид картинки.

Подготовка моделей

Конусы и цилиндры, сфера и правильные многогранники - все подобные геометрические фигуры легко описываются и могут украсить вашу программу. Пример - проект каталога Ех04, в котором рисуется икосаэдр (рис. 9.6).

Этот многогранник описан двадцатью независимыми треугольниками. Координаты вершин и нормали я предварительно вычислил и использую в программе конкретные значения.

  • Читать дальше
  • 1
  • ...
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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