C# XNA Follow camera 3d model
2013-03-19T11:16:47+01:00
2013-03-19T14:19:39+01:00
2022-07-19T04:36:03+02:00
Peti_22
Üdv,

XNA 4.0-át és VS 2012-öt használok!

Az lenne a gondom, hogy semmi használható leírást vagy segítséget nem találtam ahhoz, hogy hogyan tudnék olyan kamera pozíciót megadni, hogy az a modellt kövesse.

Alapul ezt a tutort vettem: Tutorial 1: Displaying a 3D Model on the Screen

Tehát egy világot szeretnék amiben egy 3d modell szabadon mozog és a kamera bizonyos távolságból követi minden mozdulatát. Ha a modell megfordul akkor a kamera is fordul vele.

Itt az eddig összetákolt nagyon vacak kódom:

using System; using System.Collections.Generic; using System.Linq; //using System.Runtime.InteropServices; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace ElsoAblakom { public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; graphics.PreferredBackBufferWidth = 1024; graphics.PreferredBackBufferHeight = 768; graphics.PreferMultiSampling = false; //graphics.IsFullScreen = true; } protected override void Initialize() { // TODO: Add your initialization logic here base.Initialize(); } // Set the 3D model to draw. Model myModel; // The aspect ratio determines how to scale 3d to 2d projection. float aspectRatio; protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. //Hozz létre egy új SpriteBatchet, amit arra tudnak használni, hogy szöveteket rajzoljon. spriteBatch = new SpriteBatch(GraphicsDevice); myModel = Content.Load<Model>("Models\p1_wedge"); aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width / (float)graphics.GraphicsDevice.Viewport.Height; // TODO: use this.Content to load your game content here } protected override void UnloadContent() { // TODO: Unload any non ContentManager content here } protected void UpdateInput() { KeyboardState keyState = Keyboard.GetState(PlayerIndex.One); if (keyState.IsKeyDown(Keys.Right)) { modelRotation -= 0.01f; cameraRotation -= 0.01f; } if (keyState.IsKeyDown(Keys.Left)) { modelRotation += 0.01f; cameraRotation += 0.01f; } if (keyState.IsKeyDown(Keys.Up)) { Vector3 modelVelocityAdd = Vector3.Zero; modelVelocityAdd.X = -(float)Math.Sin(modelRotation); modelVelocityAdd.Z = -(float)Math.Cos(modelRotation); modelVelocity += modelVelocityAdd; } if (keyState.IsKeyDown(Keys.Down)) { Vector3 modelVelocityAdd = Vector3.Zero; modelVelocityAdd.X = -(float)Math.Sin(modelRotation); modelVelocityAdd.Z = -(float)Math.Cos(modelRotation); modelVelocity -= modelVelocityAdd; } if (keyState.IsKeyDown(Keys.R)) { modelPosition = Vector3.Zero; modelVelocity = Vector3.Zero; modelRotation = 0.0f; } } Vector3 modelVelocity = Vector3.Zero; protected override void Update(GameTime gameTime) { KeyboardState keyState = Keyboard.GetState();//Billentyűzet kezelésére szolgál. GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);//XBOX 360 Kontroller kezelésére szolgál. #region Sugó: if (keyState.IsKeyDown(Keys.F1) || gamePadState.Buttons.Start == ButtonState.Pressed)//Sugó. { System.Windows.Forms.MessageBox.Show("F1\t-\tSugó\nEscape\t-\tKilépés\nEnter\t-\tTeljes képernyő ki/be", "Sugó", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); } #endregion #region Kilépés a játékból: if (keyState.IsKeyDown(Keys.Escape) || gamePadState.Buttons.Back == ButtonState.Pressed)//Kilép a játékból az ESC billentyű lenyomására. { var dialogResult = System.Windows.Forms.MessageBox.Show("Biztosan ki akarsz lépni a játékból?", "Kilépés", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question); if (dialogResult == System.Windows.Forms.DialogResult.Yes) { this.Exit(); } else if (dialogResult == System.Windows.Forms.DialogResult.No) { //do something else } } #endregion #region Teljes képernyő ki/be: if (keyState.IsKeyDown(Keys.Enter))//Teljes képernyő ki/be. { if (graphics.IsFullScreen == true) { graphics.IsFullScreen = false; } else if (graphics.IsFullScreen == false) { graphics.IsFullScreen = true; } } #endregion //myCamera.OrbitUp(PlayerOne.ThumbSticks.Right.Y / 4); //myCamera.OrbitRight(PlayerOne.ThumbSticks.Right.X / 4); // TODO: Add your update logic here // Get some input. UpdateInput(); // Add velocity to the current position. modelPosition += modelVelocity; // Bleed off velocity over time. modelVelocity *= 0.95f; base.Update(gameTime); } // Set the position of the model in world space, and set the rotation. Vector3 modelPosition = Vector3.Zero; float modelRotation = 0.0f; // Set the position of the camera in world space, for our view matrix. //Vector3 cameraPosition = new Vector3(0.0f, 50.0f, 5000.0f); Vector3 cameraPosition; float cameraRotation = 0.0f; protected override void Draw(GameTime gameTime) { cameraPosition = modelPosition + new Vector3(modelRotation, 0.0f, 5000.0f); GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: Add your drawing code here // Copy any parent transforms. Matrix[] transforms = new Matrix[myModel.Bones.Count]; myModel.CopyAbsoluteBoneTransformsTo(transforms); // Draw the model. A model can have multiple meshes, so loop. foreach (ModelMesh mesh in myModel.Meshes) { // This is where the mesh orientation is set, as well as our camera and projection. foreach (BasicEffect effect in mesh.Effects) { effect.EnableDefaultLighting(); effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(modelRotation) * Matrix.CreateTranslation(modelPosition); //effect.View = Matrix.CreateLookAt(cameraPosition, modelPosition, Vector3.Up); effect.View = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(cameraRotation) * Matrix.CreateTranslation(cameraPosition); effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f); } // Draw the mesh, using the effects set above. mesh.Draw(); } base.Draw(gameTime); } } }


Ilyen jellegű tutoriálokat nem találtam sajnos :/
Mutasd a teljes hozzászólást!
elsőnek annak nézz utána, hogy miként lehet kamerát létrehozni.

ezt most a googli dobta ki
link

ha figyelmesen megnézed látni fogod, hogy lehet viewmatrix-ot létrehozni.
Ez azért fontos, mert abban tudod megadni, hogy a kamera pontosan mit nézzen.

a kamera pozícióját pedig a tárgy pozíciójából meg tudod határozni. (elforgatod, eltolod (vagy fordítva, úr Isten de rég volt ez))

összefoglalva
1. kiszámítod a tárgy pozícióját
2. abból kiszámítod a kamera pozícióját
3. meghatározod a viewMatrixot:

_viewMatrix = Matrix.CreateLookAt(_cameraPosition, _objectPosition, Vector3.Up);
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd