이전 글에서 

회전자 보간으로 모델 회전을 조금은 자연스럽게 만들었다.

 

하지만 아직 아쉬운건 

오프셋

 

 

관성계를 내 정면 방향을 보도록 하고

바닥에 딱 놓으면 160, 0, 0 정도가 나온다.

 

정면을 향하게 놓을땐 y가 0이 되도록 하고싶은데

 

 

 

 

오프셋 조정시켜보려다가

처음 키면 yaw 누적되기도하고 어떻게할까싶다가

그냥 포기하고 

다른 모델 가져와서 써봄

 

 

 

근데 다른거 가져와써보려고할때마다

fbx가 자꾸 분할되서 만드렁진다.

왜그런지 몰라서

https://www.youtube.com/watch?v=FsV3ZUxmWLo

 

 

위 영상보다가 안게

advanced에 combine mesh 옵션이 있었다.

이거하니 매시가 분할되지않고 만들어지긴 한데 텍스처는 어캐할까.

 

 

 

fbx 가져와도 스폰지밥이 하얗게 나온다.

 

 

 

내가 다운받은 모델에는 따로 페이스, 바디, 쇼츠 텍스쳐도 같이 있긴한데

 

 

 

 

이건 어케하지 못하고 패스

 

대신 mr krab의 경우 

 

택스처랑 엘리먼트랑 대충 맞춰서 비슷하게 만들었다.

아우 모델링 공부하긴해야되는데 귀찬아

 

 

spongibob 모델도 다른거 찾아서 가져오니 색상도 잘 받아와진다.

 

 

 

 

 

그 외 찾은 모델은 짐

 

 

 

 

블루투스 + 관성계 + 언리얼로

다양한 모델들을 게임에서 회전 제어 까지 대충은 하긴 했다.

 

오늘 보간 + 모델 활용까지하면서

1차적인 목표는 달성한듯 싶고

내일 영상으로 정리해야지.

 

 

 

 

 

보간이란 단어를 처음본게

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

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

 

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정도로 지정할때

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

 

 

 

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

 

 

 

 

 

 

putty에선 정상적으로 받지만

언리얼에선 시리얼 포트 읽기가 문제

readstring 대신 뭐가 있는지봄

 

 

 

 

 

일시 정지했다가 풀면

정상값이 여러개 들어와진다

 

그냥 쭉 진행하면 중간에 false가 자주 들어오고

아무래도 틱이 시리얼 포트로 전송속도보다 빠르게 반복되서라 생각든다.

리드스트링대신 리드라인 결과도 깨지는것 없어보인다.

 

 

 

그런데 리드 라인한 뒤에도 움직이니까 또 깨지기 시작한다.

 

 

 

 

 

자꾸 깨지는건 곤란한데

string들을 모두 붙여놓고

\n 스플릿 후 가장 마지막을 꺼내놓는게 나을까?

 

이번엔 스트링 append를 계속시켜줫는데

여전히 맨끝에 깨진 상태 값이 나온다.

 

 

 

 

putty에선 움직여도 정상적으로 나오는데

 

 

버퍼에서 가져오는걸 내가 잘못한거같은데

 

 

 

지금 내가 할수있는 좋은 방법이 생각 안나서

아두이노 마지막에 println대신 추가하도록변경

그냥 언리얼에선 string append 시킨 결과

대충 어디서 잘렸는지는 구분할수 있을듯.

뒤에서 두번째 /와 뒤에서 첫번째 / 사이에 있는 ypr을 사용하면 될듯하다.

 

append string 하는 함수 따로 만들고

길이가 30까지 되도록 자름

 

대충 맨 마지막에 있는 두 // 사이 값만 가져오면 되는데

파이썬으로하면 쉽게할걸 bp로 하려니 쉽진않다.

 

 

/가 적으면 2개 많으면 3개쯤 나올거같아보이는데

그냥 split 여러번해서 써야할듯. 싶었는데

 

그냥 굳이 마지막껄 할필요가 없고

어짜피 맨뒤에꺼 길이 30만큼 자른 상태라

앞에 있는 / 2개 사이있는거 써도 별차이가 없내?

 

따로 함수만들고

 

 

 

AppendYPR 뒤에 만든 함수 GetFirstYPR을 붙인결과 결과

 

값이 정상적으로 만들어졌다!

 

 

그러면 이값으로 이제 모델 로테이션 시켜주면 될듯하다.

YPRString을 RPY Rotator로 만들어 반환하는 함수

 

 

 

월드에는 내가 어제 만들어둔 큐브 블록 BP가 있는데

 

 

 

 

방금 작성한 함수로 얻은 로테이터를 액터 로테이션으로 설정

 

 

촬영하려고하는데

내 놋북에서 다른걸 누르면 느려진다.

설정하는법 다시 찾아서 적어둠

 

에디터 설정에서 다음 항목 체크 해재

Use less cpu when in background

검색안되면 use less cpu만해도 나온다.

 

언리얼 게임 실행 중 다른 작업시 느려지는 상황 푸는 법

 

 

 

 

 

 

 

오늘 너무 개으름 피우다가 이제야 해결했다.

보조베터리 전원으로 우노 BT MPU6050 동작시킨 결과

 

단순 read string으로 잘리는걸 해결할수 없어서 / 스플릿 해서 만든건 엉망같긴한데 어쩌갯나

 

값이 느리게 보내지다보니 동작이 부드럽지않고 탁탁 바뀌니 좀 아쉽긴하다.

이게 인터폴레이션 관련된거 같은데

내일 찾아봐서 고쳐야지

 

 

 

 

+ Recent posts