GetRaycastDemo.h
더보기
#pragma once
#include "Systems/IExecute.h"
class GetRaycastDemo : public IExecute
{
public:
virtual void Initialize() override;
virtual void Ready() override {};
virtual void Destroy() override;
virtual void Update() override;
virtual void PreRender() override {};
virtual void Render() override;
virtual void PostRender() override {};
virtual void ResizeScreen() override {};
public:
void Pass(UINT mesh, UINT model, UINT anim);
private:
void Kachujin();
private:
Shader* shader;
class Terrain* terrain;
Shader* modelShader;
ModelAnimator* kachujin = NULL;
Vector3 prevPosition;
Vector3 movePosition;
bool isMove;
vector<MeshRender*> meshes;
vector<ModelRender*> models;
vector<ModelAnimator*> animators;
};
GetRaycastDemo.cpp
더보기
#include "stdafx.h"
#include "GetRaycastDemo.h"
#include "Environment/Terrain.h"
void GetRaycastDemo::Initialize()
{
Context::Get()->GetCamera()->RotationDegree(12, 0, 0);
Context::Get()->GetCamera()->Position(1, 11, -18);
((Freedom*)Context::Get()->GetCamera())->Speed(20);
shader = new Shader(L"19_Terrain.fx");
terrain = new Terrain(shader, L"Terrain/google1.png");
terrain->Pass(1);
modelShader = new Shader(L"55_Render.fx");
Kachujin();
}
void GetRaycastDemo::Destroy()
{
SafeDelete(shader);
SafeDelete(terrain);
SafeDelete(modelShader);
SafeDelete(kachujin);
}
void GetRaycastDemo::Update()
{
static float speed = 1.0f;
static float maxSpeed = 100.0f;
ImGui::SliderFloat("Speed", &speed, 0.0f, 100.0f);
Pass(0, 1, 2);
// 위치만 구해와서 출력
Vector3 position = terrain->GetRaycastPosition();
string str = "";
str += to_string(position.x) + ", ";
str += to_string(position.y) + ", ";
str += to_string(position.z) + ", ";
Gui::Get()->RenderText(Vector2(10, 60), Color(1, 0, 0, 1), str);
terrain->Update();
Transform* transform = kachujin->GetTransform(0);
if (Mouse::Get()->Down(1))
{
movePosition = position;
isMove = true;
}
else if (isMove == true)
{
transform->Position(&prevPosition);
Vector3 distance = movePosition - prevPosition;
if (fabsf(distance.z) <= 0.001f)
{
isMove = false;
kachujin->SetBlendAlpha(0, 0.0f);
prevPosition = Vector3(0.0f, 0.0f, 0.0f);
movePosition = Vector3(0.0f, 0.0f, 0.0f);
}
else
{
kachujin->SetBlendAlpha(0, maxSpeed / speed);
prevPosition += distance * speed * Time::Delta();
transform->Position(prevPosition);
}
}
kachujin->UpdateTransforms();
if(kachujin != NULL) kachujin->Update();
}
void GetRaycastDemo::Render()
{
terrain->Render();
if (kachujin != NULL) kachujin->Render();
}
void GetRaycastDemo::Kachujin()
{
kachujin = new ModelAnimator(modelShader);
kachujin->ReadMesh(L"Kachujin/Mesh");
kachujin->ReadMaterial(L"Kachujin/Mesh");
kachujin->ReadClip(L"Kachujin/Sword And Shield Idle");
kachujin->ReadClip(L"Kachujin/Sword And Shield Walk");
kachujin->ReadClip(L"Kachujin/Sword And Shield Run");
kachujin->ReadClip(L"Kachujin/Sword And Shield Slash");
kachujin->ReadClip(L"Kachujin/Salsa Dancing");
Transform* transform = NULL;
transform = kachujin->AddTransform();
transform->Position(0, 0, 0);
transform->Scale(0.02f, 0.02f, 0.02f);
kachujin->PlayBlendMode(0, 0, 1, 2);
kachujin->UpdateTransforms();
}
void GetRaycastDemo::Pass(UINT mesh, UINT model, UINT anim)
{
for (MeshRender* temp : meshes)
temp->Pass(mesh);
for (ModelRender* temp : models)
temp->Pass(model);
for (ModelAnimator* temp : animators)
temp->Pass(anim);
animators.push_back(kachujin);
}
결과
삼각형 이동
캐릭터 이동
'DirectX11 3D > 과제' 카테고리의 다른 글
| <DirectX11 3D 과제> 96 - Billboard(4개의 면 만들기) (0) | 2022.03.28 |
|---|---|
| <DirectX11 3D 과제> 42 - 모델 다운 받아 렌더링 해보기 (0) | 2022.02.15 |
| <DirectX11 3D 과제> 39 - Model(Bone + Mesh + Material) 탱크 움직이기 (0) | 2022.02.13 |
| <DirectX11 3D 과제> 39 - Model(Bone + Mesh + Material) 내용 정리 (0) | 2022.02.10 |
| <DirectX11 3D 과제> 39 - XML 파일 형식이란? (0) | 2022.02.10 |