물리 연산
업데이트: 2023/01/26
물리 연산 설정 만들기
물리적 연산의 설정은 Editor에 의해 작성되어 .physics3.json 파일에 정리됩니다.
물리 연산의 설정에 관해서는 「물리 연산 설정 방법」을,
물리 연산의 설정 파일 출력에 관해서는 「임베디드용 데이터 내보내기」를 확인해 주십시오.
물리 연산용 클래스
물리 연산의 계산과 모델에 대한 적용은 CubismPhysics 클래스에 의해 실시합니다.
Native(C++)의 CubismPhysics::Create 함수, Web(TypeScript), Java의 CubismPhysics.create 함수에
.physics3.json 파일의 데이터를 전달하면 물리적 연산 설정이 반영된 CubismPhysics 클래스의 인스턴스가 생성됩니다.
// C++ csmString path = "example.physics3.json"; buffer = CreateBuffer(path.GetRawString(), &size); CubismPhysics* _physics = CubismPhysics::Create(buffer, size); DeleteBuffer(buffer, path.GetRawString());
// TypeScript let path: string = "example.physics3.json"; fetch(path).then( (response) => { return response.arrayBuffer(); } ).then( (arrayBuffer) => { let buffer: ArrayBuffer = arrayBuffer; let size: number = buffer.byteLength; _physics: CubismPhysics = CubismPhysics.create(buffer, size); deleteBuffer(buffer, path); } );
// Java String path = "example.physics3.json"; buffer = createBuffer(path); CubismPhysics physics = CubismPhysics.create(buffer);
이때 .physics3.json 파일에 기술된 Gravity와 Wind는
Native(C++)의 CubismPhysics::Options 구조체의 변수_options, Web(TypeScript), Java의 CubismPhysics.ts의 Option 클래스 변수_options로 덮어씁니다.
이 변수_options는 Native(C++)의 CubismPhysics::GetOptions 함수와 CubismPhysics::SetOptions 함수
Web(TypeScript), Java의 CubismPhysics.getOptions 함수와 CubismPhysics.setOptions 함수로 액세스할 수 있습니다.
// C++ /** * @brief 옵션 * * 물리 연산 옵션. */ struct Options { CubismVector2 Gravity; ///< 중력 방향 CubismVector2 Wind; ///< 바람의 방향 }; Options _options; ///< 옵션
// TypeScript /** * 물리 연산 옵션 */ export class Options { constructor() { this.gravity = new CubismVector2(0, 0); this.wind = new CubismVector2(0, 0); } gravity: CubismVector2; // 중력 방향 wind: CubismVector2; // 바람의 방향 } _options: Options; // 옵션
// Java /** * 물리 연산 옵션. */ public static class Options { public final CubismVector2 gravity; // 중력 방향 public final CubismVector2 wind; // 바람의 방향 public Options() { gravity = new CubismVector2(); wind = new CubismVector2(); } /** * 복사 생성자 */ public Options(Options options) { this.gravity = new CubismVector2(options.gravity); this.wind = new CubismVector2(options.wind); } } private Options options; // 옵션
변수 _options로 덮어 쓰는 Gravity와 Wind의 값은 다음 코드와 같습니다.
// C++ // set default options. _options.Gravity.Y = -1.0f; _options.Gravity.X = 0; _options.Wind.X = 0; _options.Wind.Y = 0;
// TypeScript // set default options this._options = new Options(); this._options.gravity.y = -1.0; this._options.gravity.x = 0; this._options.wind.x = 0; this._options.wind.y = 0;
// Java // set default options. options.gravity.x = 0.0f; options.gravity.y = -1.0f; options.wind.x = 0.0f; options.wind.y = 0.0f;
모델에 적용
물리 연산의 계산 결과를 모델의 파라미터에 적용하려면 Native(C++)의 CubismPhysics::Evaluate 함수, Web(TypeScript), Java의 CubismPhysics.evaluate 함수를 사용합니다.
이때 물리 연산의 계산도 동시에 이루어집니다.
// C++ // 물리 연산 설정 if (_physics ! = NULL) { _physics->Evaluate(_model, deltaTimeSeconds); }
// TypeScript // 물리 연산 설정 if(_physics ! = null) { _physics.evaluate(_model, deltaTimeSeconds); }
// Java // 물리 연산 설정 if (physics ! = null) { physics.evaluate(model, deltaTimeSeconds); }
파기
모델이 해제되는 시점에 CubismPhysics 클래스도 파기해야 합니다.
// C++ CubismPhysics::Delete(_physics);
// TypeScript CubismPhysics.delete(_physics);
Java의 경우는 가비지 콜렉션에 해방을 맡기고 있으므로 파기할 필요는 없습니다.