Михаил Краснов - Графика DirectX в Delphi

Тут можно читать онлайн Михаил Краснов - Графика DirectX в Delphi - бесплатно ознакомительный отрывок. Жанр: comp-programming. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика DirectX в Delphi
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    3.56/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Михаил Краснов - Графика DirectX в Delphi краткое содержание

Графика DirectX в Delphi - описание и краткое содержание, автор Михаил Краснов, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика DirectX в Delphi - читать онлайн бесплатно ознакомительный отрывок

Графика DirectX в Delphi - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Михаил Краснов
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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).

Этот многогранник описан двадцатью независимыми треугольниками Координаты - фото 80

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

Знаний, которые мы уже получили, достаточно, чтобы создать более-менее интересные построения. Пример - проект каталога Ех05, где рисуется простая модель человечка. Используются две геометрические формы: цилиндр и икосаэдр. С помощью клавиш перемещения курсора конечностями человечка можно управлять, заставляя его поднимать и опускать руки и ноги, но нельзя заставить поднять обе ноги одновременно (рис. 9.7).

Для построения ног применяются цилиндры единичной длины руки строятся - фото 81

Для построения ног применяются цилиндры единичной длины, руки строятся цилиндрами длиной 0.75 единиц. Движения конечностей осуществляются плавно:

const

INCR = 0.05; // Приращение для углов, задает темп вращения цилиндров

var

Down : BOOL = False; // Флаг, указывающий, нажата ли кнопка мыши

оХ : Integer; // Используются для навигации в пространстве

оУ : Integer;

Angle : Single = 0;

sHeight : Single = 0;

// Левая/правая стороны - с точки обзора зрителя

R_hand_up_angle, // Текущий угол поворота верхней части правой руки

R_hand_down_angle, // Текущий угол поворота нижней части правой руки

L_hand_up_angle, // Углы для частей левой руки

L_hand_down_angle,

R_foot_up_angle, // Углы для частей правой ноги

R_foot_down_angle,

L_foot_up_angle, // Углы поворотов левой ноги

L_foot_down_angle : Single;

R_hand_move, // Флаги перемещений конечностей

L_hand_move,

R_foot_move,

L_foot_move : BOOL;

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

procedure TfrmD3D.DrawScene;

var

matRotateX, matRotateZ : TDSDMatrix;

matScale, matTranslate : TD3DMatrix;

matWrk : TD3DMatrix; // Вспомогательная матрица текущей трансформации

begin

Timer; // Пересчет текущих значений углов поворота конечностей

// Икосаэдр головы

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

// Масштабируем единичный многогранник

SetScaleMatrix (matScale, 0.5, 0.5, 0.5);

matWrk := MatrixMul(matScale, matTranslate);

with FDSDDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

SetMaterial(MaterialYellow); // Желтого цвета

DrawPrimitive(D3DPT_TRIANGLELIST, 0, 20);

end;

// Цилиндры левой ноги

SetTranslateMatrixfmatTranslate, -0.2, 0.0, 0.0);

SetRotateXMatrix(matRotateX, L_foot_up_angle);

// Запоминаем положение верхней части

matWrk := MatrixMul(matTranslate, matRotateX);

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

SetMaterial(MaterialBlue); // Ноги - синего цвета

// Цилиндр единичной длины

DrawPrimitive(D3DPT_TRIANGLESTRIP, 60, 98);

end;

// Перемещаемся к концу цилиндра единичной длины

SetTranslateMatrix(matTranslate, 0.0, 1.0, 0.0);

// Поворот нижней части конечности

SetRotateXMatrix(matRotateX, L_foot_down_angle);

// Трансформации осуществляются относительно предыдущего состояния

// системы координат

matWrk := MatrixMul(matWrk, MatrixMul(matTranslate, matRotateX));

with FD3DDevi do begin

SetTransform(D3DTS_WORLD, matWrk);

DrawPrimitive(D3DPT_TRIANGLESTRIP, 60, 98);

end;

// Правая нога

SetTranslateMatrixfmatTranslate, 0.2, 0.0, 0.0);

SetRotateXMatrix(matRotateX, R_foot_up_angle);

// Запоминаем текущее положение верхней части правой ноги

matWrk := MatrixMul(matTranslate, matRotateX);

with FDSDDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

DrawPrimitive(D3DPT_TRIANGLESTRIP, 60, 98);

end;

// Трансформации в новой системе координат

SetTranslateMatrix(matTranslate, 0.0, 1.0, 0.0);

SetRotateXMatrix(matRotateX, R_foot_down_angle);

// Поворот и сдвиг - относительно текущей трансформации

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Михаил Краснов читать все книги автора по порядку

Михаил Краснов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика DirectX в Delphi отзывы


Отзывы читателей о книге Графика DirectX в Delphi, автор: Михаил Краснов. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x