Jump to content
  • Advertisement
Sign in to follow this  
RoyP

Need help getting a child object to orbit a parent object ...

This topic is 1995 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm trying to figure out how to make a child object orbit around a parent object.  In my situation, I'm trying to create a parent ship that rotates waypoints with it when it rotates.  A smaller child ship will park itself in a waypoint to maintain it's position within the fleet.  

 

Here are a couple of images showing what I'm going for:

 

io0tbm.png 33kd3s6.png 

 

The child ship must keep it's position relative to the parent ship so it maintains it's position within the fleet.

 

i've tried learning enough about matrices to do it, but I'm screwing something up.  I've got my child ship orbiting the origin point of the screen instead of the parent ship.

 

Here's the code I'm using when I press a key:

parentShipRotationRadians += MathHelper.ToRadians(15);
childShipRotationRadians += MathHelper.ToRadians(15);
                    
Matrix.CreateRotationZ(parentShipRotationRadians, out childShipRotationMatrix);

childShipPositionPoint = Vector2.Transform(childShipPositionPoint, childShipRotationMatrix);

 

 

How do I rotate the child ship's center point around the parent ship's center point with matrices?  

 

Please break it down for me and help me understand what you're doing.  I've tried researching it and I just can't find the info.

 

Roy

Share this post


Link to post
Share on other sites
Advertisement

This looks like a conceptual glitch.

The worldview for your parentship should not be the same as for your child ship, for what you're trying to achieve.

Remember that your childship has a worldview dependency on the way parentship gets projected.

In short, the worldview matrix of childship keeps changing according to parentship view matrix.

Share this post


Link to post
Share on other sites

I'm not doing anything with a matrix for the parent ship.  I'm just assigning it's rotation a value in the Update method and using that value to change the angle the texture is rendered at in the Draw method.  The parent ship's texture is just rotating at the center point of the screen.

 

Roy

Share this post


Link to post
Share on other sites

[quote name='RoyP' timestamp='1357140875' post='5016709']
I'm not doing anything with a matrix for the parent ship.
[/quote]

 

That's why I am saying that you need to do something about it, to achieve what you're looking for. In mathematical terms, what you need to implement is something like Lorentz Transformation.

Share this post


Link to post
Share on other sites

So how would I go about doing that?  This is my first adventure with matrices, so I need some help understanding what I'm supposed to do and why.

 

Roy

Share this post


Link to post
Share on other sites

Ok, I understand what you're saying conceptually.  How do I actually implement that in XNA?  Can you break it down step-by-step for me?  It would really help me learn it since this is my first time doing anything like this.

 

Roy

Share this post


Link to post
Share on other sites

Here's the class code from my Game1.cs file.  The only thing I left out was the using statements and the namespace.

 

public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        float inputDelay;
        float maxInputDelay = 0.2f;

        Texture2D shipTexture;
        Vector2 shipTextureOriginPoint;
        
        Texture2D dotTexture;
        Vector2 dotTextureOriginPoint;

        Vector2 dotPositionPoint;

        Vector2 parentShipPositionPoint;
        float parentShipRotationRadians;
        
        Vector2 childShipPositionPoint;
        float childShipRotationRadians;
        Matrix childShipMatrix;
        Matrix childShipRotationMatrix;        
        
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            graphics.PreferredBackBufferWidth = 1280;
            graphics.PreferredBackBufferHeight = 720;
            IsMouseVisible = true;

            base.Initialize();
        }
        
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here
            shipTexture = Content.Load<Texture2D>(@"textures\ship_with_outline");
            dotTexture = Content.Load<Texture2D>(@"textures\dot");

            shipTextureOriginPoint = new Vector2(shipTexture.Width / 2, shipTexture.Height / 2);
            dotTextureOriginPoint = new Vector2(dotTexture.Width / 2, dotTexture.Height / 2);

            dotPositionPoint = new Vector2(GraphicsDevice.Viewport.Width / 2, 
                                           GraphicsDevice.Viewport.Height / 2);

            parentShipPositionPoint = new Vector2(GraphicsDevice.Viewport.Width / 2,                      
                                                  GraphicsDevice.Viewport.Height / 2);
            parentShipRotationRadians = 0;

            childShipPositionPoint = new Vector2(parentShipPositionPoint.X - 47, 
                                                 parentShipPositionPoint.Y - 47);
            childShipRotationRadians = 0;

            childShipMatrix = new Matrix();
            childShipMatrix.Translation = new Vector3(childShipPositionPoint.X, 
                                                      childShipPositionPoint.Y, 
                                                      0);

            childShipRotationMatrix = new Matrix();            
        }
                
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }
                
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here
            if (inputDelay > 0)
                inputDelay -= (float)gameTime.ElapsedGameTime.TotalSeconds;

            if (inputDelay < 0)
                inputDelay = 0;

            if (inputDelay == 0)
            {
                if (Keyboard.GetState().IsKeyDown(Keys.Right))
                {
                    parentShipRotationRadians += MathHelper.ToRadians(15);
                    childShipRotationRadians += MathHelper.ToRadians(15);
                                                            
                    Matrix.CreateRotationZ(parentShipRotationRadians, out childShipRotationMatrix);

                    childShipPositionPoint = Vector2.Transform(childShipPositionPoint, 
                                                               childShipRotationMatrix);
                                        
                    inputDelay = maxInputDelay;
                }       
            }

            base.Update(gameTime);
        }
                
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            // TODO: Add your drawing code here
            spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);

            spriteBatch.Draw(dotTexture, 
                             dotPositionPoint, 
                             null, 
                             Color.Yellow, 
                             0, 
                             dotTextureOriginPoint, 
                             0.6f, 
                             SpriteEffects.None, 
                             0.001f);

            spriteBatch.Draw(shipTexture, 
                             parentShipPositionPoint, 
                             null, 
                             Color.BlueViolet, 
                             parentShipRotationRadians, 
                             shipTextureOriginPoint, 
                             2.0f, 
                             SpriteEffects.None, 
                             0.301f);

            spriteBatch.Draw(shipTexture, 
                             childShipPositionPoint, 
                             null, 
                             Color.Orange, 
                             childShipRotationRadians, 
                             shipTextureOriginPoint, 
                             1.0f, 
                             SpriteEffects.None, 
                             0.300f);

            spriteBatch.End();

            base.Draw(gameTime);
        }
    }

 

I basically want to rotate the parent ship by 15 degrees when I press the right key and have the child ship stay in the correct formation to it.  I also want to rotate the parent ship by -15 degrees when I press the left key and have the child ship stay in the correct formation to it.

 

This is just a really simple sandbox I'm using to learn how to implement this.

 

Roy

Share this post


Link to post
Share on other sites

Try changing shipTextureOriginPoint to dotTextureOriginPoint in below code and let me know what you see is as per your requirement or no. Snapshot would be nice.

 

spriteBatch.Draw(shipTexture, 
                             childShipPositionPoint, 
                             null, 
                             Color.Orange, 
                             childShipRotationRadians, 
                             shipTextureOriginPoint, // Change this one
                             1.0f, 
                             SpriteEffects.None, 
                             0.300f);

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!