Модератор: Mikle
Public Sub UpdateCam()
Dim t As Single
t1 = Timer
t = (t1 - t2) * CamSpeed
t2 = t1
CosA = Cos(Angle)
SinA = Sin(Angle)
Cosd = Cos(Diff)
Sind = Sin(Diff)
GetCursorPos MousePos
If KeyDown(203) Then'right
CamPos.x = CamPos.x - CosA * t
CamPos.z = CamPos.z - SinA * t
SetCam
End If
If KeyDown(205) Then 'left
CamPos.x = CamPos.x + CosA * t
CamPos.z = CamPos.z + SinA * t
SetCam
End If
If KeyDown(208) Then 'down
CamPos.x = CamPos.x - SinA * t * Cosd
CamPos.z = CamPos.z + CosA * t * Cosd
CamPos.y = CamPos.y + Sind * t
SetCam
End If
If KeyDown(200) Then 'up
CamPos.x = CamPos.x + SinA * t * Cosd
CamPos.z = CamPos.z - CosA * t * Cosd
CamPos.y = CamPos.y - Sind * t
SetCam
End If
SetCam
GetCursorPos MousePos
If (MousePos.x <> CenterX) Or (MousePos.y <> CenterY) Then
Angle = Angle + (MousePos.x - CenterX) * Sens
Diff = Diff + (MousePos.y - CenterY) * Sens
If Diff > 1.6 Then Diff = 1.6 'предел
If Diff < -1.6 Then Diff = -1.6 'наклона
SetCursorPos CenterX, CenterY
SetCam
End If
End Sub
Private Sub SetCam()
Dim Mtrx As D3DMATRIX
D3DXMatrixRotationX Mtrx, Diff
d3dDevice.SetTransform D3DTS_VIEW, Mtrx
D3DXMatrixRotationY Mtrx, Angle
d3dDevice.MultiplyTransform D3DTS_VIEW, Mtrx
D3DXMatrixTranslation Mtrx, -CamPos.x, -CamPos.y, -CamPos.z
d3dDevice.MultiplyTransform D3DTS_VIEW, Mtrx
D3DXMatrixPerspectiveFovRH Mtrx, PI / 4, 1!, 6!, 63000!
d3dDevice.SetTransform D3DTS_PROJECTION, Mtrx
End Sub
D3DXMatrixPerspectiveFovLH Pi/4, 1!,6!,63000!
D3DXMatrixPerspectiveFovRH Mtrx, PI / 4, 1!, 6!, 63000!
d3dDevice.SetTransform D3DTS_PROJECTION, Mtrx?
Sub SetCam()
Dim fSpeed As Single
Dim fAngularSpeed
fSpeed = 5 * 0.05
fAngularSpeed = 1 * 0.05
' Slowdown the camera movement
D3DXVec3Scale m_vVelocity, m_vVelocity, 0.9
m_fYawVelocity = m_fYawVelocity * 0.9
m_fPitchVelocity = m_fPitchVelocity * 0.9
' Process keyboard input
If (m_bKey(vbKeyRight)) Then m_vVelocity.X = m_vVelocity.X + fSpeed ' Slide Right
If (m_bKey(vbKeyLeft)) Then m_vVelocity.X = m_vVelocity.X - fSpeed ' Slide Left
If (m_bKey(vbKeyUp)) Then m_vVelocity.Y = m_vVelocity.Y + fSpeed ' Move up
If (m_bKey(vbKeyDown)) Then m_vVelocity.Y = m_vVelocity.Y - fSpeed ' Move down
If (m_bKey(vbKeyW)) Then m_vVelocity.Z = m_vVelocity.Z + fSpeed ' Move Forward
If (m_bKey(vbKeyS)) Then m_vVelocity.Z = m_vVelocity.Z - fSpeed ' Move Backward
If (m_bKey(vbKeyE)) Then
m_fYawVelocity = m_fYawVelocity + fSpeed ' Yaw right
End If
If (m_bKey(vbKeyQ)) Then
m_fYawVelocity = m_fYawVelocity - fSpeed ' Yaw left
End If
If (m_bKey(vbKeyZ)) Then
m_fPitchVelocity = m_fPitchVelocity + fSpeed ' turn down
End If
If (m_bKey(vbKeyA)) Then
m_fPitchVelocity = m_fPitchVelocity - fSpeed ' turn up
End If
' Update the position vector
Dim vT As D3DVECTOR, vTemp As D3DVECTOR
D3DXVec3Scale vTemp, m_vVelocity, fSpeed
D3DXVec3Add vT, vT, vTemp
D3DXVec3TransformNormal vT, vT, matRoll
D3DXVec3Add vPos, vPos, vT
' Update the yaw-pitch-rotation vector
AngleY = AngleY + fAngularSpeed * m_fYawVelocity
AngleX = AngleX + fAngularSpeed * m_fPitchVelocity
If (AngleX < 0) Then AngleX = 0
If (AngleX > g_pi / 2) Then AngleX = g_pi / 2
Dim qR As D3DQUATERNION, det As Single
D3DXQuaternionRotationYawPitchRoll qR, AngleY, AngleX, 0
D3DXMatrixAffineTransformation matRoll, 1.25, vec3(0, 0, 0), qR, vPos
D3DXMatrixInverse matView, det, matRoll
'set new view matrix
g_D3DDevice.SetTransform D3DTS_VIEW, matView
End Sub
да и разве мой код не перемещает камеру в направлении взгляда ?
(принажатии UP)
что то я не пойму зачем перемещать камеру в направлени куда она смотрит
все равно нужно будет указывать ей куда смотреть
да и куда ты хочешь двигать объкты то?
Ваш пример работает, но например если угол поворота равен 90,180 и270 градусов, то изменяются координаты X и Z вместе, это не то что надо и Я раньше тоже написал примено такойже код после чего отказался от него, да и немного глючит t и t1,t2.
' Установка камеры
Sub CamSetUp()
Dim qR As D3DQUATERNION, det As Single
D3DXQuaternionRotationYawPitchRoll qR, vAng.y, vAng.x, vAng.Z
D3DXMatrixAffineTransformation matOrientation, 1!, vec3(0!, 0!, 0!), qR, vPos
D3DXMatrixInverse matView, det, matOrientation
g_D3DDevice.SetTransform D3DTS_VIEW, matView
End Sub
' Перемещение камеры
Sub MoveCamera(ByVal value As Single)
D3DXVec3Scale m_vVelocity, m_vVelocity, 0!
m_vVelocity.Z = m_vVelocity.Z + value
Dim vT As D3DVECTOR, vTemp As D3DVECTOR
D3DXVec3Add vT, m_vVelocity, vT
D3DXVec3TransformNormal vT, vT, matOrientation
D3DXVec3Add vPos, vPos, vT
End Sub
Прямо в том направлении куда она смотрит (камера или предмет), например камера в космосе, летишь так как направлены углы поворота камеры, изменил угол Х на +5 камера изменила направление полёта так как изменился этот угол.
Public Function Render()
Dim qR As D3DQUATERNION, det As Single
D3DXMatrixIdentity matMesh
D3DXQuaternionRotationYawPitchRoll qR, vAng.y, vAng.x, vAng.z
D3DXMatrixAffineTransformation matOrientation, 1!, vec3(0!, 0!, 0!), qR, vPos
D3DXMatrixMultiply matMesh, matMesh, matOrientation
g_D3DDevice.SetTransform D3DTS_WORLD, matMesh
Dim i As Long
For i = 0 To NumMaterials - 1
g_D3DDevice.SetMaterial Materials(i)
g_D3DDevice.SetTexture 0, Textures(i)
Mesh.DrawSubset i
Next
End Function
Sub MoveMesh(ByVal value As Single)
D3DXVec3Scale m_vVelocity, m_vVelocity, 0!
vVelocity.z = vVelocity.z - value
Dim vT As D3DVECTOR, vTemp As D3DVECTOR
D3DXVec3Add vT, vVelocity, vT
D3DXVec3TransformNormal vT, vT, matOrientation
D3DXVec3Add vPos, vPos, vT
End Sub
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4