일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 유스케이스
- map design
- 유니티
- Race condition
- 메카님
- ret2libc
- Multiplay
- 게임 개발
- 언리얼엔진
- gravity direction
- MAC
- 언리얼 엔진
- Security
- Replication
- dirty cow
- Delegate
- gas
- Aegis
- stride
- gameplay ability system
- DSP
- CTF
- MLFQ
- animation
- photon fusion2
- 게임개발
- unity
- gameplay effect
- Unreal Engine
- ability task
- Today
- Total
Replicated
[ChronoSpace] ** Vector 내적을 이용한 중력 벡터 투영(Projection), 평면화(Flatten) ** 본문
[ChronoSpace] ** Vector 내적을 이용한 중력 벡터 투영(Projection), 평면화(Flatten) **
라구넹 2025. 2. 22. 04:17일단 왜 중력 벡터를 내적까지 써서 평면화 해야 하느냐?
https://lagooneng.tistory.com/353
[ChronoSpace] 밀리는 Character
Character Movement Component의 Gravity Scale을 이용하기 때문에, 각종 물체를 Character로 하기로 기획하며 정했다그런데 문제는, 이러면 Mesh의 Simulate Physics 기능을 이용할 수 없다Character Movement Component가 움
lagooneng.tistory.com
캐릭터 밀기를 구현했는데, 이대로면 중력이 바뀌면 제대로 안밀린다
정확히 말하면, 중력이 바뀜에 따라 Rotation도 같이 자동으로 바뀌는데, 정작 밀고자 하는 방향은 이전과 같으니
안밀린다
단순히 중력 반전만 있으면 그냥 ForwardDirection 구한 거 Z에 -1 곱해서 뒤집어 주면 된다
그런데 여기서 문제가 하나 더 있다면
https://lagooneng.tistory.com/358
[ChronoSpace] SetGravityDirection 동기화 문제 (Pitch 동기화) + 최적화
서버 말고는 GravityDirection이 동기화가 안되어 있었다CharacterMovementComponent는 위치나 가속도 등의 핵심 정보만 동기화한다고 함 방법1. 다시 캐릭터로 중력 세팅 책임 옮기기이건 그냥 코드가 마
lagooneng.tistory.com
중력 방향이 아예 제한 없이 바뀌도록 만들어놓은게 있다
즉, 캐릭터에 가해지는 중력이 어떤 방향이더라도 관계없이 캐릭터를 밀 수 있어야 한다
이를 위해서 내적이 필요하다
내적?
기본적으로 두 벡터가 얼마나 같은, 혹은 반대 방향인지 수치화한 건데,
이는 '투영'을 위해서도 쓰인다
이런 수식이 있을 때, a가 b의 정규화된 벡터 방향으로 투영했을 시의 벡터가 a|| 이다
그런데 이걸 a - a|| 하면 b에 수직인 성분으로 분해 가능하다
이런 식으로 생각하면 된다
간단한 벡터 계산이다
void UCSPushingCharacterComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (OwnerCharacter->GetCharacterMovement()->Velocity.IsNearlyZero())
{
return;
}
FVector GravityDir = OwnerCharacter->GetCharacterMovement()->GetGravityDirection().GetSafeNormal();
FVector ForwardDir = OwnerCharacter->GetActorForwardVector();
FVector FlattenedForward = ForwardDir - (ForwardDir | GravityDir) * GravityDir;
float Strength = 10000.0f;
FVector Power = FlattenedForward * Strength;
for (auto Char = CharsInPushing.CreateIterator(); Char; ++Char)
{
if (IsValid(Char.Value()))
{
Char.Value()->GetCharacterMovement()->AddImpulse(Power);
}
}
}
결과 코드는 이런 형태이다
캐릭터의 중력 방향과 캐릭터의 ForwardVector를 구하고,
그를 바탕으로 수직인 성분을 구해서 해당 방향으로 AddForce하면 해결된다
** 언리얼 C++에서 |가 내적 연산자이다
이 부분에서 내적 및 수직 성분을 구한다
이런 느낌으로 저 공을 굴려서 특정 위치까지 가져가야 하는 맵을 만들 것이다
'언리얼 엔진 > ChronoSpace' 카테고리의 다른 글
[ChronoSpace] Gravity Tower 맵 디자인 (0) | 2025.03.06 |
---|---|
[ChronoSpace] 대미지 장판 (0) | 2025.03.04 |
[ChronoSpace] Gravity 반전 스위치 (1) | 2025.02.22 |
[ChronoSpace] Switch (0) | 2025.02.20 |
[ChronoSpace] Interaction 구현 (0) | 2025.02.19 |