• Create Account

## How to make camera roll whilst strafing

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

14 replies to this topic

### #1littletray26  Members

Posted 15 October 2012 - 07:13 AM

Hey gamedev

I'm currently working on an FPS, and at the moment I'm trying to write everything to do with walking.

My question to you is, how do you go about making the camera tilt slightly whilst strafing left and right as seen in some games?

I've tried a few things and have had a few problems. I've had problems specifying when the camera should stop rolling, I came up with a sort of solution to that, but I now have the problem where if I strafe, say to the right while turning the camera to the left (yaw) then stop the camera will be permenently tilted.

This is my code so far. It's bad, I know but I'm a beginner

Code messed up here - see second post

That seems to do the job. The camera rolls slightly and smoothly whilst strafing. The only problem is that if I strafe and turn yaw at the same time the camera ends up stuck tilted

Edited by littletray26, 15 October 2012 - 11:50 PM.

The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #2littletray26  Members

Posted 15 October 2012 - 07:17 AM

I don't know why the code has squished up like that, Heres a repost of the code:

[source lang="cpp"]float rollIndex = 0.01f;float rotZ = 0;float currentZRot = 0; //I use this to try and stop the roll where I want it//later on in codeif strafing left:if (currentZRot < 0.07f)rotZ += rollIndex;if strafing right:if (currentZRot > -0.07f)rotZ -= rollIndex;elseif (currentZRot < 0)rotZ += rollIndex;else if (currentZRot > 0)rotZ -= rollIndex;//that makes the camera roll back to the right way up//Later on in code//at the end of the cameras update functionroll(rotZ);currentZRot += rotZ;rotZ = 0.00f;//and here is my camera's yaw, pitch and roll functionsvoid Camera::pitch(float A){D3DXMATRIX T;D3DXMatrixRotationAxis(&T, &right, A);D3DXVec3TransformCoord(&lookDir, &lookDir, &T);}void Camera::yaw(float A){D3DXMATRIX T;D3DXMatrixRotationY(&T, A);D3DXVec3TransformCoord(&right, &right, &T);D3DXVec3TransformCoord(&lookDir, &lookDir, &T);}void Camera::roll(float A){D3DXMATRIX T;D3DXMatrixRotationAxis(&T, &lookDir, A);D3DXVec3TransformCoord(&right, &right, &T);D3DXVec3TransformCoord(&up, &up, &T);}[/source]

Edited by littletray26, 15 October 2012 - 07:25 AM.

The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #3littletray26  Members

Posted 15 October 2012 - 11:22 PM

Anybody?

Edited by littletray26, 18 October 2012 - 02:20 PM.

The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #4littletray26  Members

Posted 18 October 2012 - 03:56 PM

Shameless self bump
The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #5littletray26  Members

Posted 21 October 2012 - 03:12 AM

Sorry to do this again but I'm desperate for an answer. Bump again
The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #6Burnt_Fyr  Members

Posted 22 October 2012 - 12:27 PM

I'd love to help, as it seems you are very desperate, so...

{bump}.

I think people will need to see a bit more code to really make sense of what is going on, and perhaps a short video demonstrating the problem. What info have you gleaned from debugging the problem on your own?

Edited by Burnt_Fyr, 22 October 2012 - 12:28 PM.

### #7littletray26  Members

Posted 23 October 2012 - 12:05 AM

From what I can tell, it's a math problem. I'm pretty rubbish at math so I have no idea what's going on. I'll post a video and my entire camera class.

3DCamera.h
//Camera header
#include "Main.h"
class Camera
{
public:
D3DXMATRIX viewMatrix;
D3DXMATRIX projMatrix;
D3DXVECTOR3 pos;
D3DXVECTOR3 up;
D3DXVECTOR3 target;
D3DXVECTOR3 lookDir;
D3DXVECTOR3 right;
D3DXVECTOR3 acceleration;
D3DXVECTOR3 currentVel;
float maxWalkingVelocity;
void Initialize(D3DXVECTOR3 Position, D3DXVECTOR3 Up, D3DXVECTOR3 Target);
void Update(LPDIRECT3DDEVICE9& d3dDevice);
void Camera::pitch(float A);
void Camera::yaw(float A);
void Camera::roll(float A);
};


