보간이란 단어를 처음본게

컴퓨터 비전에서 리사이즈가 어떻게 동작하는지 공부하다가 알게되었다.

그러다가 언리얼에서도 동작 다루는데 보간한다고 들었는데

 

https://coding-hell.tistory.com/58

 

[UE4] FMath의 선형보간법 종류와 차이점

개요 게임 개발을 하다보면 자연스러운 동작을 구현하기 위해 선형보간법을 사용한다. 언리얼에서 자주 사용하는 선형보간법에는 크게 3가지가 있다. 1. FMath::Lerp https://docs.unrealengine.com/4.26/en-US/

coding-hell.tistory.com

 

 

지금 센서 데이터 받아오는건 좋은데 너무 끊기는걸 부드럽게 하고싶어서 gpt한테 물어봄

 

 

q : 언리얼엔진에서
1초 간격으로
100,50,3
100,10,2
100,30,1
이 값들이 순서대로 들어와서
액터의 회전값으로 사용했어
하지만 이벤트 틱은 매우 빠르게 반복되잔아?
이 값들이 1초마다 들어오다보니
액터 회전이 부드럽지 않고 딱딱끊겨있어
어떻게하면 회전 동작을 부드럽게 보간할수있을까

a : 언리얼 엔진에서 액터의 회전을 부드럽게 보간하기 위해 사용할 수 있는 방법 중 하나는 보간 기법을 적용하는 것입니다. 아래는 예시 코드로 보간을 구현하는 방법입니다:

1. 액터 클래스에 변수 추가:
   - FVector TargetRotation; // 목표 회전값
   - float InterpSpeed; // 보간 속도

2. 이벤트 틱 함수 내에서 보간 로직 추가:
   - FVector CurrentRotation = GetActorRotation().Euler(); // 현재 회전값
   - FVector NewRotation = FMath::VInterpTo(CurrentRotation, TargetRotation, DeltaTime, InterpSpeed); // 보간된 회전값 계산
   - SetActorRotation(FRotator(NewRotation.X, NewRotation.Y, NewRotation.Z)); // 액터에 회전값 적용

3. 1초마다 값 갱신:
   - 매 1초마다 TargetRotation 변수에 새로운 회전값을 설정합니다.

이렇게 구현하면 이벤트 틱이 매우 빠르게 반복되더라도 보간 기법을 사용하여 액터의 회전을 부드럽게 보간할 수 있습니다. 보간 속도(InterpSpeed)를 조정하여 원하는 부드러움 수준을 설정할 수도 있습니다.

 

 

 

q : C++코드 대신 블루프린트로 설정법 알려줘

a : 블루프린트에서 액터의 회전을 부드럽게 보간하기 위해서는 노드를 조합하여 구현할 수 있습니다.

1. 액터 블루프린트에서 변수 추가:
- TargetRotation: Rotator // 목표 회전값
- InterpSpeed: Float // 보간 속도

2. 블루프린트 그래프에서 보간 로직 추가:
- "GetActorRotation" 노드로 현재 회전값을 가져옵니다.
- "Break Rotator" 노드로 현재 회전값을 나눠서 X, Y, Z 각도 값을 추출합니다.
- "Make Rotator" 노드로 TargetRotation 변수 값을 Rotator 형태로 만듭니다.
- "Delta Seconds" 노드를 사용하여 Delta Time 값을 가져옵니다.
- "VInterp To" 노드로 현재 회전값과 목표 회전값을 보간하여 보간된 회전값을 계산합니다.
- "SetActorRotation" 노드로 액터에 보간된 회전값을 적용합니다.

3. 1초마다 값 갱신:
- "Set Timer by Event" 노드를 사용하여 1초마다 보간할 회전값을 설정하는 이벤트를 생성합니다.
- 이벤트에서 "Set Actor Rotation" 노드를 사용하여 TargetRotation 변수 값을 변경합니다.

이렇게 구현하면 블루프린트에서도 보간 기법을 사용하여 액터의 회전을 부드럽게 보간할 수 있습니다. 보간 속도(InterpSpeed)를 조정하여 원하는 부드러움 수준을 설정할 수도 있습니다.

 

 

얘 대답이 맞든 틀리든 대충 비슷하겐 할수잇을듯

 

 

 

위에서 틀린건 나는 벡터가 아니라 로테이터 쓰니

RInterpTo 쓰려고하는데

deltaTime이야 이벤트틱에서 나오는거 쓰면될거같고.

보간속도는 얼마나 하면될지 모르겟다.

 

 

 

 

아쉬운데로 질문

q : 언리얼엔진 RInterpTo에 대해서 자세히 설명해줘
여기서 interp speed는 몇으로 하는게 적당할까?

a : RInterpTo 함수에서 사용되는 보간 속도(Interp Speed)는 원하는 부드러움의 정도를 결정하는 매개변수입니다. 이 값은 프로젝트의 요구사항과 시각적인 효과에 따라 다를 수 있습니다.

적당한 보간 속도를 선택하는 것은 상황과 개발자의 취향에 따라 다를 수 있지만, 몇 가지 일반적인 가이드라인이 있습니다:

1. 느린 보간 속도: 저속으로 회전하는 액터나 오브젝트에 적합합니다. 예를 들어, 천천히 돌아가는 문이나 회전하는 플랫폼 등을 구현할 때 사용할 수 있습니다.

2. 중간 보간 속도: 대부분의 상황에서 적합한 기본값입니다. 일반적인 캐릭터의 회전이나 카메라 이동 등에 사용될 수 있습니다. 대부분의 경우, 5-10 정도의 값을 사용하는 것이 적당합니다.

3. 빠른 보간 속도: 빠른 이동이나 반응성이 필요한 상황에 적합합니다. 빠른 캐릭터의 회전이나 빠르게 이동하는 물체 등을 구현할 때 사용될 수 있습니다. 높은 값인 15 이상의 값을 사용할 수 있습니다.

위의 값은 일반적인 가이드일 뿐이며, 프로젝트의 필요에 따라 조정할 수 있습니다. 보간 속도를 조정하여 원하는 시각적인 효과를 얻을 수 있으며, 필요에 따라 여러 값을 실험해보면서 적절한 보간 속도를 찾을 수 있습니다.

 

 

 

 

 

RPYRotator 가 바뀌면 PrevRPYRotator에 저장하고 새값을 RPYRotator에 저장한 상태에서

RInterpTo를 했는데

여전히 동작이 어색하다.

 

생각해보니 Prev가 아니라 target에 RPYRotator를 설정하고

커런트를 액터 로테이션으로 쓰면되지 않나싶은데

 

 

 

 

 

Prev는 안하고 모델 액터 로테이터를 current로 설정하고,

보간속도를 30으로 주니 좀 나아지긴 했는데

여전히 아쉽다.

 

Prev가 필요없으니 브랜치 구문도 제거

아무래도 시리얼로 가져오는 속도는 느린데

리드라인 성공했을때만 보간 하도록 설정한게 문젠것같음.

 

 

 

 

리드라인 성공 실패 둘다 

회전자 보간값으로 액터 로테이션 설정했더니

리드라인 못한 상태에서 보간이 너무빨리이뤄져 

너무 툭툭끊기는 느낌으로 움직인다..

 

 

인터폴레이션 속도를 5정도로 지정할때

너무 빠르지도 느리지도 않게 적당한듯.

 

 

 

그래도 어제한것보단 좀 낫다.

 

 

 

 

+ Recent posts