Getting a gun to move with a player

Started by
8 comments, last by Grimfate126 16 years, 11 months ago
Hi. Im working on an FPS. and ive stumbled onto my first roadblock. i need the gun to rotate with my player, and i cant figure out how. here are some 2d images to explain: (this is a top down view, for showing purposes. the real game will be like a normal first person shooter.) here is my scenario. suppose my player and gun is setup like this: http://img398.imageshack.us/img398/6479/gun1zj8.png now, my player simply rotates, and his position stays the same. http://img394.imageshack.us/img394/3342/gun2zl8.png as you can see, even though the player doesnt move, the location of the gun does move. what i need is a formula for figuring out the location and rotation of the gun, depending on the location and rotation of the player. thats where im stuck. Can anyone help me out? Thanks.
Advertisement
If I'm not much mistaken, it should be something like the following:

Given:

offset - the distance ahead of the player that you want the gun to remain.
angle - the player's angle, taken in this case from the y-axis.
gun_x - the gun's x coordinate.
gun_y - the gun's y coordinate.

x and y here are the axes aligned with the floor.

The formulae should be:

gun_x = offset*sin(angle)
gun_y = offset*cos(angle)

Unless I'm missing something...

MWAHAHAHAHAHAHA!!!

My Twitter Account: @EbornIan

To generalize Thaumaturge's answer a bit, I think what you're looking for is a transformation that combines the weapon's local-space transform with the player's world-space transform. (Among other things, this will give you greater flexibility with respect to the weapon's placement - for example, it could be positioned forward, up, and to the right relative to the player).

To do this, you'll want to construct a local-space transform for the weapon that will remain constant throughout the game (for now we'll leave aside animation effects such as bobbing or re-adjusting the weapon position).

I don't know what conventions you're using for model orientation and so forth, but most likely this transform will just be a translation that positions the weapon where you want it. Remember, this is in the player's local space, so if e.g. the player is looking down the z axis and y is up, the weapon translation might be (5,10,5).

Then, every frame, you combine this transform with the player's world transform to yield the weapon's world transform. Using column vectors:
matrix44 weapon_world_transform = player_world_transform * weapon_local_transform;render_weapon(weapon_world_transform);
For row vectors, you'd reverse the order of multiplication.

This method offers considerable flexibility, and will make it easier to e.g. add weapon animations and other effects at a later time.
I have same problem, and alot of the code samples you find online that show things like a quarternion first person shooter camera don't include samples for how to handle a standard first person shooter gun or projectile with the orientation/rotation for the first person shooter. I worked it out once a long time ago but now are stuck as I can't find the code when I had it working before so it's a stumbling block for me as well now.
Quote:Original post by Knight Chat X
I have same problem, and alot of the code samples you find online that show things like a quarternion first person shooter camera don't include samples for how to handle a standard first person shooter gun or projectile with the orientation/rotation for the first person shooter. I worked it out once a long time ago but now are stuck as I can't find the code when I had it working before so it's a stumbling block for me as well now.
I think what I posted above probably applies to the problems you're describing as well, so you might give it a read.
Quote:Original post by jyk
To generalize Thaumaturge's answer a bit, I think what you're looking for is a transformation that combines the weapon's local-space transform with the player's world-space transform. (Among other things, this will give you greater flexibility with respect to the weapon's placement - for example, it could be positioned forward, up, and to the right relative to the player).

To do this, you'll want to construct a local-space transform for the weapon that will remain constant throughout the game (for now we'll leave aside animation effects such as bobbing or re-adjusting the weapon position).

I don't know what conventions you're using for model orientation and so forth, but most likely this transform will just be a translation that positions the weapon where you want it. Remember, this is in the player's local space, so if e.g. the player is looking down the z axis and y is up, the weapon translation might be (5,10,5).

Then, every frame, you combine this transform with the player's world transform to yield the weapon's world transform. Using column vectors:
matrix44 weapon_world_transform = player_world_transform * weapon_local_transform;render_weapon(weapon_world_transform);
For row vectors, you'd reverse the order of multiplication.

This method offers considerable flexibility, and will make it easier to e.g. add weapon animations and other effects at a later time.


woah, you lost me. what exactly do you mean by local space transform? is it a vector? and whats the players world transform?

thanks!
Quote:Original post by Grimfate126
woah, you lost me. what exactly do you mean by local space transform? is it a vector? and whats the players world transform?

thanks!
What graphics API are you using? What math library? It'll be easier to give concrete examples if we have this information available.

Meanwhile, in 3D programming a transform is typically represented using a 4x4 matrix. If you're using a graphics API such as OpenGL or DirectX, then you're using 4x4 matrices (whether you know it or not).

Transforms can be combined to produce, well, combined transforms. Applying such combined transform has the effect, more or less, of applying the transforms that make it up 'in sequence'.

In our case we're interested in performing two transforms in sequence: first, we want to move the weapon to an appropriate position relative to the player in local space, and then we want to move it to the appropriate position and orientation in world space. This is done by multiplying together the matrix representing the weapon transform with the matrix representing the player transform.

If you can post what API you're using, I can probably provide a more specific example.
Quote:Original post by jyk
Quote:Original post by Grimfate126
woah, you lost me. what exactly do you mean by local space transform? is it a vector? and whats the players world transform?

thanks!
What graphics API are you using? What math library? It'll be easier to give concrete examples if we have this information available.

Meanwhile, in 3D programming a transform is typically represented using a 4x4 matrix. If you're using a graphics API such as OpenGL or DirectX, then you're using 4x4 matrices (whether you know it or not).

Transforms can be combined to produce, well, combined transforms. Applying such combined transform has the effect, more or less, of applying the transforms that make it up 'in sequence'.

In our case we're interested in performing two transforms in sequence: first, we want to move the weapon to an appropriate position relative to the player in local space, and then we want to move it to the appropriate position and orientation in world space. This is done by multiplying together the matrix representing the weapon transform with the matrix representing the player transform.

If you can post what API you're using, I can probably provide a more specific example.


im developing for the PSP console. im using the PSPGU. It is very similar to OpenGl, so you can explain in openGl "terms". and im using libm for math.
Quote:Original post by Grimfate126
im developing for the PSP console. im using the PSPGU. It is very similar to OpenGl, so you can explain in openGl "terms". and im using libm for math.
Ok, here's a quick example using OpenGL function calls:
glMatrixMode(GL_MODELVIEW);// Set up player transform and render player model:glTranslatef(player.pos.x, player.pos.y, player.pos.z);glRotatef(player.yaw, 0.f, 1.f, 0.f);RenderPlayer();// Set up weapon transform and render weapon model (note// that the weapon position is given in *local space*// relative to the player, and barring animation effects// should remain constant):glTranslate(weapon.pos.x, weapon.pos.y, weapon.pos.z);RenderWeapon();
Things I've skipped over include:

1. Setting up the view transform
2. Handling pitch (elevation)
3. Pushing and popping the matrix stack where appropriate

Also, if we're just talking about a first-person point of view here, you could just set up a separate transform for the weapon and render it in the player's local space (the above method will work for first-person if the view matrix is set up correctly, but it's geared more towards a third-person view).
Thanks, but i have one problem stopping me from doing that. Im using cameras, and not transforms. While, cameras do transform, it is not the same as what you're doing. So i think my only choice is to use trig. however, even with that, i am confused. Help?

Thanks for all replies. :)

This topic is closed to new replies.

Advertisement