Основы 3Д. Координаты, преобразования



Скачать 102.26 Kb.
Дата26.07.2014
Размер102.26 Kb.
ТипДокументы
Иван Андреев

andreev.ia@gmail.com



Основы 3Д. Координаты, преобразования.

Целью данной работы является освоение работы с трехмерной графикой, матрицами преобразования и объектом BasicEffect в XNA Framework.



Задание на работу:

Отобразить координатные оси.

Поместить куб с длинной грани равной 1 в начало координат. Центр куба должен совпадать с началом координат.

Поместить куб с длинной грани равной 1 «на» первый куб. Верхняя грань первого куба должна совпадать с нижней гранью данного.

Поместить еще один куб в длинной грани равной 2. Центр куба должен совпадать с началом координат.

Кубы должны иметь различные цвета.

Для удобства отладки рекомендуется включить каркасный режим отображения объектов.

Теоретическая часть:

Основной теоретический материал, необходимый для данного задания, подробно описан в лекционных и практических занятиях.

В трехмерной графике каждая точка объекта описывается координатами по трем осям X, Y, Z. Значения координат могут принимать произвольные вещественные значения (вспомним, что в 2D графике координаты имели целочисленные значения). Имеется два различных варианта взимного расположения и направления осей.

В XNA Framework используется только правосторонняя система.

Объекты трехмерного мира должны быть в конечном итоге отображены на плоскую (двумерную) поверхность монитора. Такое преобразование делается в несколько этапов, в ходе которых происходит преобразование различных систем координат.

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



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

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

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

png" name="рисунок 2" align=bottom width=624 height=329 border=0>

Координаты камеры задают координаты объекта относительно наблюдателя и позволяют определить какие объекты в данный момент попали в зону наблюдения. Эта зона имеет форму усеченной пирамиды.

Координаты камеры можно получить путем умножения мировых координат на матрицу вида, которая задает параметры наблюдателя (позицию, направление обзора).

Далее, область, попавшую в усеченную пирамиду наблюдения, можно спроецировать на плоскость и, таким образом, получить координаты проекции. Обратите внимание на то, что координаты проекции являеются двумерными координатами. Обычно, плоскость проецирования имеет размер 1x1 для упрощения процесса проецирования.

Далее, полученную плоскость 1х1 можно нарисовать на экране монитора, получил там самым экранные координаты.

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

Можно описать процесс получения экранных координат из локальных следующим образом:

Экранные координаты=Локальные координаты * Мировая матрица * Матрица вида * Матрица проекции.

Для создания и работы с матрицами в XNA Framework существует тип Matrix, который создежит огромное количество методов для работы с матрицами.

Дополнительно существуют методы для создания «специализированных» матриц (мировой матрицы, матрицы вида и матрицы проекции).

Например, можно задать мировую матрицу одним из следующих методов:

Matrix world =

// Матрица масштабирования

Matrix.CreateScale(xScale, yScale, zScale) *

// Матрица поворота вокруг оси X

Matrix.CreateRotationX(xRotation) *

// Матрица поворота вокруг оси Y

Matrix.CreateRotationY(yRotation) *

// Матрица поворота вокруг оси Z

Matrix.CreateRotationZ(zRotation) *

// Матрица переноса

Matrix.CreateTranslation(xPosition, yPosition, zPosition);
world = Matrix.CreateWorld(positionVector, forwardVector, upVector);

Матрица вида задается следующим образом:

Matrix view = Matrix.CreateLookAt(cameraPosition, cameraTarget, cameraUpVector);

А матрицу проекции можно создать одним из следующих способов в зависимости от вида проективного преобразования:

Matrix.CreateOrthographic(width, height, zNearPlane, zFarPlane);

Matrix.CreateOrthographicOffCenter(left, right, bottom, top, zNearPlane, zFarPlane);

Matrix.CreatePerspective(width, height, nearPlaneDistance, farPlaneDistance);

