171 lines
4.3 KiB
C++
171 lines
4.3 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
|
// Filename: cameraclass.cpp
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
#include "cameraclass.h"
|
|
|
|
CameraClass::CameraClass()
|
|
{
|
|
m_positionX = 0.0f;
|
|
m_positionY = 0.0f;
|
|
m_positionZ = 0.0f;
|
|
|
|
m_rotationX = 0.0f;
|
|
m_rotationY = 0.0f;
|
|
m_rotationZ = 0.0f;
|
|
}
|
|
|
|
|
|
CameraClass::CameraClass(const CameraClass& other)
|
|
{
|
|
}
|
|
|
|
|
|
CameraClass::~CameraClass()
|
|
{
|
|
}
|
|
|
|
void CameraClass::SetPosition(float x, float y, float z)
|
|
{
|
|
m_positionX = x;
|
|
m_positionY = y;
|
|
m_positionZ = z;
|
|
return;
|
|
}
|
|
|
|
|
|
void CameraClass::SetRotation(float x, float y, float z)
|
|
{
|
|
m_rotationX = x;
|
|
m_rotationY = y;
|
|
m_rotationZ = z;
|
|
return;
|
|
}
|
|
|
|
XMFLOAT3 CameraClass::GetPosition()
|
|
{
|
|
return XMFLOAT3(m_positionX, m_positionY, m_positionZ);
|
|
}
|
|
|
|
|
|
XMFLOAT3 CameraClass::GetRotation()
|
|
{
|
|
return XMFLOAT3(m_rotationX, m_rotationY, m_rotationZ);
|
|
}
|
|
|
|
void CameraClass::Render()
|
|
{
|
|
XMFLOAT3 up, position, lookAt;
|
|
XMVECTOR upVector, positionVector, lookAtVector;
|
|
float yaw, pitch, roll;
|
|
XMMATRIX rotationMatrix;
|
|
|
|
|
|
// Setup the vector that points upwards.
|
|
up.x = 0.0f;
|
|
up.y = 1.0f;
|
|
up.z = 0.0f;
|
|
|
|
// Load it into a XMVECTOR structure.
|
|
upVector = XMLoadFloat3(&up);
|
|
|
|
// Setup the position of the camera in the world.
|
|
position.x = m_positionX;
|
|
position.y = m_positionY;
|
|
position.z = m_positionZ;
|
|
|
|
// Load it into a XMVECTOR structure.
|
|
positionVector = XMLoadFloat3(&position);
|
|
|
|
// Setup where the camera is looking by default.
|
|
lookAt.x = 0.0f;
|
|
lookAt.y = 0.0f;
|
|
lookAt.z = 1.0f;
|
|
|
|
// Load it into a XMVECTOR structure.
|
|
lookAtVector = XMLoadFloat3(&lookAt);
|
|
|
|
// Set the yaw (Y axis), pitch (X axis), and roll (Z axis) rotations in radians.
|
|
pitch = m_rotationX * 0.0174532925f;
|
|
yaw = m_rotationY * 0.0174532925f;
|
|
roll = m_rotationZ * 0.0174532925f;
|
|
|
|
// Create the rotation matrix from the yaw, pitch, and roll values.
|
|
rotationMatrix = XMMatrixRotationRollPitchYaw(pitch, yaw, roll);
|
|
|
|
// Transform the lookAt and up vector by the rotation matrix so the view is correctly rotated at the origin.
|
|
lookAtVector = XMVector3TransformCoord(lookAtVector, rotationMatrix);
|
|
upVector = XMVector3TransformCoord(upVector, rotationMatrix);
|
|
|
|
// Translate the rotated camera position to the location of the viewer.
|
|
lookAtVector = XMVectorAdd(positionVector, lookAtVector);
|
|
|
|
// Finally create the view matrix from the three updated vectors.
|
|
m_viewMatrix = XMMatrixLookAtLH(positionVector, lookAtVector, upVector);
|
|
|
|
return;
|
|
}
|
|
|
|
XMMATRIX CameraClass::GetViewMatrix(XMMATRIX& viewMatrix)
|
|
{
|
|
viewMatrix = m_viewMatrix;
|
|
return viewMatrix;
|
|
}
|
|
|
|
void CameraClass::RenderReflection(float height)
|
|
{
|
|
XMFLOAT3 up, position, lookAt;
|
|
XMVECTOR upVector, positionVector, lookAtVector;
|
|
float yaw, pitch, roll;
|
|
XMMATRIX rotationMatrix;
|
|
|
|
|
|
// Setup the vector that points upwards.
|
|
up.x = 0.0f;
|
|
up.y = 1.0f;
|
|
up.z = 0.0f;
|
|
|
|
// Load it into a XMVECTOR structure.
|
|
upVector = XMLoadFloat3(&up);
|
|
|
|
// Setup the position of the camera in the world.
|
|
position.x = m_positionX;
|
|
position.y = -m_positionY + (height * 2.0f);
|
|
position.z = m_positionZ;
|
|
|
|
// Load it into a XMVECTOR structure.
|
|
positionVector = XMLoadFloat3(&position);
|
|
|
|
// Setup where the camera is looking by default.
|
|
lookAt.x = 0.0f;
|
|
lookAt.y = 0.0f;
|
|
lookAt.z = 1.0f;
|
|
|
|
// Load it into a XMVECTOR structure.
|
|
lookAtVector = XMLoadFloat3(&lookAt);
|
|
|
|
// Set the yaw (Y axis), pitch (X axis), and roll (Z axis) rotations in radians.
|
|
pitch = (-1.0f * m_rotationX) * 0.0174532925f; // Invert for reflection
|
|
yaw = m_rotationY * 0.0174532925f;
|
|
roll = m_rotationZ * 0.0174532925f;
|
|
|
|
// Create the rotation matrix from the yaw, pitch, and roll values.
|
|
rotationMatrix = XMMatrixRotationRollPitchYaw(pitch, yaw, roll);
|
|
|
|
// Transform the lookAt and up vector by the rotation matrix so the view is correctly rotated at the origin.
|
|
lookAtVector = XMVector3TransformCoord(lookAtVector, rotationMatrix);
|
|
upVector = XMVector3TransformCoord(upVector, rotationMatrix);
|
|
|
|
// Translate the rotated camera position to the location of the viewer.
|
|
lookAtVector = XMVectorAdd(positionVector, lookAtVector);
|
|
|
|
// Finally create the view matrix from the three updated vectors.
|
|
m_reflectionViewMatrix = XMMatrixLookAtLH(positionVector, lookAtVector, upVector);
|
|
|
|
return;
|
|
}
|
|
|
|
void CameraClass::GetReflectionViewMatrix(XMMATRIX& reflectionViewMatrix)
|
|
{
|
|
reflectionViewMatrix = m_reflectionViewMatrix;
|
|
return;
|
|
} |