|
- Disegnare un triangolo
tridimensionale che ruota -
|
|||
| COSA SERVE PER QUESTO TUTORIAL | |||
| Download | Chiedi sul FORUM | Glossario | cognizioni basiche di C# e sul framework XNA | ||
| Introduzione alla creazione di giochi 3D con XNA | |||
UN TRIANGOLO IN UNO SPAZIO TRIDIMENSIONALE Come servirsi di BasicEffect per creare una semplice realtà 3D. Questo è il primo, introduttivo, articolo alla programmazione di videogiochi tridimensionali con XNA 4.0. Per ora ci limiteremo a creare una realtà tridimensionale e ad inserire un triangolo, farlo ruotare e far ruotare la camera. Per fare questo ci serviremo di un oggetto di tipo BasicEffect, che andrà configurato con una matrice di vista (View), una di proiezione (Projection) e una per la trasformazione da applicare al mondo (World). In particolare la matrice per la vista sarà ottenuta a partire da tre vettori: uno per la posizione della camera (CameraPosition), uno per il suo obiettivo (CameraTarget) e una per la direzione che punta in alto rispetto alla camera (CameraUp):
public class Triangolo3DGame : Microsoft.Xna.Framework.Game {
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
// Matrice che descrive la vista della camera
Matrix View;
// Matrice che determina la prospettiva
Matrix Projection;
// Matrice delle trasformazione da applicare al mondo
Matrix World;
// Posizione della camera
Vector3 CameraPosition = new Vector3(0.0f, 0.0f, 5.0f);
// Punto osservato dalla camera
Vector3 CameraTarget = Vector3.Zero;
// L'alto rispetto alla camera
Vector3 CameraUp = Vector3.Up;
VertexPositionColor[] vertices;
// Effetto per renderizzare la realtà tridimensionale
BasicEffect Effect;
// Fattore di rotazione
float Rotation = 0.0f;
// ...
}
Rotation è una variabile che indica la rotazione, in gradi, da applicare
alla camera e al mondo.
protected override void Initialize() {
// Creiamo due triangoli, uno per quando viene visualizzato davanti e uno per dietro
this.vertices = new VertexPositionColor[]
{
//Triangle 1
new VertexPositionColor( new Vector3(-1,-1,0), Color.Red),
new VertexPositionColor( new Vector3(0,1,0), Color.Green),
new VertexPositionColor( new Vector3(1,-1,0), Color.Blue),
//Triangle 2
new VertexPositionColor( new Vector3(1,-1,0), Color.Blue),
new VertexPositionColor( new Vector3(0,1,0), Color.Green),
new VertexPositionColor( new Vector3(-1,-1,0), Color.Red),
};
// ...
}
Quindi, sempre nel metodo Initialize, inizializziamo le tre matrici suddette:
// Creiamo la matrice della vista a partire da posizione, direzione e orientamento della camera
View = Matrix.CreateLookAt(CameraPosition, CameraTarget, CameraUp);
// Creiamo la matrice di proiezione prospettica
Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
this.GraphicsDevice.Viewport.Width / this.GraphicsDevice.Viewport.Height, 0.01f, 1000.0f);
// Inizialmente non applichiamo nessuna trasformazione alla realtà 3D
World = Matrix.Identity;
La vista (View) è ottenuta combinando tramite l'apposita funzione
Matrix.CreateLookAt la posizione della camera (CameraPosition),
precedentemente inizializzata alle coordinate (0, 0, 5), la direzione in
cui guardare (CameraTarget), ovvero l'origine, e infine un vettore che
indica la direzione che è "su" rispetto alla camera, semplicemente
Vector3.Up in questo caso. Ad ogni Update non dovremo far altro che incrementare il fattore di rotazione (Rotation) di un paio di gradi:
protected override void Update(GameTime gameTime) {
// Ad ogni update incrementiamo la rotazione di 2.0 gradi
Rotation += MathHelper.ToRadians(2.0f);
base.Update(gameTime);
}
È infine nel metodo Draw impostare il nostro BasicEffect con tutte le matrici preordinate e con qualche rotazione a piacere, ad esempio
protected override void Draw(GameTime gameTime) {
GraphicsDevice.Clear(Color.CornflowerBlue);
// Impostiamo l'effetto
// Impostiamo la vista su quella della camera
Effect.View = View;
// Impostiamo la proiezione
Effect.Projection = Projection;
// Ruotiamo l'intera realtà 3D attorno alla asse Y
Effect.World = World * Matrix.CreateRotationY(Rotation);
Effect.VertexColorEnabled = true;
// Disegnamo il triangolo
foreach (EffectPass pass in Effect.CurrentTechnique.Passes) {
pass.Apply();
this.GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length / 3);
}
base.Draw(gameTime);
}
Come si può vedere abbiamo moltiplicato la matrice World per una
rotazione attorno all'asse Y determinata dalla nostra variabile
Rotation. Quindi non abbiamo fatto altro che applicare l'effetto e
disegnare i nostri vertici tramite il metodo DrawUserPrimitives. // Ruotiamo la camera attorno al suo asse Z effect.View = View * Matrix.CreateRotationZ(Rotation); // Impostiamo la proiezione Effect.Projection = Projection; // Ruotiamo l'intera realtà 3D attorno alla asse Y (o X, o entrambi) effect.World = World * Matrix.CreateRotationX(Rotation) * Matrix.CreateRotationY(Rotation); Effect.VertexColorEnabled = true;
|
|||
| << INDIETRO | by VeNoM00 | ||