APlayerController::DeprojectScreenPostionToWorld
bool APlayerController::DeprojectScreenPositionToWorld(
float ScreenX,
float ScreenY,
FVector& WorldLocation,
FVector& WorldDirection
) const;
- 이 함수는 화면 좌표(Screen Space)를 월드 좌표(World Space)로 변환하는 작업을 한다. 이를 위해 카메라의 투영 행렬(Projection Matrix) 및 뷰 행렬(View Matrix)을 사용한다.
- 반환된 WorldLocation과 WorldDirection은 화면의 특정 픽셀 위치에서 카메라의 시야방향을 계산하는데 유용한다.
아래는 Character클래스에서 사격 Input을 받으면 Weapon클래스의 Fire 함수를 호출하게 되는데,
그 중에 플레이어가 사격했을 때 Bullet을 Spawn하는 과정을 코드로 구현하였다.

PlayerController->GetViewportSize(x, y);
현재 Viewport에서 가로(x)와 세로(y) 크기를 가져온다. 화면크기가 1920 x 1080 이라면 이 값을 그대로 가져오고 추후에 반을 나눠서 화면 중심의 좌표 값을 함수에 전달할 예정.
PlayerController->DeprojectScreenPositionToWorld(x / 2.0f, y / 2.0f, WorldCenter, WorldFront);
앞선 x와 y의 값을 반으로 나눠 화면 중심의 x, y좌표를 3D World 좌표와 방향으로 변환한다.
WorldCenter += WorldFront * 10000;
WorldCenter 기준으로 WorldFront 방향으로 100m 이동한 위치를 더해준다. 즉 화면 중앙에서 총알이 이동한 최종 위치가 될 것이다.
SpawnRotation = UKismetMathLibrary::FindLookAtRotation(SpawnLocation, WorldCenter);
초기 SpawnLocation은 MuzzleOffset의 위치 값이 들어가 있는데, 이 위치에서 총알이 100m이동한 위치를 바라본 회전 값을 SpawnRotation에 저장한다.
여기서 FindLookAtRotation 함수는 두 3D 벡터 간의 방향을 계산하여 회전 값을 반환한다.
GetWorld()->SpawnActor<ABullet>(Bullet, SpawnLocation, SpawnRotation, SpawnParams);
ABullet 클래스의 인스턴스를 월드에 스폰한다. 이로써 Bullet클래스는 Muzzle 위치에 화면 중앙에서 100m 이동한 위치를 바라보는 회전 값을 가지고 스폰된다.
- Bullet: 생성할 발사체의 클래스.
- SpawnLocation: 발사체가 생성될 위치.
- SpawnRotation: 발사체가 생성될 때의 회전값.
- SpawnParams: 스폰에 필요한 추가 설정(예: 소유자, 충돌 처리 등).
'내배캠 > TIL' 카테고리의 다른 글
24.12.10 (화) (1) | 2024.12.10 |
---|---|
24.12.09 (월) (0) | 2024.12.09 |
24.12.05 (목) (0) | 2024.12.05 |
24.12.04 (수) (0) | 2024.12.04 |
24.12.03 (화) (0) | 2024.12.03 |