- •Введение
- •Часть I. Краткие основы Visual c# Глава 1. Основные определения книги
- •1.1. Требования для установки Visual Studio 2005
- •Глава 2. Методика разработки приложений для выполнения расчетов с эффектами анимации
- •Глава 3. Методика разработки приложений на нескольких формах
- •Часть II. Методология проектирования графики и печати на принтере Глава 4. Краткие сведения о графических возможностях Visual Studio
- •Глава 5. Рисование простых линий на форме или элементах управления и печать этих линий
- •Глава 6. Рисование сложных линий и печать всей формы как снимка экрана
- •Глава 8. Рисование текста и печать текстового файла
- •Глава 7. Рисование заполненных фигур и печать всей формы с предварительным просмотром
- •Часть III. Методология вычислений на основе Visual c# с использованием эффектов анимации Глава 9. Методика создания вычислительной системы
- •Глава 10. Арифметические вычисления
- •10.3. Анимация в виде циклического изменения непрозрачности панели
- •Глава 11. Разработка стандартного калькулятора
- •11.3. Анимация в виде циклического изменения цвета формы
- •11.4. Выполнение расчетов
- •Глава 12. Вычисление процентов
- •Глава 13. Степени, корни, логарифмы и факториалы
- •Часть IV. Методология вычислений на основе интеграции Visual c# с другими платформами Глава 14. Использование в Visual c# программ из Excel
- •Глава 15. Вычисление сложных математических выражений
- •Часть V. Интеграция Visual c# с Word Глава 16. Оглавление приложения по использованию методов Word
- •Глава 17. Запуск Word, добавление нового и открытие существующего документа
- •17.3. Выполнение программы
- •Часть VI. Получение расчетных параметров из баз данных Access Глава 18. Оглавление приложения по использованию Access
- •18.1. Алгоритм оглавления и проектирование формы
- •Глава 19. Открытие Access
- •Часть VII. Создание баз данных и интеграция с другими субд Глава 20. Создание баз и наборов данных
- •Глава 21. Архитектура доступа к данным ado.Net
- •Глава 22. Разработка баз данных при помощи шаблонов
- •22.1. Создание проекта sql Server Project
- •Часть VIII. Методология создания графической системы в двухмерном пространстве Глава 23. Алгоритмы и оглавление графической системы
- •Глава 24. График линейной функции
- •Глава 25. Графики типичных функций
- •Глава 26. Рисование при помощи перемещения мыши
- •Глава 27. Рисование линий при помощи нажатия кнопки мыши
- •Глава 28. Рисование прямоугольников и эллипсов при помощи нажатия кнопки мыши
- •Глава 29. Рисование заполненных прямоугольников и эллипсов при помощи нажатия кнопки мыши
- •Глава 30. Непрерывный график-осциллограмма и его проверка при помощи диспетчера задач и файла подкачки
- •Часть IX. Методология создания графической системы в трехмерном пространстве Глава 31. Теория и алгоритмы системы
- •32.1. Основные схемы интеграции
- •Глава 33. Изображение и управление трехмерными объектами в трехмерном пространстве
- •Глава 34. Изображение и управление трехмерными объектами в трехмерном пространстве на Visual Basic для интеграции с Visual c# и другими языками
- •Глава 35. Изображение объектов в трехмерном пространстве на Visual c# по данным из проекта на Visual Basic
- •35.1. Постановка задачи и проектирование формы
- •Глава 37. Изображение и управление поверхностями в трехмерном пространстве
- •Глава 40. Расчет и изображение линий уровня на поверхности
- •Часть X. Методология создания анимационной трехмерной графики на основе новых версий Visual c# и DirectX Глава 44. Методика проектирования неподвижных и подвижных плоских фигур
- •Глава 45. Методика проектирования неподвижных и подвижных пространственных фигур
- •Часть XI. Методология разработки мультимедиа и игр на основе Microsoft Agent Глава 46. Загрузка и установка компонентов Microsoft Agent
- •46.1. Краткие сведения о Microsoft Agent
- •Глава 47. Методика управления мультипликационными персонажами
- •Глава 48. Вывод на экран выступлений и анимаций всех персонажей
- •Глава 49. Методика создания компьютерных игр и мультфильмов
- •49.4. Выполнение программы
- •Глава 50. Пример Интернет-магазина на основе Microsoft Agent
- •Глава 51. Построение графика по точкам эксперимента и интеграция с мультипликационными персонажами ms Agent
- •Часть XII. Методология анимации объектов Глава 52. Оглавление системы программ для анимации объектов
- •52.1. Алгоритм и проект системы
- •Глава 53. Варианты часов с цифровой индикацией, индикаторами прогресса и датой
- •Глава 54. Вращение линии
- •Глава 55. Управляемое вращение линии
- •Глава 56. Управляемое вращение и перемещение фигуры
- •Глава 57. Управляемое заполнение фигур
- •Глава 58. Управляемый мигающий текст
- •Глава 59. Методика изображения летающих предметов
- •Глава 60. Методика анимации градиентного заполнения текста цветом
- •Глава 61. Вращающееся градиентное заполнение фигур цветом
- •Глава 62. Изображение кругов на воде с использованием двойной буферизации
- •Глава 63. Анимация текста в консольном приложении
- •Часть XIII. Методология создания, конвертирования и мультипликации изображений на форме Глава 64. Методика задания, конвертирования и поочередной замены изображений
- •Глава 65. Методика разработки мультипликации
- •Глава 66. Разработка мультипликации при помощи списка рисунков
- •Глава 67. Методика управления цветом изображения
- •Часть XIV. Воспроизведение аудио и видео Глава 68. Оглавление приложения по интеграции Visual c# с Windows Media Player
- •Глава 69. Воспроизведение аудио файлов из приложения Visual с#
- •Глава 70. Воспроизведение видео файлов из приложения Visual c#
- •70.3. Выполнение программы
- •Глава 72. Интеграция Visual c# с браузером Internet Explorer
- •Глава 73. Установка веб-компонентов Windows для веб-программирования на основе asp.Net
- •Часть XVI. Введение в программирование мобильных устройств Глава 74. Программирование портативных и карманных компьютеров
- •Часть XVII. Приложения Visual c# для использования на практике, например, в промышленности Глава 75. Алгоритмы для расчета площади, объема и массы изделий и заготовок
- •75.1. Объектно-ориентированный анализ геометрии изделий
- •Глава 76. Консольное приложение для расчета массы изделий
- •Глава 77. Вычисление массы изделий при помощи формы
- •Часть XVIII. Приложения Visual c# для использования в учебе и науке Глава 78. Ввод в систему свойств материалов для изготовления изделий
- •Глава 79. Математическое моделирование обработки заготовки при помощи аналитических решений
- •Глава 80. Математическое моделирование обработки заготовки при помощи метода конечных элементов
- •Глава 81. Математическое моделирование и графика для типичных техпроцессов
- •Глава 82. Методология учета анизотропии материала при проектировании техпроцесса изготовления изделия
- •Глава 83. Методология проектирования техпроцессов изготовления изделий коробчатой формы
- •Часть XIX. Методология создания и внедрения систем компьютерного проектирования Глава 84. Оптимизация раскроя материалов
- •Глава 85. Система компьютерного проектирования техпроцессов
- •Глава 86. Проектирование заготовительных операций подготовки материала
- •Глава 87. Проектирование операций изготовления заготовок
- •Глава 88. Проектирование операций обработки заготовок
- •Глава 89. Проектирование финишных операций изготовления изделий
- •Заключение
- •Часть XX. Передача приложения заказчику Глава 90. Методика передачи приложения пользователю
- •90.1. Этапы разработки программы для установки приложения
- •90.2. Создание проекта для установки приложения
- •Описание содержимого компакт-диска и схема использования
- •Список литературы
- •Предметный указатель
Глава 45. Методика проектирования неподвижных и подвижных пространственных фигур
Открываем файл Form1.cs (например, по схеме: File, Open, File) и выше пространства имен с именем нашего проекта (namespace Visual_DirectX_n5) записываем директивы для подключения пространств имен:
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Direct3D = Microsoft.DirectX.Direct3D;
Листинг 45.1. Методы для визуализации преобразованных вершин фигуры.
//Глобальные переменные.
//Объявляем устройство для визуализации вершин:
Device myDevice = null;
VertexBuffer myVertexBuffer = null;
PresentParameters myPresentParameters =
new PresentParameters();
bool myPause = false;
//Задаем параметры DirectX:
public bool InitializeDirectX()
{
try
{
myPresentParameters.Windowed = true;
myPresentParameters.SwapEffect =
SwapEffect.Discard;
myPresentParameters.EnableAutoDepthStencil = true;
myPresentParameters.AutoDepthStencilFormat =
DepthFormat.D16;
//Создаем устройство для визуализации:
myDevice = new Device(0, DeviceType.Hardware, this,
CreateFlags.SoftwareVertexProcessing,
myPresentParameters);
myDevice.DeviceReset +=
new System.EventHandler(this.OnResetDevice);
this.OnCreateDevice(myDevice, null);
this.OnResetDevice(myDevice, null);
myPause = false;
return true;
}
catch (DirectXException)
{
//Перехвачена ошибка инициализации DirectX:
return false;
}
}
//Создаем буфер вершин фигуры:
public void OnCreateDevice(object sender, EventArgs e)
{
Device myDev = (Device)sender;
myVertexBuffer = new VertexBuffer(
typeof(CustomVertex.PositionNormal), 100, myDev,
Usage.WriteOnly, CustomVertex.PositionNormal.Format,
Pool.Default);
myVertexBuffer.Created += new System.EventHandler(
this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(myVertexBuffer, null);
}
//Задаем параметры устройству:
public void OnResetDevice(object sender, EventArgs e)
{
Device myDev = (Device)sender;
//Выключаем режим CullMode, чтобы видеть
//внутреннюю и наружную поверхности фигуры:
myDevice.RenderState.CullMode = Cull.None;
//Включаем Z - буфер:
myDevice.RenderState.ZBufferEnable = true;
//Делаем доступным освещение:
myDevice.RenderState.Lighting = true;
}
//Строим фигуру в буфере вершин:
public void OnCreateVertexBuffer(object sender, EventArgs e)
{
VertexBuffer myVB = (VertexBuffer)sender;
//В структуре PositionNormal
//создаем массив из 100 пользовательских вершин:
CustomVertex.PositionNormal[] Vertex =
(CustomVertex.PositionNormal[])myVB.Lock(0, 0);
for (int i = 0; i < 50; i++)
{
//Заполняем вершины данными:
float theta = (float)(2 * Math.PI * i) / 49;
//Вращающийся конус с одной неподвижной вершиной.
//Рассчитываем координаты вершин:
Vertex[2 * i].Position =
new Vector3((float)Math.Sin(theta), -1,
(float)Math.Cos(theta));
//Рассчитываем нормали в вершинах:
Vertex[2 * i + 1].Normal =
new Vector3((float)Math.Sin(theta), -1,
(float)Math.Cos(theta));
}
//Открываем буфер вершин:
myVB.Unlock();
}
//Включаем таймер и выполняем матричные преобразования:
private void SetupMatrices()
{
//Используем глобальную матрицу (world matrix),
//чтобы вращать фигуру вокруг оси y:
myDevice.Transform.World = Matrix.RotationAxis(
new Vector3(
(float)Math.Cos(Environment.TickCount / 250.0f), 1,
(float)Math.Sin(Environment.TickCount / 250.0f)),
Environment.TickCount / 3000.0f);
//Задаем координаты глаза наблюдателя
//в матрице вида (view matrix):
myDevice.Transform.View = Matrix.LookAtLH(
new Vector3(0.0f, 3.0f, -5.0f),
new Vector3(0.0f, 0.0f, 0.0f),
new Vector3(0.0f, 1.0f, 0.0f));
//При помощи матрицы проецирования (projection matrix)
//выполняем перспективные преобразования:
myDevice.Transform.Projection =
Matrix.PerspectiveFovLH(
(float)Math.PI / 4.0f, 1.0f, 1.0f, 100.0f);
}
//Определяем освещение фигуры цветом формата ARGB:
private void SetupLights()
{
//Устанавливаем материал и его цвет.
//Можно одновременно использовать только один материал:
Material myMaterial = new Material();
Color myColor = Color.White;
myMaterial.Diffuse = myColor;
myMaterial.Ambient = myColor;
myDevice.Material = myMaterial;
//Устанавливаем белое освещение
//с изменяющимся направлением:
myDevice.Lights[0].Type = LightType.Directional;
myDevice.Lights[0].Diffuse = Color.DarkTurquoise;
myDevice.Lights[0].Direction = new Vector3(
(float)Math.Cos(Environment.TickCount / 250.0f), 1.0f,
(float)Math.Sin(Environment.TickCount / 250.0f));
//Включаем освещение:
myDevice.Lights[0].Enabled = true;
//Включаем немного отраженного (Ambient)
//равномерно рассеянного света:
myDevice.RenderState.Ambient = Color.FromArgb(0x202020);
}
//Выполняем визуализацию преобразованных вершин:
public void myRendering()
{
if (myPause) return;
//Очищаем и заливаем форму Form1 белым цветом:
myDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer,
Color.White, 1.0f, 0);
//Начинаем сцену:
myDevice.BeginScene();
//Устанавливаем освещение и матерал:
SetupLights();
//Задаем матрицы (world, view, projection):
SetupMatrices();
myDevice.SetStreamSource(0, myVertexBuffer, 0);
myDevice.VertexFormat =
CustomVertex.PositionNormal.Format;
//Рисуем фигуру:
myDevice.DrawPrimitives(
PrimitiveType.TriangleStrip, 0, (4 * 25) - 2);
//Заканчиваем сцену:
myDevice.EndScene();
//Обновляем экран:
myDevice.Present();
}
//Останавливаем вращение фигуры
//во время изменения размеров формы Form1:
protected override void OnResize(System.EventArgs e)
{
myPause = ((this.WindowState ==
FormWindowState.Minimized) || !this.Visible);
}
//Закрываем форму Form1 после нажатия клавиши Esc:
protected override void OnKeyPress(KeyPressEventArgs e)
{
if ((int)(byte)e.KeyChar == (int)Keys.Escape)
this.Close();
}
Листинг 45.2. Код для вывода формы и рисования на ней графики.
using (Form1 myForm1 = new Form1())
{
if (!myForm1.InitializeDirectX())
{
MessageBox.Show("Ошибка при инициализации DirectX.");
return;
}
//Показываем форму Form1:
myForm1.Show();
//Рисуем графику на форме Form1:
while (myForm1.Created)
{
myForm1.myRendering();
Application.DoEvents();
}
}
Открываем файл Form1.cs (например, по схеме: File, Open, File) и выше пространства имен с именем нашего проекта (namespace Visual_DirectX_n6) записываем директивы для подключения пространств имен:
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Direct3D = Microsoft.DirectX.Direct3D;
Коды для обработки щелчков по всем кнопкам на форме Form1 (рис. 45.4) приведены выше в этой части книги.
Теперь в любом месте файла Form1.cs (например, ниже предыдущих методов для обработки щелчков по кнопкам) записываем следующие методы для выполнения матричных преобразований вершин фигуры (с текстуры) и визуализации этих преобразований в динамике.
Листинг 45.3. Методы для визуализации преобразованных вершин фигуры.
//Глобальные переменные.
//Объявляем устройство для визуализации вершин:
Device myDevice = null;
VertexBuffer myVertexBuffer = null;
//Объявляем и инициализируем объект myTexture
//класса Texture:
Texture myTexture = null;
PresentParameters myPresentParameters =
new PresentParameters();
bool myPause = false;
//Задаем параметры DirectX:
public bool InitializeDirectX()
{
try
{
myPresentParameters.Windowed = true;
myPresentParameters.SwapEffect = SwapEffect.Discard;
myPresentParameters.EnableAutoDepthStencil = true;
myPresentParameters.AutoDepthStencilFormat =
DepthFormat.D16;
//Создаем устройство для визуализации:
myDevice = new Device(0, DeviceType.Hardware, this,
CreateFlags.SoftwareVertexProcessing,
myPresentParameters);
myDevice.DeviceReset +=
new System.EventHandler(this.OnResetDevice);
this.OnCreateDevice(myDevice, null);
this.OnResetDevice(myDevice, null);
myPause = false;
return true;
}
catch (DirectXException)
{
//Перехвачена ошибка инициализации DirectX:
return false;
}
}
//Создаем буфер вершин фигуры:
public void OnCreateDevice(object sender, EventArgs e)
{
Device myDev = (Device)sender;
myVertexBuffer = new VertexBuffer(
typeof(CustomVertex.PositionNormalTextured), 100,
myDev, Usage.WriteOnly,
CustomVertex.PositionNormalTextured.Format,
Pool.Default);
myVertexBuffer.Created +=
new System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(myVertexBuffer, null);
}
//Задаем параметры устройству:
public void OnResetDevice(object sender, EventArgs e)
{
Device myDev = (Device)sender;
//Выключаем режим CullMode, чтобы видеть
//внутреннюю и наружную поверхности фигуры:
myDev.RenderState.CullMode = Cull.None;
//Выключаем трехмерное освещение:
myDev.RenderState.Lighting = false;
//Включаем Z - буфер (ZBuffer):
myDev.RenderState.ZBufferEnable = true;
//Создаем нашу текстуру.
//Загружаем на поверхность фигуры наш рисунок Texture_1
//в виде текстуры:
myTexture = TextureLoader.FromFile(myDev,
Application.StartupPath + @"\..\..\Texture_1.bmp");
}
//Строим фигуру в буфере вершин:
public void OnCreateVertexBuffer(object sender, EventArgs e)
{
VertexBuffer myVB = (VertexBuffer)sender;
//В структуре PositionNormalTextured
//создаем массив из 100 пользовательских вершин:
CustomVertex.PositionNormalTextured[] Vertex =
(CustomVertex.PositionNormalTextured[])myVB.Lock(0, 0); // Lock the buffer (which will return our structs)
for (int i = 0; i < 50; i++)
{
//Заполняем вершины данными:
float theta = (float)(2 * Math.PI * i) / 49;
//Рассчитываем нормали в вершинах:
Vertex[2 * i].Normal = new Vector3((float)Math.Sin(theta), 0, (float)Math.Cos(theta));
//Добавляем в вершину v-компоненту текстуры:
Vertex[2 * i].Tv = 1.0f;
//Рассчитываем координаты вершин:
Vertex[2 * i + 1].Position = new Vector3((float)Math.Sin(theta), 1, (float)Math.Cos(theta));
//Добавляем в вершину u-компоненту текстуры:
Vertex[2 * i + 1].Tu = ((float)i) / (50 - 1);
}
//Открываем буфер вершин:
myVB.Unlock();
}
//Включаем таймер и выполняем матричные преобразования:
private void SetupMatrices()
{
//Используем глобальную матрицу (world matrix),
//чтобы вращать фигуру вокруг оси y.
myDevice.Transform.World = Matrix.RotationAxis(
new Vector3(
(float)Math.Cos(Environment.TickCount / 250.0f), 1,
(float)Math.Sin(Environment.TickCount / 250.0f)),
Environment.TickCount / 1000.0f);
//Задаем координаты глаза наблюдателя
//в матрице вида (view matrix):
myDevice.Transform.View = Matrix.LookAtLH(
new Vector3(0.0f, 3.0f, -5.0f),
new Vector3(0.0f, 0.0f, 0.0f),
new Vector3(0.0f, 1.0f, 0.0f));
//При помощи матрицы проецирования (projection matrix)
//выполняем перспективные преобразования:
myDevice.Transform.Projection =
Matrix.PerspectiveFovLH(
(float)Math.PI / 4.0f, 1.0f, 1.0f, 100.0f);
}
//Выполняем визуализацию преобразованных вершин:
public void myRendering()
{
if (myPause) return;
//Очищаем и заливаем форму Form1 белым цветом:
myDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer,
Color.White, 1.0f, 0);
//Начинаем сцену:
myDevice.BeginScene();
//Задаем матрицы (world, view, projection):
SetupMatrices();
//Устанавливаем нашу текстуру:
myDevice.SetTexture(0, myTexture);
myDevice.TextureState[0].ColorOperation =
TextureOperation.Modulate;
myDevice.TextureState[0].ColorArgument1 =
TextureArgument.TextureColor;
myDevice.TextureState[0].ColorArgument2 =
TextureArgument.Diffuse;
myDevice.TextureState[0].AlphaOperation =
TextureOperation.Disable;
//Рисуем фигуру:
myDevice.SetStreamSource(0, myVertexBuffer, 0);
myDevice.VertexFormat =
CustomVertex.PositionNormalTextured.Format;
myDevice.DrawPrimitives(
PrimitiveType.TriangleStrip, 0, (4 * 25) - 2);
//Заканчиваем сцену:
myDevice.EndScene();
//Обновляем экран:
myDevice.Present();
}
//Останавливаем вращение фигуры
//во время изменения размеров формы Form1:
protected override void OnResize(System.EventArgs e)
{
myPause = ((this.WindowState ==
FormWindowState.Minimized) || !this.Visible);
}
//Закрываем форму Form1 после нажатия клавиши Esc:
protected override void OnKeyPress(KeyPressEventArgs e)
{
if ((int)(byte)e.KeyChar == (int)Keys.Escape)
this.Close();
}
Теперь в файле Form1.cs (или Program.cs) находим главный метод Main, комментируем весь имеющийся в этом методе автоматически сгенерированный код и записываем код со следующего листинга.
Листинг 45.4. Код для вывода формы и рисования на ней графики.
using (Form1 myForm1 = new Form1())
{
if (!myForm1.InitializeDirectX())
{
MessageBox.Show("Ошибка при инициализации DirectX.");
return;
}
//Показываем форму Form1:
myForm1.Show();
//Рисуем графику на форме Form1:
while (myForm1.Created)
{
myForm1.myRendering();
Application.DoEvents();
}
}
По этой методологии можно в проектах Visual C# при помощи DirectX проектировать разнообразные анимированные объемные изображения.
