pyflex에서는 Scene이라는 class를 통해 하고싶은 환경을 설정할 수 있다. 즉, 원하는 환경이 있다면 원하는 동작을 하는 scene을 만들어놓고 해당 scene을 pyflex에 setting 해주면 된다.
모든 scene들은 <scenes.h> 안에 있는 Scene class를 상위 class로 가지고, 자신의 header 파일에서 이 Scene class를 상속 받아 자신의 class를 선언한다.
새로운 Scene을 만드는 순서
- PyFleX/bindings/scenes 폴더 안에 새로운 scene 헤더 파일을 만든다.
- 이 헤더 파일 안에서, 새로운 scene이 Scene class를 public으로 상속받게 struct를 선언해준다.
- my_scene class의 구성 요소들을 작성해준다(선언문, Initialize 등등 필요에 맞게)
- PyFleX/bindings 폴더 안에 있는 <scenes.h> 헤더 파일을 들어가 밑으로 내려서, 만든 my_scene 헤더 파일을 #include 해준다.
- PyFleX/bindings 폴더 안에 있는 <pyflex.cpp> 파일 안의 pyflex_init() 함수 안에 사용할 scene class를 추가해준다.
// in <myscene.h>
class my_scene : public Scene
{
public:
my_scene(const char* name) : Scene(name) {}
void Initialize(py::array_t<float> scene_params, int thread_idx = 0)
{
// 원하는 환경이 되게 작성
}
// 필요한 함수가 있으면 작성
}
// in <scenes.h> 밑으로 내려서 다음 추가
#include "scenes/myscene.h"
// in <pyflex.cpp>의 pyflex_init() 함수에 다음 추가
g_scenes.push_back(new my_scene("my_scene"));
다음으로는 scene class에 대해서 설명.
기본적으로, 디테일은 PyFleX/bindings/scenes 폴더 안의 여러 scene example을 보면서 필요한 부분을 어떻게 만드는지, 어떤 변수들이 있는지 등등에 대한 감을 잡는 것이 중요하다.
새로운 scene을 만들 때, 동작을 위해서는 이 class에는 다음과 같은 것들이 필수로 들어가야한다.
- Scene을 상속 받은 자신 class 선언문
- 자신의 Initialize 함수
선언문은 보통 선언만 해주고 내용은 빈 중괄호( {} )로 해놓는 경우가 많다. 하지만 Initialize 함수는 중요한데, 결국 모든 scene의 목적은 해당 scene의 환경을 pyflex에 만들기 위해서이다. 그래서, Initialize 함수를 통해 원하는 환경을 만들어야 한다.
Initialize 함수는 인자로 scene_params을 받아 보통 다음의 동작들을 한다.
- CreateParticle*() 함수들을 이용하여 원하는 곳에 원하는 모양으로 particle들을 만듦
- 여러 환경 변수 값들 선언 (g_params 등등을 선언해주는데 이것들은 pyflex.cpp에 있다, 모든 param들은 기본값이 있기 때문에, 추가로 바꾸고 싶은 변수들만 Initialize 함수에서 원하는 값으로 바꾸어주면 된다)
Scene class의 함수를 보면 Update 등 Initialize 함수 말고도 다른 함수들이 많은데, 이것들은 필요할 때 class에 코드를 추가해주면 된다.
pyflex가 scene을 사용하는 법
- 이 scene은 pyflex.cpp 안의 pyflex_init()에 의해 사용할 class로 인식되고, 이 함수에서 push_back 되는 순서에 따라 index를 가진다.
- 이 index를 pyflex.cpp 안의 pyflex.set_scene()에 parameter로 넣어주어 해당 Init() 함수를 호출하고, Init() 함수 안에서 이 class의 Initialize() 함수를 호출하여 해당 scene을 실제로 setting한다.
- pyflex.init()으로 my_scene class 추가
- pyflex.set_scene() -> Init() -> my_scene.Initialize()
- pyflex 함수들은 python 실행 파일에서 호출할 수 있으므로, 실제로 사용자가 scene은 set하는 것은 다음과 같은 방식으로 호출하기만 하면 된다. (pyflex.init()이 선행되어야 한다)
pyflex.set_scene(9, scene_params, 0)
'연구 > PyFleX' 카테고리의 다른 글
softgym에 대하여 (0) | 2024.03.29 |
---|---|
PyFleX 실행 방법 정리 (0) | 2024.01.15 |
PyFleX 설치 & 실행 방법 (0) | 2024.01.15 |
PyFleX에 대하여 (0) | 2024.01.15 |