개발/UE4
-
그래픽스에서 공부했던 지식을 사용해야 하는 순간이다. Transform Matrix의 연산에는 순서가 중요하다. Scale * Rotate * Translation의 순서를 지키지 않으면, 원점에서 이뤄지는게 아닌 다른 계에서의 움직임이 적용되기 때문이다. 여기서 Unreal은 한가지를 더 생각해줄 필요가 있다. 그건, 언리얼은 유독 독특한 좌표계를 가진다느 점인데, 이는 이전 게시글에서 어떤식으로 처리하는지 알 수 있다. (https://develop-4-art.tistory.com/85) 따라서, 작업 순서를 Mirrored 된 Bone의 정상화 -> Scaling -> Rotate -> Translation 과정을 거쳐야 맥스나 마야와 같은 타 모델링 소프트웨어에서의 결과물을 얻을 수 있다. ※ 기..
[UE4/Mesh/Bone] 뼈대 변환 순서그래픽스에서 공부했던 지식을 사용해야 하는 순간이다. Transform Matrix의 연산에는 순서가 중요하다. Scale * Rotate * Translation의 순서를 지키지 않으면, 원점에서 이뤄지는게 아닌 다른 계에서의 움직임이 적용되기 때문이다. 여기서 Unreal은 한가지를 더 생각해줄 필요가 있다. 그건, 언리얼은 유독 독특한 좌표계를 가진다느 점인데, 이는 이전 게시글에서 어떤식으로 처리하는지 알 수 있다. (https://develop-4-art.tistory.com/85) 따라서, 작업 순서를 Mirrored 된 Bone의 정상화 -> Scaling -> Rotate -> Translation 과정을 거쳐야 맥스나 마야와 같은 타 모델링 소프트웨어에서의 결과물을 얻을 수 있다. ※ 기..
2021.10.12 -
맥스와 언리얼 모두 왼손좌표계를 사용하지만, 언리얼의 Y축은 맥스와는 정반대를 가르킨다. 따라서, 애니메이터나 모델러가 작업한 결과물을 언리얼로 임포트하면 뼈대의 Scale 값이 뒤집히는 경우가 발생한다. (대표적으로 맥스에서 Mirror을 통해 생성한 본인 경우가 있다.) 이렇게 크기와 회전값이 뒤틀려 제대로 된 Bone Deformation을 할 수 없는 경우엔, 알아보기 힘든 매트릭스를 고쳐나가면 된다. 매트릭스 변환 방법과 순서는 아래 포스팅에서 확인할 수 있다. (https://develop-4-art.tistory.com/86)
[UE4/Mesh] 3DS Max와 언리얼의 좌표축 동기화맥스와 언리얼 모두 왼손좌표계를 사용하지만, 언리얼의 Y축은 맥스와는 정반대를 가르킨다. 따라서, 애니메이터나 모델러가 작업한 결과물을 언리얼로 임포트하면 뼈대의 Scale 값이 뒤집히는 경우가 발생한다. (대표적으로 맥스에서 Mirror을 통해 생성한 본인 경우가 있다.) 이렇게 크기와 회전값이 뒤틀려 제대로 된 Bone Deformation을 할 수 없는 경우엔, 알아보기 힘든 매트릭스를 고쳐나가면 된다. 매트릭스 변환 방법과 순서는 아래 포스팅에서 확인할 수 있다. (https://develop-4-art.tistory.com/86)
2021.10.12 -
언리얼 엔진 프로젝트의 심볼 용량이 꽉차거나, 지정되어 있지 않을 때 발생하는 오류다. 해결 방법은 비주얼 스튜디오를 통해 Symbol Path내 폴더를 비워주거나, Project\Binaries\Win64 (Default Symbol Path)를 비워준다.
[UE4/버그] 0xc00000ba / 멀티 플레이어 클라이언트 프로세스 실행언리얼 엔진 프로젝트의 심볼 용량이 꽉차거나, 지정되어 있지 않을 때 발생하는 오류다. 해결 방법은 비주얼 스튜디오를 통해 Symbol Path내 폴더를 비워주거나, Project\Binaries\Win64 (Default Symbol Path)를 비워준다.
2021.10.07 -
컴포넌트를 만들어 액터에 붙이는 시점은 아래 세 부분 정도로 나눠 볼 수 있다. 1. class construction 과정 2. blueprint construction 과정 3. beginplay 혹은 그 이후 과정 이때 대부분은 엔진 내 블루프린트 뷰에서 컴포넌트를 확인하기 위해 actor의 class construction 과정에서 'CreateDefaultSubobject' 함수를 통해 생성하고 초기화한다. 이런 경우, ActorConstruction (BeginPlay나 OnConstruction 이전)에서 Actor 내 Component를 등록하고 초기화한다. 하지만 ActorConstruction 이후 즉 BeginPlay나 OnConstruction에서 컴포넌트를 생성하는 경우 컴포넌트 ..
[UE4] 런타임 컴포넌트 생성컴포넌트를 만들어 액터에 붙이는 시점은 아래 세 부분 정도로 나눠 볼 수 있다. 1. class construction 과정 2. blueprint construction 과정 3. beginplay 혹은 그 이후 과정 이때 대부분은 엔진 내 블루프린트 뷰에서 컴포넌트를 확인하기 위해 actor의 class construction 과정에서 'CreateDefaultSubobject' 함수를 통해 생성하고 초기화한다. 이런 경우, ActorConstruction (BeginPlay나 OnConstruction 이전)에서 Actor 내 Component를 등록하고 초기화한다. 하지만 ActorConstruction 이후 즉 BeginPlay나 OnConstruction에서 컴포넌트를 생성하는 경우 컴포넌트 ..
2021.09.27 -
UE4는 액터를 스폰하는 방식이 두가지로 나뉜다. 첫 번째는 즉시 스폰 시키는 SpawnActor를 사용하는 방법 두 번째는 액터에 필요한 초기화를 선행한 후 BeginPlay로 넘길 수 있는 DeferredActorSpawn 함수를 사용하는 방법이 있다. 두 함수의 차이점은, SpawnActor를 수행하면 바로 Actor의 Construction과 PostActorConstruction이 수행되지만 DeferredActorSpawn을 사용하는 경우, 액터에 추가적으로 필요한 초기화 과정을 수행한 이후 'FinishSpawning'함수를 호출해 임의로 생성자 호출 순서를 조정할 수 있다. DeferredActorSpawn 내부를 보면 아래와 같이 생성자를 호출하고 있다. { FEditorScriptExe..
[UE4] DeferredActorSpawn 과 초기화UE4는 액터를 스폰하는 방식이 두가지로 나뉜다. 첫 번째는 즉시 스폰 시키는 SpawnActor를 사용하는 방법 두 번째는 액터에 필요한 초기화를 선행한 후 BeginPlay로 넘길 수 있는 DeferredActorSpawn 함수를 사용하는 방법이 있다. 두 함수의 차이점은, SpawnActor를 수행하면 바로 Actor의 Construction과 PostActorConstruction이 수행되지만 DeferredActorSpawn을 사용하는 경우, 액터에 추가적으로 필요한 초기화 과정을 수행한 이후 'FinishSpawning'함수를 호출해 임의로 생성자 호출 순서를 조정할 수 있다. DeferredActorSpawn 내부를 보면 아래와 같이 생성자를 호출하고 있다. { FEditorScriptExe..
2021.09.03 -
TMap은 Key/Value Pair로 이뤄져 있으며, GetHashType 함수를 통해 내부에 갖고 있는 Key 타입에 대한 리플렉션을 찾는다. 때문에,사용자가 임의로 만든 struct를 키 타입으로 명시하고 GetHashType을 override하지 않고 빌드를 수행하면, 컴파일 에러가 난다. 이럴 때 struct 안에 'friend uint32 GetTypeHash(const FMyClass& MyClass)' 를 선언하면 되는데, 여기서 주목해야 할 점은 'friend' 키워드를 사용했다는 점이다. 이 이유는 언리얼엔진은 리플렉션 계층을 따로 구현하고 있는데, 이 때문에 언리얼에서 명시하는 클래스는 모두 GetTypeHash를 갖고 있으며 이는 한정자에 상관없이 리플렉션 계층에서 접근할 수 있어야..
[UE4] TMap과 Structure (GetTypeHash)TMap은 Key/Value Pair로 이뤄져 있으며, GetHashType 함수를 통해 내부에 갖고 있는 Key 타입에 대한 리플렉션을 찾는다. 때문에,사용자가 임의로 만든 struct를 키 타입으로 명시하고 GetHashType을 override하지 않고 빌드를 수행하면, 컴파일 에러가 난다. 이럴 때 struct 안에 'friend uint32 GetTypeHash(const FMyClass& MyClass)' 를 선언하면 되는데, 여기서 주목해야 할 점은 'friend' 키워드를 사용했다는 점이다. 이 이유는 언리얼엔진은 리플렉션 계층을 따로 구현하고 있는데, 이 때문에 언리얼에서 명시하는 클래스는 모두 GetTypeHash를 갖고 있으며 이는 한정자에 상관없이 리플렉션 계층에서 접근할 수 있어야..
2021.08.26