Matrix.CreatePerspectiveOffCenter(left, right, bottom, top, nearPlaneDistance, farPlaneDistance);

Matrix.CreatePerspectiveFieldOfView(fieldOfView, aspectRation, nearPlaneDistance, farPlaneDistance);

Реализация

using System;

using System.Collections.Generic;

using System.Linq;

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Audio;

using Microsoft.Xna.Framework.Content;

using Microsoft.Xna.Framework.GamerServices;

using Microsoft.Xna.Framework.Graphics;

using Microsoft.Xna.Framework.Input;

using Microsoft.Xna.Framework.Media;

using Microsoft.Xna.Framework.Net;

using Microsoft.Xna.Framework.Storage;
namespace Lab3

{

///



/// This is the main type for your game

///

public class Game1 : Microsoft.Xna.Framework.Game

{

GraphicsDeviceManager graphics;



SpriteBatch spriteBatch;
VertexDeclaration vd;

VertexPositionColor[] vertices;

int[] indices;
VertexPositionColor[] axis;

int[] axisIndices;


BasicEffect effect;
public Game1()

{

graphics = new GraphicsDeviceManager(this);



Content.RootDirectory = "Content";

}
///

/// Allows the game to perform any initialization it needs to before starting to run.

/// This is where it can query for any required services and load any non-graphic

/// related content. Calling base.Initialize will enumerate through any components

/// and initialize them as well.

///

protected override void Initialize()

{

// TODO: Add your initialization logic here



effect = new BasicEffect(GraphicsDevice, null);
vd = new VertexDeclaration(GraphicsDevice, VertexPositionColor.VertexElements);

vertices = new VertexPositionColor[8];

// Цвета для вершин задавать необязательно, так как цвет будет задан при отрисовке

vertices[0].Position = new Vector3(-0.5f, 0.5f, 0.5f);

vertices[1].Position = new Vector3(0.5f, 0.5f, 0.5f);

vertices[2].Position = new Vector3(0.5f, -0.5f, 0.5f);

vertices[3].Position = new Vector3(-0.5f, -0.5f, 0.5f);

vertices[4].Position = new Vector3(0.5f, 0.5f, -0.5f);

vertices[5].Position = new Vector3(-0.5f, 0.5f, -0.5f);

vertices[6].Position = new Vector3(-0.5f, -0.5f, -0.5f);

vertices[7].Position = new Vector3(0.5f, -0.5f, -0.5f);
indices = new int[] {

0, 1, 2, 2, 3, 0,

4, 5, 6, 6, 7, 4,

2, 1, 4, 4, 7, 2,

6, 5, 0, 0, 3, 6,

1, 0, 5, 5, 4, 1,

3, 2, 7, 7, 6, 3

};
axis = new VertexPositionColor[4];


axis[0].Position = Vector3.Zero;

axis[1].Position = new Vector3(3, 0, 0);

axis[2].Position = new Vector3(0, 3, 0);

axis[3].Position = new Vector3(0, 0, 3);


axisIndices = new int[] { 0, 1, 0, 2, 0, 3};

base.Initialize();

}
///

/// LoadContent will be called once per game and is the place to load

/// all of your content.

///

protected override void LoadContent()

{

// Create a new SpriteBatch, which can be used to draw textures.



spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here

}
///

/// UnloadContent will be called once per game and is the place to unload

/// all content.

///

protected override void UnloadContent()

{

// TODO: Unload any non ContentManager content here



}
///

/// Allows the game to run logic such as updating the world,

/// checking for collisions, gathering input, and playing audio.

///

///
Provides a snapshot of timing values.

protected override void Update(GameTime gameTime)

{

// Allows the game to exit



if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

this.Exit();


// TODO: Add your update logic here
base.Update(gameTime);

}
///

/// This is called when the game should draw itself.

///

///
Provides a snapshot of timing values.

protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.Black);



// Включение каркасного режима отображения

GraphicsDevice.RenderState.FillMode = FillMode.WireFrame;

// Выключение отбраковки невидимых вершин

GraphicsDevice.RenderState.CullMode = CullMode.None;


// TODO: Add your drawing code here

Matrix world = Matrix.Identity;

Matrix view = Matrix.CreateLookAt(new Vector3(0.5f, 1, 5), Vector3.Zero, Vector3.Up);

Matrix proj = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 1, 10);


