🕹️자체엔진/물리엔진 개발공부

[물리엔진공부] 물리엔진을 위한 간단한 렌더링엔진 만들었습니다.

Mawile 2022. 5. 28.
728x90

일단 이번에 물리시뮬 실습을 하는데,

저가 이전까지는 그냥 렌더링엔진 만들기귀찮아서, VPython으로 물리엔진공부했었는데,

이번에 아예 dx12기반으로 각잡고 만듦.

 

일단 이번에 만든 렌더링엔진의 주목적은, 물리엔진을 돌리는것과 간단하게 구현할수있어야하는것.

이기 때문에, 저는 진짜 엄청쉽게 만들수있도록 패턴을 설계함.

다음과같이 엄청간단히 위 게임을 만들수있었습니다.

 

/*
*
* < PhysicsIntializer.h >
* Github: https://github.com/orangelie
* // Copyright (C) 2022 by orangelie, Inc. All right reserved.
* // MIT License
*
*/





#include "SAMPLES/PhysicsEngine.h"

/*
* [ Object Type List ]
* 1. Box
* 2. Sphere
* 
* [ Color List ]
* 1. red
* 2. green
* 3. blue
* 4. cyan
* 5. magenta
* 6. yellow
* 7. white
* 8. black
* 
* [ Object Option List ]
* 1. SphereOpt
* 2. BoxOpt
* 
* how to generate an object?
* > std::unique_ptr<[ObjectType]> [Name] = nullptr;
* 
* how to create an sphere object option?
* > SphereOpt sphOpt(0.0f, 10.0f, 0.0f, 2.0f, 2.0f, 2.0f, "blue"); Sph1 = sphere(sphOpt);
* 
* 
*/

namespace orangelie {

	namespace PhysicsTool {

		class PhysicsIntializer : public PhysicsEngine {
		protected:
			virtual void startup() {
				SetCameraSpeed(10.0f);

				SphereOpt sphOpt(0.0f, 10.0f, 0.0f, 2.0f, 2.0f, 2.0f, "magenta");
				Sph1 = sphere(sphOpt);

				BoxOpt boxOpt(0.0f, 5.0f, 0.0f, 2.0f, 2.0f, 2.0f, "yellow");
				Box1 = box(boxOpt);
			}

			virtual void render(float dt) {
				static float t = 0.0f;
				t += dt;

				Sph1->SetPosition(t, 10.0f, 0.0f);
				Box1->SetPosition(t, 5.0f, 0.0f);
			}

		private:
			std::unique_ptr<Sphere> Sph1 = nullptr;
			std::unique_ptr<Box> Box1 = nullptr;

		};
	}
}

 

와우~~~

진짜 심플하게 잘만든것같음.

게임 실행시켜보면 이렇게나와요.

 

저기 위에있는 엄청 심플한 코드로, 짜잔~~~

이제 남은일은 충돌처리해주는것.

충돌처리도 물리엔진에서 구현해야할부분이지만,

AABB나 OBB를 하기전에 월드행렬을 일단 지역좌표로 바꿔야하는 작업이 필요함.

이작업은 엄청간단할듯.

 

그냥 뷰행렬의 역행렬이랑 월드행렬의 역행렬을 곱하면 지역좌표나올듯.

 

 

 

728x90

댓글