Faire pivoter le Modèle 3D dans XNA
Je suis nouveau sur le XNA, et je suis entrain de créer un jeu simple. Désolé que c'est probablement très simple, mais je ne peux pas trouver l'aide sur elle. Il y a un bateau dans le jeu que j'ai fait avec Blender, et je veux être en mesure de contrôler le navire en étant capable de faire tourner le navire de X, Y et Z d'axes. Voici le code que j'ai:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
RotationMatrix = Matrix.CreateRotationY(MathHelper.PiOver2) * Matrix.CreateRotationY (rotationY) * Matrix.CreateRotationX(rotationX) * Matrix.CreateRotationZ(rotationZ);
Matrix shipTransformMatrix = RotationMatrix * Matrix.CreateTranslation(ship.Position);
DrawModel(ship.Model, shipTransformMatrix, ship.Transforms);
//TODO: Add your drawing code here
base.Draw(gameTime);
}
public void DrawModel(Model model, Matrix modelTransform, Matrix[] absoluteBoneTransforms)
{
//Draw the model, a model can have multiple meshes, so loop
foreach (ModelMesh mesh in model.Meshes)
{
//This is where the mesh orientation is set
foreach (BasicEffect effect in mesh.Effects)
{
effect.World = absoluteBoneTransforms[mesh.ParentBone.Index] * modelTransform;
effect.Projection = projectionMatrix;
effect.View = viewMatrix;
}
//Draw the mesh, will use the effects set above.
mesh.Draw();
}
}
Cela va tourner le navire, mais pas le long de l'axe du navire. Si j'effectue une rotation sur l'axe Y (en changeant la valeur de rotationY), le navire va faire pivoter le long de l'axe Y. Mais si je tourne l'axe X ou l'axe Z, le vaisseau tourne selon selon le monde du X et Z axes, ne lui sont pas propres. Comment puis-je faire si le bateau tourne sur son propre axes? Ai-je besoin de faire quelque chose de différent avec les matrices?
Grâce
OriginalL'auteur davidsbro | 2012-06-11
Vous devez vous connecter pour publier un commentaire.
À l'aide de CreateRotationX, CreateRotationY, & CreateRotationZ appliquer à toutes les rotations autour du monde ou les axes généraux. Le sens qu'il provoque votre objet pour la faire tourner autour du monde/global axes, pas votre local de l'objet axes.
À l'aide de CreateFromAxisAngle vous permet de saisir quelle que soit la rotation de l'axe que vous souhaitez, y compris le navire axes locaux.
Un changement dans votre rotation d'ensemble paradigme sera nécessaire, cependant, depuis une rotation autour d'un axe arbitraire comme le navire est, par exemple, peut causer un changement à l'une des 3 valeurs d'angle à la fois. Garder la trace de tout ce qui est inutilement difficile. Il y a un moyen plus simple:
Il suffit de stocker une rotation de la matrice (ou quaternion) forme au lieu des 3 angles.
Il arrive, j'ai écrit un billet de blog à ce sujet. stevehazen.wordpress.com/2010/02/15/...
Merci. J'avais trouvé le lien que vous avez mis en place juste avant de le mettre en place. lol. Je l'ai lu, et a été en mesure de résoudre le problème. Merci!!!! C'était vraiment très clair et très utile
OriginalL'auteur Steve H
EDIT: Donner un peu de crédit ici pour Steve ci-dessous (réponse très mate, été un moment depuis que j'ai fait beaucoup de 3D et en mathématiques).
Ce didacticiel va vous montrer comment configurer ce que Steve a suggéré!
http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Rotation_-_translation.php
Original Post:
Je crois que vous avez pour créer un effet.Rotation dans votre BasicEffect boucle.
Tous de ce qui est couvert dans la base de tutoriels sur MSDN à l'adresse que je crois. Votre code ressemble même il est venu de là.
http://msdn.microsoft.com/en-us/library/bb203897(v=xnagamestudio.31)
Si non, consultez ce lien, Reimer couvre tout ce qui est en 3D vaut le savoir pour commencer:
http://www.riemers.net/eng/Tutorials/XNA/Csharp/series1.php
RotationMatrix = Matrix.CreateRotationY(MathHelper.PiOver2) * Matrix.CreateRotationY (rotationY) * Matrix.CreateRotationX(rotationX) * Matrix.CreateRotationZ(rotationZ);
, selon l'axe I création d'une rotation pour la première tourne avec le navire, mais les deux après il ne l'est pas.Est-il un certian ordre, j'ai à de multiples matrices pour avoir leur rotation w/modèle?L'ordre n'a pas vraiment d'importance (pour autant que je n'ai jamais remarqué). Mais je vois votre problème. Procédez de la manière suivante: RotationMatrix = Matrice.CreateRotationY (rotationY) * Matrice.CreateRotationX(rotationX) * Matrice.CreateRotationZ(rotationZ);
Je devine que la MathHelper.PiOver2 était à pré-aligner votre navire à un certain angle. Au lieu de cela, pré-régler votre rotationY, X, Z pour les valeurs que vous voulez qu'il soit initialement, lorsque vous démarrez. Qui doit créer la rotation que vous êtes à la recherche pour. Avec il tourne sur son axe central.
Je suis sûr que l'ordre a de l'importance en raison de la façon dont les matrices sont multipliés. La matrice Une fois la Matrice B est différent de B fois A. j'ai essayé le code que vous avez dit, mais j'ai obtenu le même résultat. Si je ne
RotationMatrix = Matrix.CreateRotationY (rotationY) * Matrix.CreateRotationX(rotationX) * Matrix.CreateRotationZ(rotationZ);
le modèle de l'axe Y tourne avec elle, mais si je neRotationMatrix = Matrix.CreateRotationX (rotationX) * Matrix.CreateRotationY(rotationY) * Matrix.CreateRotationZ(rotationZ);
l'axe des X tourne avec le navire, tandis que l'axe n'est pas. Comment puis-je obtenir tous les axes de rotation?Vous avez raison davidsbro, l'ordre a de l'importance. Ce que vous vivez est une perte de degrés de liberté en raison de ce qui est connu comme "Gimbal Lock" comme vous le faites tourner sur les 3 axes. Vous pouvez contourner ce problème en utilisant les quaternions opérations combinées ensemble pour produire la rotation que vous recherchez. (Source: en.wikipedia.org/wiki/Gimbal_lock) (Source: en.wikipedia.org/wiki/Quaternion)
OriginalL'auteur Nick Funk
Voici ce que j'ai fait juste au cas où quelqu'un d'autre est coincé comme je l'ai fait:
OriginalL'auteur davidsbro