GraphicsDevice.VertexDeclaration = vd;
effect.World = world;

effect.View = view;

effect.Projection = proj;

effect.DiffuseColor = new Vector3(1, 1, 1);


effect.Begin();

foreach (EffectPass pass in effect.CurrentTechnique.Passes)

{

pass.Begin();



GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.LineList, axis, 0, axis.Length, axisIndices, 0, axisIndices.Length / 2);

pass.End();

}

effect.End();


effect.Begin();

effect.DiffuseColor = new Vector3(1, 0, 1);

foreach (EffectPass pass in effect.CurrentTechnique.Passes)

{

pass.Begin();



GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3);

pass.End();

}

effect.End();


effect.World = Matrix.CreateTranslation(0, 1, 0);

effect.Begin();

effect.DiffuseColor = new Vector3(1, 0, 0);

foreach (EffectPass pass in effect.CurrentTechnique.Passes)

{

pass.Begin();



GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3);

pass.End();

}

effect.End();



effect.World = Matrix.CreateScale(2);

effect.Begin();

effect.DiffuseColor = new Vector3(0, 1, 0);

foreach (EffectPass pass in effect.CurrentTechnique.Passes)

{

pass.Begin();



GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3);

pass.End();

}

effect.End();


base.Draw(gameTime);

}

}



}


Похожие:

Основы 3Д. Координаты, преобразования iconПреобразования в 2D пространстве Преобразования используются в разных целях
С аналитической точки зрения преобразования это пересчет значений координат. Двухмерные и трехмерные преобразования отличаются по...
Основы 3Д. Координаты, преобразования iconВопросы к экзамену Алгоритмы машинной графики. Двумерные преобразования. Перенос
Алгоритмы машинной графики. Двумерные преобразования. Однородные координаты. Перенос в однородных координатах
Основы 3Д. Координаты, преобразования iconАналитическая геометрия
Координаты на плоскости и в пространстве. Координаты точек и координаты векторов
Основы 3Д. Координаты, преобразования iconАфинные преобразования в пространстве
Трехмерная графика обозначается 3D (3-dimension). Однородные координаты описываются четверкой чисел (x,y,z,1) или (hx,hy,hz,h) при...
Основы 3Д. Координаты, преобразования iconКоординаты вектора
Научиться находить координаты векторов, координаты суммы и разности векторов, координаты произведения вектора на число
Основы 3Д. Координаты, преобразования iconРеферат на тему «Геометрические преобразования»
Геометрические преобразования являются достаточно поздним разделом математики. Первые геометрические преобразования стали рассматриваться...
Основы 3Д. Координаты, преобразования iconПрограмма государственного экзамена для специальности 010200 «Прикладная математика и информатика» Липецк 2005
Векторная алгебра. Аффинные координаты. Формулы преобразования координат. Прямые и плоскости
Основы 3Д. Координаты, преобразования icon«Координаты на плоскости» кр №14 «Координаты на плоскости»
На координатной плоскости постройте отрезок mn и прямую ак, если м (–4; 6), n (–1; 0), а (–8; –1), к (6; 6). Запишите координаты...
Основы 3Д. Координаты, преобразования iconУрок геометрии в 11-м классе по теме: "Координаты точки координаты вектора. Расстояние между точками. Координаты середины отрезка"
Образовательные: Рассмотреть понятие системы координат и координаты точки в пространстве; вывести формулу расстояния в координатах;...
Основы 3Д. Координаты, преобразования icon9 класс I тур Задача 1
Земля имеет правильную шарообразную форму с длиной окружности 40000 км, полярные координаты Лондона (географические координаты 51°...
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org