본문 바로가기

DirectX11 3D/과제

<DirectX11 3D 과제 > 68 - Unprojection을 이용한 이동

 

 

 

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);
}

 

 

 

 

 

 

 

결과


삼각형 이동

 

 

 

캐릭터 이동