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

C#
1
 private float angle = 0f;

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

C#
1
 angle += 0.05f;

Для применения данного угла вращения к сцене нужно добавить перед device.DrawUserPrimitives следующую строку:

C#
1
 device.Transform.World = Matrix.RotationZ(angle);

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

C#
1
 device.Transform.World = Matrix.Translation(-5,-10*1/3,0)*Matrix.RotationZ(angle);

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

C#
1
 device.Transform.World = Matrix.Translation(-5,-10*1/3,0)*Matrix.RotationAxis(new Vector3(angle*4,angle*2,angle*3), angle);

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

C#
1
2
3
4
5
6
7
private void CameraPositioning()
{
  device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI/4, this.Width/this.Height, 1f, 50f);
  device.Transform.View = Matrix.LookAtLH(new Vector3(0,0,-30), new Vector3(0,0,0), new Vector3(0,1,0));
  device.RenderState.Lighting = false;
device.RenderState.CullMode = Cull.None;
}

Вынесите объявление вершин также в отдельную процедуру:

C#
1
2
3
4
5
6
7
8
9
10
private void VertexDeclaration()
{
vertices = new CustomVertex.PositionColored[3];
vertices[0].Position = new Vector3(0f, 0f, 0f);
vertices[0].Color = Color.Red.ToArgb();
vertices[1].Position = new Vector3(10f, 0f, 0f);
vertices[1].Color = Color.Green.ToArgb();
vertices[2].Position = new Vector3(5f, 10f, 0f);
vertices[2].Color = Color.Yellow.ToArgb(); 
}

Эти процедуры могут вызываться только один раз(ускорив обработку OnPaint метода), так что запустите их в начале работы программы. Не забудьте объявить переменную для хранения вершин:

C#
1
 private CustomVertex.PositionColored[] vertices;

В следующей главе мы поговорим о работе сразу с несколькими треугольниками.