• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

Direct3D11 공부 31일차(TerrainMove)

09 Jul 2021

Reading time ~1 minute

TerrainMove

이번에는 강좌가 아니고 그냥 해보고싶어서 해봤다.

전에 만들었던 Terrain에 좌표를 얻는과정까지 했다 그럼 여기에 오브젝트를 넣고 움직일 수 있을까??

MoveObject

우선 움직이는 오브젝트를 만드는데 전에 사용하던 Animation Model을 상속받아 만들었다.

#pragma once

class MoveObject : public ModelAnimator
{
public:
	MoveObject(Shader* shader, Terrain* terrain, float speed = 10);
	~MoveObject();

	void Update() override;

	void MoveToPose(UINT index);

	void SetSpeed(float speed) { this->speed = speed; }

	void SetMovePose(Vector3 movePose) { this->movePose = movePose; }

private:
	Vector3 movePose = Vector3(0,0,0);
	float speed;

	float accelate = 0;

	Terrain* terrain = NULL;
};
#include "stdafx.h"
#include "MoveObject.h"

MoveObject::MoveObject(Shader* shader, Terrain* terrain, float speed)
	: ModelAnimator(shader), terrain(terrain),speed(speed)
{

}

MoveObject::~MoveObject()
{
}

void MoveObject::Update()
{
	Super::Update();

	for (UINT i = 0; i < GetTransformCount(); i++)
	{
		MoveToPose(i);
	}
}

void MoveObject::MoveToPose(UINT index)
{
	Vector3 currentPose = GetTransform(index)->GetPosition();
	currentPose.y = terrain->GetHeight(currentPose);
	Vector3 dest = movePose - currentPose;
	D3DXVec3Normalize(&dest, &dest);

	GetTransform(index)->Position(currentPose + dest * speed * Time::Delta());

	if (Math::Distance(currentPose, movePose) < 0.1f)
	{
		PlayTweenMode(index, 0);
	}
	else
	{
		PlayTweenMode(index, 1);
	}

	string str = to_string(Math::Distance(currentPose, movePose));
	Gui::Get()->RenderText(Vector2(10, 75), Color(1, 0, 0, 1), str);

	UpdateTransforms();
}

진짜 별거 없다. 그냥 movePose로 계속해서 움직이게 만들었다.(회전은 좀 더 공부해야 할것 같다.)

그리고 이 전에 만들었던 Terrain에서 좌표를 구하는 함수들을 활용했다.

Math

그리고 현재 위치하고 목적지하고 거리 차이를 알고 그에 맞는 애니메이션을 구하기 위해 거리를 구할 수 있는 함수를 만들었다.

float Math::Distance(const D3DXVECTOR3& v1, const D3DXVECTOR3& v2)
{
	float sum = 0;
	
	sum += std::powf(v1.x - v2.x, 2);
	sum += std::powf(v1.y - v2.y, 2);
	sum += std::powf(v1.z - v2.z, 2);
	
	sum = sqrtf(sum);

	return abs(sum);
}

그리고 거리에 따라 애니메이션을 바꿔준다.(Blend써도 괜찮지만 이번엔 안썼다.)



DirectX Share Tweet +1