Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- computer graphics
- 오블완
- OpenGL
- Image denoising
- 티스토리챌린지
- 포인터
- Focal loss
- Action Recognition
- CNN
- posec3d
- Deep Learning
- Vision Transformer
- DDPM
- depthwise convolution
- C++
- deformable covolution
- 모수 추정 방법
- Swin Transformer
- convolution
- Diffusion
- mobilenet
- 딥러닝
- Unreal Engine
- 최대 가능도 추정
- 최대 사후 확률
- covolution
Archives
- Today
- Total
심드렁하게 저장
전차 자동 조준 기능 구현 본문
1. 개요
전차 콘텐츠 구현 중 자동 조준 기능을 구현해야 했다. 이 포스팅에서는 Unreal Engine 5에서 구현한 AK2_AutoTurret 클래스에 대해 이 클래스는 AWheeledVehiclePawn 타입의 전차를 목표로 추적하는 자동 터렛을 다룬다. 이 코드는 KismetMathLibrary와 UGameplayStatics 등의 유틸리티를 사용하여 복잡한 연산을 처리하도록 하였다.
주요 기능은 다음과 같다.
- 화면 좌표로 전차의 위치 값을 변환
- 터렛의 회전 조정
- 특정 상황에서 NULL 검사 및 로그 출력
2. 클래스 구현 세부 사항
2.1 헤더
#include "K2_AutoTurret.h"
#include "WheeledVehiclePawn.h"
#include "Kismet/KismetMathLibrary.h"
#include "Kismet/GameplayStatics.h"
- WheeledVehiclePawn: 전차의 기본 클래스 (Chaos Vehicle 시스템을 적용)
- KismetMathLibrary: 다양한 수학 관련 유틸리티 함수가 포함된 라이브러리
- UGameplayStatics: 게임 플레이와 관련된 유틸리티 기능을 제공
2.2 주요 함수
FVector2D AK2_AutoTurret::CalcScreenPos(APlayerController* PlayerController, AWheeledVehiclePawn* EnemyTank)
{
USkeletalMeshComponent* TankMesh = EnemyTank->GetMesh();
FVector TankMeshLocation = TankMesh->GetComponentLocation();
FVector2D ScreenPos;
UGameplayStatics::ProjectWorldToScreen(PlayerController, TankMeshLocation, ScreenPos, false);
return ScreenPos;
}
- 적 전차의 세계 좌표를 화면 좌표로 변환하여 반환
- UGameplayStatics::ProjectWorldToScreen()을 사용하여 3D 세계 좌표를 2D 화면 좌표로 변환
- Tank Mesh의 3D World Location을 2D Position으로 Projection
FVector2D AK2_AutoTurret::TurretTracking(AWheeledVehiclePawn* PlayerTank, AWheeledVehiclePawn* EnemyTank)
{
if (!PlayerTank || !EnemyTank)
{
UE_LOG(LogTemp, Warning, TEXT("전차 NULL"));
return FVector2D::ZeroVector; // 기본 반환값
}
USkeletalMeshComponent* K2Mesh = PlayerTank->GetMesh();
USkeletalMeshComponent* EnemyMesh = EnemyTank->GetMesh();
if (!EnemyMesh)
{
UE_LOG(LogTemp, Warning, TEXT("EnemyTank mesh NULL"));
return FVector2D::ZeroVector; // 기본 반환값
}
FVector OwnerLocation = K2Mesh->GetComponentLocation();
FVector TankMeshLocation = EnemyMesh->GetComponentLocation();
FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(OwnerLocation, TankMeshLocation);
FRotator OwnerRotation = K2Mesh->GetComponentRotation();
FRotator DeltaRotation = UKismetMathLibrary::NormalizedDeltaRotator(OwnerRotation, LookAtRotation);
return FVector2D(DeltaRotation.Pitch, DeltaRotation.Yaw);
}
- OwnerLocation: 플레이어 전차의 현재 위치를 나타내는 벡터
- TankMeshLocation: 적 전차의 현재 위치를 나타내는 벡터
- FindLookAtRotation() 함수는 전차의 현재 위치를 나타내는 벡터 에서 적 전차의 현재 위치를 나타내는 벡터로 향하는 벡터 기준으로 하는 회전각을 계산
- 이 회전각은 전차가 적 전차를 바라보기 위해 필요한 회전 방향
- OwnerRotation: 플레이어 전차의 회전각
- NormalizedDeltaRotator() 함수는 두 회전 각도 사이의 차이 계산하고 정규화하여 반환
- 최종적으로 터렛이 목표를 조준하기 위해 회전해야 할 각도의 Pitch와 Yaw 성분을 2D 벡터로 반환
3. 예시 화면

포신의 위치를 업데이트하는 방안을 구상해야 할 것 같다.