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

1
  private float angle = 0f ;

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

1
  angle + = 0 . 05f ;

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

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

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

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

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

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

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

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 ;
}

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

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 метода), так что запустите их в начале работы программы. Не забудьте объявить переменную для хранения вершин:

1
  private CustomVertex . PositionColored [ ] vertices ;

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