3DCamera.cpp
//Camera source file
#include "3DCamera.h"
extern bool ISINFOCUS;
float rotX = 0;
float rotY = 0;
float rotZ = 0;
float currentZRot = 0;
float rollIndex = 0.01f;
void Camera::Initialize(D3DXVECTOR3 Position, D3DXVECTOR3 Up, D3DXVECTOR3 Target)
{
maxWalkingVelocity = 0.3f;
D3DXMatrixPerspectiveFovLH(&projMatrix, D3DXToRadian(45), 800.0f / 600.0f, 1, 2000);
pos = Position;
up = Up;
target = Target;
lookDir = target - pos;
}
void Camera::Update(LPDIRECT3DDEVICE9& d3dDevice)
{
D3DXVec3Normalize(&lookDir, &lookDir);
D3DXVec3Cross(&right, &up, &lookDir);
D3DXVec3Normalize(&right, &right);
//Walk control
if(GetAsyncKeyState(0x57))
acceleration += lookDir * 0.02f;
if (GetAsyncKeyState(0x53))
acceleration += lookDir * -0.02f;
//Strafe control

if (GetAsyncKeyState(0x41))
{
acceleration += D3DXVECTOR3(right.x, 0, right.z) * -0.015f;
if (currentZRot < 0.07f)
rotZ += rollIndex;
}
else
if (GetAsyncKeyState(0x44))
{
acceleration += D3DXVECTOR3(right.x, 0, right.z) * 0.015f;
if (currentZRot > -0.07f)
rotZ -= rollIndex;
}
else
if (currentZRot < 0)
rotZ += rollIndex;
else if (currentZRot > 0)
rotZ -= rollIndex;

//look control
if (GetAsyncKeyState(VK_LEFT))
rotX -= 0.04f;
else
if (GetAsyncKeyState(VK_RIGHT))
rotX += 0.04f;

if (GetAsyncKeyState(VK_UP) && lookDir.y < 0.932f)
rotY -= 0.04f;
else
if (GetAsyncKeyState(VK_DOWN) && lookDir.y > -0.985f)
rotY += 0.04f;

static const float friction = 0.08f;
currentVel += acceleration;
currentVel += ((currentVel * friction * -1));
pos += currentVel;
acceleration = D3DXVECTOR3(0, 0, 0);
pitch(rotY);
yaw(rotX);
roll(rotZ);
D3DXMatrixLookAtLH(&viewMatrix, &pos, &(pos + lookDir), &up);
rotX = 0;
rotY = 0;
currentZRot += rotZ;
rotZ = 0.00f;
}
void Camera::pitch(float A)
{
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T, &right, A);
D3DXVec3TransformCoord(&lookDir, &lookDir, &T);
}
void Camera::yaw(float A)
{
D3DXMATRIX T;
D3DXMatrixRotationY(&T, A);
D3DXVec3TransformCoord(&right, &right, &T);
D3DXVec3TransformCoord(&lookDir, &lookDir, &T);
}
void Camera::roll(float A)
{
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T, &lookDir, A);
D3DXVec3TransformCoord(&right, &right, &T);
D3DXVec3TransformCoord(&up, &up, &T);
}


Then in my update loop I call
camera.Update(d3dDevice);


​END EMBARRASSING CODE

As for the video
The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #8Erik Rufelt  Members

Posted 23 October 2012 - 02:49 AM

Try drawing all your camera vectors to the screen. That way you can see what changes when the bug appears.

### #9littletray26  Members

Posted 23 October 2012 - 03:12 AM

Try drawing all your camera vectors to the screen. That way you can see what changes when the bug appears.

I will do that, thanks. I would assume it's the right vector though as it's the only one Roll and Yaw functions have in common...?
The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #10Burnt_Fyr  Members

Posted 23 October 2012 - 06:48 AM

Does it happen on all 4 possible combinations of strafe and yaw? It could be the lack of indentation but i think the if/else chain in strafe control is broken... I'll check back when i have time to examine it better.

### #11littletray26  Members

Posted 23 October 2012 - 06:57 AM

Does it happen on all 4 possible combinations of strafe and yaw? It could be the lack of indentation but i think the if/else chain in strafe control is broken... I'll check back when i have time to examine it better.

It happens in all 4 combinations. I've found the camera will end up leaning to the side of the direction I was strafing in. Also I don't think the if/else chain is broken. Perhaps you can see a problem in it I can't? The indentation seems to have been lost from VS to GameDev.

Edited by littletray26, 23 October 2012 - 06:58 AM.

The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #12Burnt_Fyr  Members

Posted 24 October 2012 - 11:16 AM

On closer look the if/else chain is correct, at first glace it seemed as if might be skipping the "unlean" part of the code in some instances. What does currentzrot look like after the problem has occurred?

### #13littletray26  Members

Posted 24 October 2012 - 01:28 PM

After the problem has occurred currentZRot is 0.00000000
The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

### #14Burnt_Fyr  Members

Posted 25 October 2012 - 12:23 PM

Have you tried what Erik suggested? I can't see any reason as to why, this is happening. But I have trouble enough debugging my own code, let alone someone elses. Your orthonormalization at the start of update looks sketchy, I don't think it does what you intend(I haven't used the d3dx library in a while, so i can't remember order of input/outputs for the cross product function).

Keep trying, you will solve your problem. It will likely be an AHA moment that wakes you from sleep, or hits you on the toilet, but keep plugging away at it.

### #15littletray26  Members

Posted 26 October 2012 - 12:55 AM

I'll write the vectors to the screen and have a look tonight.

I sure hope so.
The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.