jacobkristensen
asked on
Moving on a sphere facing center
Hi,
Is there an easy way (a supplied function or so) in DX8 to set the view matrix so that the viewer will be able to move around (as on a sphere) an object in all directions always facing the centre of the sphere?
What I do now is this (this allows me to move horizontally around the object in a circle and straight up and down always facing the object):
long lElapsedTime = timeGetTime() - m_dwTime;
m_dwTime = timeGetTime();
fHorzPos += fHorzSpeed * lElapsedTime;
vFromPt.x = sinf(fHorzPos) * 60.0f;
vFromPt.z = cosf(fHorzPos) * 60.0f;
fVertPos += fVertSpeed * lElapsedTime;
vFromPt.y = fVertPos * 60.0f;
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matVie w, &vFromPt, &vLookatPt, &vUpVec);
m_pd3dDevice->SetTransform (D3DTS_VIE W, &matView);
What I want is that when I move up or down, I always have the same distance to the object.
Do I have to do the calculations myself or is there already a function for this in DX8?
Jacob
Is there an easy way (a supplied function or so) in DX8 to set the view matrix so that the viewer will be able to move around (as on a sphere) an object in all directions always facing the centre of the sphere?
What I do now is this (this allows me to move horizontally around the object in a circle and straight up and down always facing the object):
long lElapsedTime = timeGetTime() - m_dwTime;
m_dwTime = timeGetTime();
fHorzPos += fHorzSpeed * lElapsedTime;
vFromPt.x = sinf(fHorzPos) * 60.0f;
vFromPt.z = cosf(fHorzPos) * 60.0f;
fVertPos += fVertSpeed * lElapsedTime;
vFromPt.y = fVertPos * 60.0f;
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matVie
m_pd3dDevice->SetTransform
What I want is that when I move up or down, I always have the same distance to the object.
Do I have to do the calculations myself or is there already a function for this in DX8?
Jacob
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Hi CyberMike3D
Thanks for your answers.
What I was doing, was moving the camera around the object and as you can see I was also using the D3DXMatrixLookAtLH function.
I ended up making a lot of changes to my game, so now I'm actually rotating the objects instead of moving the camera.
I'm happy to give you the points though, as you (of cource) gave me the answer for what I asked in the first place...
Thanks for your answers.
What I was doing, was moving the camera around the object and as you can see I was also using the D3DXMatrixLookAtLH function.
I ended up making a lot of changes to my game, so now I'm actually rotating the objects instead of moving the camera.
I'm happy to give you the points though, as you (of cource) gave me the answer for what I asked in the first place...
eye.X = posx(sel) + Sin(((hang) / 57.2958 - heading(sel) / 57.29)) * zoom * Cos(vang / 57.2958)
eye.Y = posy(sel) + Sin(vang / 57.2958 - roly(sel) / rad) * zoom
eye.z = posz(sel) + Cos(((hang) / 57.2958 - heading(sel) / 57.29)) * zoom * -1 * Cos(vang / 57.2958)
In the above code snippet. POSX, POSY, POSZ are then x,y,z coordinates of the object in space. ZOOM is the distance to the object. VANG = vertical angular offset (the tilt) and HANG = horizontal angular offset. When I want to pan and tilt the camera around an object, I merely assign the mouse x and y co ordinates to HANG and VANG. ROLY is the pitch of the object being viewed. In other words, if in this case, the aircraft goes nose down, the camera angle in increased so as to keep a constant vertical viewing angle to the craft. Likewise, heading is the direction that the target craft is facing. If the target turns right or left, so the camera turns, maintaining a constant orientation to the target.
In order to translate an X,Y,Z coordinate into a XANG, YANG, RANGE co ordinate, use the following routine.
ixdif = eyeposx - targetposx
iydif = eyeposz - targetposz
getcord
xang = itnang
ixdif = itargetrange
iydif = eyeposy - targetposy
getcord
yang = itnang
range = itargetrange
Sub getcord()
itargetrange = Sqr(ixdif ^ 2 + iydif ^ 2)
If iydif <> 0 Then itgan = Atn(ixdif / iydif) * 57.2958
If iydif = 0 And ixdif = 0 Then itgan = 0: itgang = 0
If iydif = 0 And ixdif < 0 Then itgan = 270
If iydif = 0 And ixdif > 0 Then itgan = 90
itgang = itgan
If iydif < 0 Then itgang = 180 + itgan
If ixdif < 0 And iydif > 0 Then itgang = 360 + itgan
itnang = ina + itgang
If itnang > 360 Then itnang = itnang - 360
If itnang < 0 Then itnang = itnang + 360
End Sub
Unfortunately the code is in visual basic ... but the math is correct. Let me know if u need any further assistance
Regards
Cybermike.