2010-09-01 4 views
1

je dois développer une application dans wich l'étape finale consiste à exporter une vidéo (ou une seule image) d'une animation 3D générée par mon logiciel calcul des paramètres d'entrée de l'utilisateur.XNA pour rendre la vidéo 3D (fixe FPS!)

Je veux utiliser XNA et pour cela. J'ai besoin que le logiciel puisse exporter la vidéo FIXED FPS (ou aussi toutes les images séparées de la vidéo séparément). Ce n'est pas une question de FPS en direct. Je n'ai pas besoin de voir sur l'écran les images à un fps fixe. Comme l'animation pourrait être très complexe, je pourrais accepter que le logiciel prenne une minute pour chaque image.

L'important est que je peux voir le cadre alors qu'il rend et n'est pas sauté tout cadre. par ex. Si la vidéo dure 1 minute, elle doit exporter 24 images à 24 images par seconde même s'il faut 20 secondes pour afficher chaque image. Après rendu la première image (donc après 20sec) il n'a pas à rendre le cadre à 21sec. il a rendu de l'image [2/24 de la première minute]

Comment puis-je obtenir cela?

Merci!

Répondre

1

Voici la méthode pour faire cela pour XNA 4.0, décrit dans le code pour votre Game classe (car il est facile pour moi):

protected override void Update(GameTime gameTime) 
{ 
    // Do Nothing! 
} 

void RealUpdate() 
{ 
    const float deltaTime = 1f/60f; // Fixed 60 FPS  
    // Update your scene here 
} 

RenderTarget2D screenshot; 

protected override void LoadContent() 
{ 
    screenshot = new RenderTarget2D(GraphicsDevice, width, height, false, SurfaceFormat.Color, null); 
} 

protected override void UnloadContent() 
{ 
    screenshot.Dispose(); 
} 

int i = 0; 

protected override void Draw(GameTime) 
{ 
    RealUpdate(); // Do the update once before drawing each frame. 

    GraphicsDevice.SetRenderTarget(screenshot); // rendering to the render target 
    // 
    // Render your scene here 
    // 
    GraphicsDevice.SetRenderTarget(null); // finished with render target 

    using(FileStream fs = new FileStream(@"screenshot"+(i++)[email protected]".png", FileMode.OpenOrCreate) 
    { 
     screenshot.SaveAsPng(fs, width, height); // save render target to disk 
    } 

    // Optionally you could render your render target to the screen as well so you can see the result! 

    if(done) 
     Exit(); 
} 

Note: Je l'ai écrit sans compilation ou d'essai - donc il pourrait être une erreur mineure ou deux.

+0

Merci pour la réponse! je vais essayer! Comment suggérez-vous de suivre l'heure (l'image actuelle à mettre à jour) dans la fonction RealUpdate()? Dois-je implémenter une sorte de compteur d'entiers et l'incrémenter pour chaque RealUpdate? Ou je devrais suivre de toute façon le temps à travers l'objet XNA GameTime? – Alex

+0

Vous pouvez faire ce qui convient à votre animation. Vous pouvez stocker le nombre de secondes ou d'images depuis le début de votre animation. Ou vous pouvez stocker la position de tout et la mettre à jour d'une quantité constante chaque image (comme vous le feriez dans un vrai jeu). Ne créez pas d'objets 'GameTime' (normalement vous venez de les lire - mais dans votre cas, vous les ignorez délibérément). Stockez le temps comme 'float' ou' double' (pour stocker un certain nombre de secondes) ou 'TimeSpan'. –

Questions connexes