728x90
Camera.cpp , h
더보기
#include "Framework.h"
#include "Camera.h"
Camera::Camera()
{
D3DXMatrixIdentity(&matRotation);
D3DXMatrixIdentity(&matView);
Rotation();
Move();
}
Camera::~Camera()
{
}
void Camera::Position(float x, float y, float z)
{
Position(Vector3(x, y, z));
}
void Camera::Position(Vector3 & vec)
{
position = vec;
Move();
}
void Camera::Position(Vector3 * vec)
{
*vec = position;
}
void Camera::Rotation(float x, float y, float z)
{
Rotation(Vector3(x, y, z));
}
void Camera::Rotation(Vector3 & vec)
{
rotation = vec;
Rotation();
}
void Camera::Rotation(Vector3 * vec)
{
*vec = rotation;
}
void Camera::RotationDegree(float x, float y, float z)
{
RotationDegree(Vector3(x, y, z));
}
void Camera::RotationDegree(Vector3 & vec)
{
rotation = vec * 0.017453f;
Rotation(rotation);
}
void Camera::RotationDegree(Vector3 * vec)
{
*vec = rotation * 57.295791f;
}
void Camera::GetMatrix(Matrix * matrix)
{
memcpy(matrix, &matView, sizeof(Matrix));
}
void Camera::Rotation()
{
///Matrix X, Y, Z;
///D3DXMatrixRotationX(&matRotation, rotation.x);
///D3DXMatrixRotationY(&matRotation, rotation.y);
///D3DXMatrixRotationZ(&matRotation, rotation.z);
///matRotation = X * Y * Z;
D3DXMatrixRotationYawPitchRoll(&matRotation, rotation.y, rotation.x, rotation.z);
/*
D3DXVec3TransformCoord() // mul(vec4 , mat) 위치를 공간변환
D3DXVec3TransformNormal() //mul(vec3 , mat) 방향만 공간변환
*/
D3DXVec3TransformNormal(&forward, &Vector3(0, 0, 1), &matRotation);
D3DXVec3TransformNormal(&up, &Vector3(0, 1, 0), &matRotation);
D3DXVec3TransformNormal(&right, &Vector3(1, 0, 0), &matRotation);
}
//다른데서 다시 재정의
void Camera::Move()
{
View();
}
//카메라를 만들어주는곳
void Camera::View()
{
D3DXMatrixLookAtLH(&matView, &position, &(position + forward), &up);
}
#pragma once
class Camera
{
public:
Camera();
virtual ~Camera();
virtual void Update() = 0;
public:
void Position(float x, float y, float z);
void Position(Vector3& vec);
void Position(Vector3* vec);
void Rotation(float x, float y, float z);
void Rotation(Vector3& vec);
void Rotation(Vector3* vec);
void RotationDegree(float x, float y, float z);
void RotationDegree(Vector3& vec);
void RotationDegree(Vector3* vec);
void GetMatrix(Matrix* matrix);
Vector3 Forward() { return forward; }
Vector3 Up() { return up; }
Vector3 Right() { return right; }
protected:
virtual void Rotation();
virtual void Move();
protected:
void View();
private:
Vector3 position = Vector3(0, 0, 0);
Vector3 rotation = Vector3(0, 0, 0);
Vector3 forward = Vector3(0, 0, 1);
Vector3 right = Vector3(1, 0, 0);
Vector3 up = Vector3(0, 1, 0);
//회전용
Matrix matRotation;
Matrix matView;
};
Freedom.cpp , h
더보기
#include "Framework.h"
#include "Freedom.h"
Freedom::Freedom()
{
}
Freedom::~Freedom()
{
}
void Freedom::Update()
{
//오른쪽 마우스 눌렀을때 밑에 내용 실행
if (Mouse::Get()->Press(1) == false) return;
Vector3 f = Forward();
Vector3 r = Right();
Vector3 u = Up();
//Move
{
Vector3 P;
Position(&P);
//전방
if (Keyboard::Get()->Press('W'))
P = P + f * move * Time::Delta();
else if (Keyboard::Get()->Press('S'))
P = P - f * move * Time::Delta();
//좌우
if (Keyboard::Get()->Press('D'))
P = P + r * move * Time::Delta();
else if (Keyboard::Get()->Press('A'))
P = P - r * move * Time::Delta();
//상하
if (Keyboard::Get()->Press('E'))
P = P + u * move * Time::Delta();
else if (Keyboard::Get()->Press('Q'))
P = P - u * move * Time::Delta();
Position(P);
}
//Rotation
{
Vector3 R;
Rotation(&R);
//마우스 회전값
Vector3 val = Mouse::Get()->GetMoveValue();
R.x = R.x + val.y * rotation;
R.y = R.y + val.x * rotation;
R.z = 0.0f;
Rotation(R);
}
}
void Freedom::Speed(float move, float rotation)
{
this->move = move;
this->rotation = rotation;
}
#pragma once
class Freedom : public Camera
{
public:
Freedom();
~Freedom();
void Update() override;
void Speed(float move, float rotation = 2.0f);
private:
float move = 20.0f; //이동속도
float rotation = 0.01f; //회전속도
};
Context.cpp, h
더보기
#include "Framework.h"
#include "Context.h"
#include "Viewer/Viewport.h"
#include "Viewer/Perspective.h"
Context* Context::instance = NULL;
Context * Context::Get()
{
//assert(instance != NULL);
return instance;
}
void Context::Create()
{
assert(instance == NULL);
instance = new Context();
}
void Context::Delete()
{
SafeDelete(instance);
}
Context::Context()
{
D3DDesc desc = D3D::GetDesc();
perspective = new Perspective(desc.Width, desc.Height);
viewport = new Viewport(desc.Width, desc.Height);
camera = new Freedom();
//position = D3DXVECTOR3(0, 0, -10);
//D3DXVECTOR3 forward(0, 0, 1);
//D3DXVECTOR3 right(1, 0, 0);
//D3DXVECTOR3 up(0, 1, 0);
//D3DXMatrixLookAtLH(&view, &position, &(position + forward), &up);
}
Context::~Context()
{
SafeDelete(perspective);
SafeDelete(viewport);
}
void Context::ResizeScreen()
{
perspective->Set(D3D::Width(), D3D::Height());
viewport->Set(D3D::Width(), D3D::Height());
}
void Context::Update()
{
//ImGui::SliderFloat("EyeX", &position.x, 0, 128);
//ImGui::SliderFloat("EyeY", &position.y, -20, 20);
//ImGui::SliderFloat("EyeZ", &position.z, -128, 128);
//D3DXVECTOR3 forward(0, 0, 1);
//D3DXVECTOR3 right(1, 0, 0);
//D3DXVECTOR3 up(0, 1, 0);
//D3DXMatrixLookAtLH(&view, &position, &(position + forward), &up);
camera->Update();
}
void Context::Render()
{
viewport->RSSetViewport();
}
D3DXMATRIX Context::View()
{
Matrix view;
camera->GetMatrix(&view);
return view;
}
D3DXMATRIX Context::Projection()
{
D3DXMATRIX projection;
perspective->GetMatrix(&projection);
return projection;
}
#pragma once
class Context
{
public:
static Context* Get();
static void Create();
static void Delete();
private:
Context();
~Context();
public:
void ResizeScreen();
void Update();
void Render();
D3DXMATRIX View();
D3DXMATRIX Projection();
class Perspective* GetPerspective() { return perspective; }
class Viewport* GetViewport() { return viewport; }
class Camera* GetCamera() { return camera; }
private:
static Context* instance;
private:
class Perspective* perspective;
class Viewport* viewport;
Camera* camera;
};
실행
Framework 안에 있는 두개의 폴더 수정
Renders 폴더 안에는 출력 관련으로 Context 역할이 Viewer에 있는 카메라 관련이 출력 하게 만드는 클래스
Camera, Freedom을 작성한 폴더로 카메라 관련 클래스들이 정의된 곳
Camera : 모든 카메라들의 부모역할 함수만 정의되어 있고 관련 카메라 옵션들은 재정의
Freedom : 영어 뜻 대로 자유롭게 움직일수 있게 만든 카메라
'DirectX > DirectX 3D_(구)' 카테고리의 다른 글
09_Texture (0) | 2021.06.30 |
---|---|
08_Cube (0) | 2021.06.30 |
06_Grid (0) | 2021.06.30 |
05_Index (0) | 2021.06.30 |
04_World (0) | 2021.06.28 |