PhysX/[Github] Jenga 분석
3. Physics 클래스 분석 - 2
헛둘이
2023. 2. 28. 12:11
turnBlock 함수
- 블록이 특정 위치에 맞춰져 있는지 확인
1. 가장 높이 있는 블록은 사용할 수 없는 블록으로 간주
2. 3번째로 높은 블록을 선택해서 전역 위치를 저장한다.
3. 그 전역 위치가 특정 위치에 맞춰져 있을 때 true를 반환한다.
// 블록을 회전시키기 위한 함수
bool Physics::turnBlock() // turn block to fit top layer
{
bool result;
// 가장 높이 있는 블록은 사용할 수 없는 블록으로 간주한다
vector<int> unusableBlocks = highestBlocks;
int lookUp = unusableBlocks[2]; //immer 90?zu dem wie muss
PxMat44 tempMat = blockArray[lookUp]->getGlobalPose();
// 3번째로 높은 블록을 선택해서 그 전역 위치를 저장한다
// 블록이 특정 위치에 맞춰져 있을 때 true를 반환한다.
if ((tempMat.column0.x >= 0.9f &&
tempMat.column1.y >= 0.9f &&
tempMat.column2.z >= 0.9f)&&
(tempMat.column0.x <= 1.1f &&
tempMat.column1.y <= 1.1f &&
tempMat.column2.z <= 1.1f))
result = true;
else
result = false;
return result;
}
- 이 함수는 후술할 moveBlock 함수에서 사용된다.
dropBlock 함수
- 현재 선택된 블록을 떨어뜨리고 해당 블록에 대해 물리 엔진 특성을 설정한다
1. 현재 선택된 블록을 물리 시뮬레이션에서 떨어뜨리기 위해 블록을 물리 시뮬레이션 월드에 추가
2. 블록의 선형 및 각속도를 0으로 설정해서 블록을 멈춘다.
3. 블록의 중력 비활성화 플래그를 false로 설정해서 중력을 다시 적용한다.
4. 그리고 현재 블록이 가장 높은 블록으로 설정되어 있다면 리턴
5. 아니면 가장 높은 블록 목록을 업데이트한다.
void Physics::dropBlock(const int *i)
{
if (currBlock < 0) return;
gScene->addActor(*blockArray[currBlock]);
blockArray[currBlock]->setLinearVelocity(PxVec3(0.0f, 0.0f, 0.0f));
blockArray[currBlock]->setAngularVelocity(PxVec3(0.0f, 0.0f, 0.0f));
blockArray[currBlock]->setActorFlag(PxActorFlag::eDISABLE_GRAVITY, false);
//stop here if re-pickup - not needed anymore??
if (highestBlocks[4]==currBlock)
return;
if (highestBlocks[3]==currBlock)
return;
adjustNumHighestBlocks();
highestBlocks.push_back(currBlock);
highestBlocks.erase(highestBlocks.begin());
currBlock = -1;
}
이외의 다른 함수들은 현재 상태에서는 내용 파악이 어렵기 때문에,
코드를 따라 치며 디테일한 부분까지 확인해서 기능적인 부분들을 모두 구현해 본 후에 이어서 작성할 예정.