If KeyCode = vbKeyUp Then
icamx = icamx - 5
ElseIf KeyCode = vbKeyDown Then
icamx = icamx + 5
ElseIf KeyCode = vbKeyLeft Then
icamz = icamz - 5
Else
icamz = icamz + 5
End If
CameraX = 15 * Sin(icamz * 3.14 / 180)
CameraY = 15 * Sin(icamx * 3.14 / 180) * Cos(icamz * 3.14 / 180)
CameraZ = 15 * Cos(icamx * 3.14 / 180)
MyEngine.SetCameraPosition CameraX, CameraY, CameraZ
In that, icamx is the angle from the X axis, and icamz is the angle from the Z axis.
MyEngine is just a wrapper class I made for the boring stuff; SetEnginePosition just changes the View matrix's position to the X, Y, Z passed to it.
That math actually does work for meshes when I move them around, just not the camera. I think it may be related to the view matrix.
What should I do? Is combining the world and view matrices a better choice than setting the view matrix like I'm doing, or is there a fix for my trig (a trig fix would be easier because combining the view and world matrices would mean modifying my precious wrapper class I made :D).
Thanks for any suggestions!
- Steve.
Camera Rotation Around a Point
Sorry for posting two new topics so fast. This one isn't a major concern but I'd appreciate some help. I've Googled and looked it up to no avail.
Again I'm in D3D8 and VB6.
I have rendered a person and pushed my camera back along the +Z at (0,0,15) and had it face (0,0,0), such that I am looking at the top of the person's head; the person himself is facing in the +Y direction, his back to the -Y, etc. The up-vector is purely in the Y direction (0,1,0).
I want the user to be able to rotate down to the person's feet using the up and down keys on the keyboard (that is, rotate around the X-axis), then rotate around the person himself (the length of the person is along the Z-axis).
In other words, I want my two axes of rotation to be around the X and the Z. Around the X works, around the Z does not. I've looked this up and tried a few people's solutions, but none of them seem to be working. It's probably a math error. Here's the code:
Here's a typical setup I use for setting up viewing...
D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, 1.0f, 1.0f, 10000.0f);
D3DXVECTOR3 v3Camera = D3DXVECTOR3(0.0f, 0.0f, 15.0f);
D3DXVECTOR3 v3Up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
D3DXVECTOR3 v3At = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
D3DXMatrixLookAtLH(&matView, &v3Camera, &v3At, &v3Up);
D3DXMatrixIdentity(&matWorld);
m_pDev->SetTransform(D3DTS_WORLD, &matWorld);
m_pDev->SetTransform(D3DTS_VIEW, &matView);
m_pDev->SetTransform(D3DTS_PROJECTION, &matProj);
The camera in this case will always be pointing to the v3At point. The basic calls you're looking for when moving the camera around are:
D3DXVECTOR3 v3Camera = D3DXVECTOR3(0.0f, 0.0f, 15.0f); // To move the camera
D3DXMatrixLookAtLH(&matView, &v3Camera, &v3At, &v3Up); // Set the matrix
m_pDev->SetTransform(D3DTS_VIEW, &matView); // Apply the matrix
D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, 1.0f, 1.0f, 10000.0f);
D3DXVECTOR3 v3Camera = D3DXVECTOR3(0.0f, 0.0f, 15.0f);
D3DXVECTOR3 v3Up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
D3DXVECTOR3 v3At = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
D3DXMatrixLookAtLH(&matView, &v3Camera, &v3At, &v3Up);
D3DXMatrixIdentity(&matWorld);
m_pDev->SetTransform(D3DTS_WORLD, &matWorld);
m_pDev->SetTransform(D3DTS_VIEW, &matView);
m_pDev->SetTransform(D3DTS_PROJECTION, &matProj);
The camera in this case will always be pointing to the v3At point. The basic calls you're looking for when moving the camera around are:
D3DXVECTOR3 v3Camera = D3DXVECTOR3(0.0f, 0.0f, 15.0f); // To move the camera
D3DXMatrixLookAtLH(&matView, &v3Camera, &v3At, &v3Up); // Set the matrix
m_pDev->SetTransform(D3DTS_VIEW, &matView); // Apply the matrix
Hey Wild Bill, thanks for your reply!
I got that far for the most part; that setup is almost identical to mine. I think my question is math/theory related.
Using this code:
The camera started at (0,0,15) facing (0,0,0).
Now imagine icamx = -90. This would mean the camera is at (0,15,0) (still facing (0,0,0)).
Now I start to change icamz, but instead it looks like instead of the camera revolving about the Z-axis it starts to go upside-down and to one side, and eventually things get very hairy.
So any suggestions with those maths would be appreciated!
Thanks again for the reply, though, Bill!
- Steve.
I got that far for the most part; that setup is almost identical to mine. I think my question is math/theory related.
Using this code:
If KeyCode = vbKeyUp Then icamx = icamx - 5ElseIf KeyCode = vbKeyDown Then icamx = icamx + 5ElseIf KeyCode = vbKeyLeft Then icamz = icamz - 5Else icamz = icamz + 5End IfCameraX = 15 * Sin(icamz * 3.14 / 180)CameraY = 15 * Sin(icamx * 3.14 / 180) * Cos(icamz * 3.14 / 180)CameraZ = 15 * Cos(icamx * 3.14 / 180)MyEngine.SetCameraPosition CameraX, CameraY, CameraZ
The camera started at (0,0,15) facing (0,0,0).
Now imagine icamx = -90. This would mean the camera is at (0,15,0) (still facing (0,0,0)).
Now I start to change icamz, but instead it looks like instead of the camera revolving about the Z-axis it starts to go upside-down and to one side, and eventually things get very hairy.
So any suggestions with those maths would be appreciated!
Thanks again for the reply, though, Bill!
- Steve.
All right guys, I figured it out (I think).
The problem was I was putting the camera out along its up-vector axis and telling it to look at the origin, and for some reason that doesn't work. So when it got to that point, I had to change the camera's up-vector to keep everything right-side-up and in order.
But the original problem arose because my model was created in Blender which uses a right-handed coordinate system and D3D uses a left-handed coord system. So I was forcing my camera out along its up-vector axis to compensate for Blender's switching the axes (not knowing). Now all is well though!
- Steve.
The problem was I was putting the camera out along its up-vector axis and telling it to look at the origin, and for some reason that doesn't work. So when it got to that point, I had to change the camera's up-vector to keep everything right-side-up and in order.
But the original problem arose because my model was created in Blender which uses a right-handed coordinate system and D3D uses a left-handed coord system. So I was forcing my camera out along its up-vector axis to compensate for Blender's switching the axes (not knowing). Now all is well though!
- Steve.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement