상세 컨텐츠

본문 제목

pond 프로젝트 07

Unreal Engine 4/Project

by hwano 2015. 4. 6. 18:06

본문

 

 

Learning Navigation Meshes and Behavior Tree 강좌

 

 

블로그에서 behavior tree 입문용 강좌로 추천해서 보고 있음.

강좌를 따라하다가 get random point in radius노드에서 또 막힌다.

원래 input되는 location값 주위에 radius를 그려서 그 범위내의 random값을 출력해야

하는거 같은데 그냥 0,0,0 값이 나온다.

구글에 찾아보니 나같은 사람이 또 있는거 같은데 이건 그냥 버그인가?

https://answers.unrealengine.com/questions/61135/get-random-point-in-radius.html

 

하다보니 내가 NavMeshBoundsVolume을 아직 안만들었었다.

이걸 만들어야 작동이 되는거였다.

get random point in radius는 카테고리상 navigation에 있는데 navMesh와 엮여서

돌아가는 거다. 이제 잘 작동함.

 

강좌를 다 살펴보니 아주 기초적인 BT 작업프로세스를 알게 되었음.

 

 

 

Unreal Engine 4 AI Behavior Tree & NavMesh 강좌

 

 

유투브에서 가장 BT에 대해 설명이 잘되어있는 강좌다. 이것도 한번 살펴보자.

내용중 miscellaneous에 있던 enumeration은 blueprints쪽으로 옮겨갔다.

enumeration은 enum, c++에서의 열거형 데이터이다.

enum 아이스크림{ 딸기, 초코, 바닐라 } 

요런식으로 내가 원하는 특정한 값을 갖는 변수를 만들 수 있다.

 

내용이 너무 길어서 따라가다가 흐름을 놓쳤다...  흠

따라하다보니 event recieve condition 노드였나가 decorator에 있어야 하는데

이번에 버젼업 되면서 사라졌다고 한다. 다른 기능으로 바뀌는 도중 같은데

설명이 없어서 튜토대로 진행이 안된다.  버젼이 바뀌면 바뀌는게 한둘이 아니다

버젼 업데이트 표시가 뜰때마다 업데이트 해왔었는데 신중히 해야할거 같다.

 

 

강좌가 별다른 설명없이 주욱 노드들을 만드는 과정을 보여주는데 찾아보니

강좌 제작자가 예제파일을 올려놓았다. 그것도 버젼별로 올려놨네. 

event recieve condition은 없어졌는데 그래도 잘 작동한다.

그냥 이걸 보고 파악하는게 더 나을듯 하다.

 

BT구조도 강좌와 많이 다르다.  더 간략화 시킨전지 버젼이 달라져서 그런건지는 모르겠다.

 

 

 

 

 

제작 시작

 

 

내용을 파악하기에 특히 detect enemy노드 같은 경우는 봐도 무슨 역할을 하는지 파악이안되는 노드들이

많아서 힘들다.  이제 내 프로젝트를 제작하면서 필요한 부분들을 찾아볼 수 있을 만큼의 강좌들은

구한거 같다. 제작하면서 필요한 부분들을 찾아서 적용하면 될거 같다. 

물고기 애니메이션들 부터 제작해보자.

 

 

 

 

Masked

 

 

재질의 개념이 초반이라 많이 했갈린다. 주로 처음에 신경써야 할게

Blend Mode + Shding Model 이다.

아무래도 계산을 최적화 하기위해 쓰지 않는 기능들은 애초에 제외시키는 방법을 쓰는거 같다.

예를 들어 마야의 mia_material이라고 하면 내가 원하는 기능들을 그냥 바로 바로 적용하면된다.

만약 cutout opacity를 사용한다면 노드를 연결하면 될테고 사용하지 않더라도 그 수치는 default1로

살아 있게 된다.

하지만 UE4에서는 cutout opacity에 해당하는 opacity mask가 있는 매터리얼과 없는 매터리얼로 나뉜다.

즉 안쓸때는 아예 계산과정에서 들어내버리기 위해 사용자가 필요할때만 고르도록 해놓은거 같다.

 

내 경우 물고기 오브젝트같은 경우에는 지느러미쪽이 자연스럽게 사라지도록 cutout opacity가

지느러미 끝쪽에 적용되어있다. alpha채널을 사용한다는 건데 쉐이딩은 SSS느낌을 내고 싶다.

그렇다면

 

Blend Mode  +  Shading Model에서

좌측에서는 alpha가 가능한 masked를 고르고

우측에서는 subsurface 를 골라 조합을 하는 개념이다.

 

...............................................................................................

 

하다보니 큰 문제가 있는게 masked라는 모드는 일정 threshould값을 기준으로

on off로 짤라버린다. 그라데이션이 안된다. 그래서 알파값 그라데이션을 적용하려면

Shading Model을 translucent로 해야하는거 같다. 

 

translucent의 opacity에는 그라데이션이 적용이 된다. 근데 translucent라는게 막상 적용해보면

뒤에 있는게 앞에서 보이고 비져블이 꼬이고 난리가 난다. 예제에서도 base color값을 단색으로 적용한

예제들만 있는데 텍스쳐를 적용하면 엉망으로 보인다. 아직 이게 3D상에서 정상적으로

작동하지 않는거 같다.

몸 뒤쪽에 있는 눈깔과 지느러미가 비쳐보인다. 겁나 무섭다..

 

그럼 알파값 그라데이션을 적용하려면 어떻게 해야하나..

 

 

 

 

재질 제작

 

 

알파문제는 어떻게 되겠지.. 란 생각으로 우선 진행중이다.

contentsExamples란 예제에서 skin rendering 레벨의 피부 재질을 참고 하여 작성중이다.

재질을 작성하다보면 normal 두개를 합쳐야 하는 경우가 생기는데 그냥 add로 합쳐도 상관없다고한다.

언리얼 엔진 내부적으로 .normalize를 한번 돌려준다고 함.

 

만약 경우에 따라 맵이 뭉개진다는 느낌이 들면 blendAngleCorrectedNormals 라는 메터리얼

함수를 사용에 보라고 한다( 언리얼 카페에서 읽은 글 )

 

 

//// 언리얼 카페 돌아다니다가 읽은거 2

노말맵이 노말라이즈 되기때문에 그냥 곱하기 2한다고 해도 노말이 강해지지 않는다.

이럴때는 블루 값을 반으로 낮춰주면 효과가 있다고 한다.

찾아보면 강하기를 조절하는 옵션이나 함수가 있을것도 같지만 어쨌든..

 

 

 

리깅 메쉬 오브젝트 분리

 

 

그냥 한 오브젝트로 만들어서 지느러미 끝쪽에만 투명을 주려고 했는데 그냥 오브젝트를

두 메쉬로 나누어보자. 몸통과 눈알만 따로 지느러미 따로 이런식으로..

마야상에서 오브젝트를 둘로 나눠서 다른재질을 주고 fbx로 저장한다음 ue4에서 부를 때

임포트 옵션에서 texture오 material을 다 끄고 임포트 하자. 그러면 재질을 적용할 수 있는

element가 2개가 지정되어 들어온다. 이 element를 좀 더 추가하거나 변경하고 싶으면

어떻게 해야하는지 모르겠다... 

 

지금으로선 그냥 마야에서 다시 설정하고

ue4에서 지우고 다시 처음부터 임포트 하는 수밖에는 없을듯..

 

 

 

Skeletal Mesh Animation

 

 

애니메이션 프로세스를 조금만 확인하고 진행하자. 마야에서 키 애니메이션을 어떻게

UE4로 옮겨오는지.

http://cafe.naver.com/unrealenginekr/735

에 있는 블루프린트 3인칭 게임 제작 강좌를 보고 있다.

 

FBX파일을 불러오는데

1. 메쉬와 bone들이 모두 들어있는 FBX파일 하나와.

2. 같은 하이라키 구조의 bone들로 애니메이션이 되어있는 각 동작별로 FBX파일들

이렇게 구성되었다.

애니메이션만 들어 있는 파일은 메쉬가 없다.

마야에서는 애니메이션 클립으로 불러오는데 UE4에서는 모두 FBX만 사용한다.

 

1. 번 과정에서 skeleton 어셋이 하나 만들어지는데 2번 과정에서 임포트할때 그 skeleton을 지정해

주므로서 임포트하며 바로 애니메이션 공유가 가능해 진다.

 

이런 과정을 통해서 애니메이션이 공유된다는 것만 확인하고 물고기를 마저 제작하자.

진도가 안나간다. 진도부터 빼자.

 

리깅 중인에 예제를 찾아보니 캐릭터에서 bone 하이어라키에서 원하는 부분

일부분만 레그돌 시뮬레이션이 가능하다고 한다. 얼굴옆에 달린 수염은 가능하면 그냥

시뮬레이션으로 대체해야겠다.

 

 

 

 

 

몸통 애니메이션

 

 

몸통 애니메이션 리깅을 하려는데 sin곡선을 이용해서 세팅해놓으면 편하다.

 

저번주에 세팅은 해봤는데 오늘 출근하면서 생각해보니 이걸 애니메이션 클립화 시켜서

블랜드하는 방법이 맞을까? 총을 든 적군 캐릭터를 간단하게 구현해놓을걸 보면

정찰, 발견, 추적, 슈팅으로 상태설정을 나눠 놓는다. 그리고 BT로 각 상태가

되면 걷거나 뛰거나 총을 쏘는 애니메이션으로 대체되는 방식이다.

 

하지만 물고기는 sin곡선 방식의 유선형 몸 움직임이 계속 되어야하는데 그런식으로 나눠서

블랜드해도 잘 연결이 될까? 아님 게임엔진상에서 머리 방향과 속도에 따라 뒤쪽 몸통 조인트들은

procedure로 움직이도록 해야할까?

 

어차피 걷고 뛰고 회피하는 복잡한 액션도 잘 블렌드되니까 상관이 없을까? 아님 예를들어

각 파티클들로 물고기 객체들의 위치와 velocity들을 애니메이션 시키고 나머지 몸통

리깅은 엔진상에서 해결하는게 좋을까?..

 

http://ocean-rift.com/?p=170

이 참고 페이지를 보면 procedure방식의 애니메이션으로 처리한게 있다.

 

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

실제 연못의 비단잉어 움직임을 봐도 생각보다 그렇게 움직이 크지 않다.

 

어찌보면 테스트로 애니메이션을 잡았던 anim_Idle처럼 계속 같은 속도의 sin곡선으로

움직이고 있는 물고기들이 여러마리가 동시에 있으면 뭔가 되게 이질적이지 않을까///

 

 

 

 

 

 

Procedural 애니메이션?

 

 

http://cafe.naver.com/unrealenginekr/735

에 있는 블루프린트 3인칭 게임 제작 강좌를 초반만 보고 안봤는데 precedural한 애니메이션을

어떤식으로 진행할수 있을지에 대한 내용도 있나 싶어 조금더 보고 있다.

내용을 조금더 살펴보니 7번 blend space에 대한 내용이 있다.

페르소나(UE4의 애니메이션 시스템)은 blend space라는 이름으로 각각의 클립을 블렌드 시킬 수 있다.

근데 내가 생각했던것과 달리 대기 - 걷는다 - 뛴다는 세가지의 액션이 그냥 뚝뚝 끊어지는게 아니고

0부터 속도를 천천히 올리면 점점더 빨리 뛰는것으로 전부 부드럽게 블랜딩이 된다.

 

거기에 blend space 1D 2D에 대한 개념도 있는데 1D는 속도의 변화값에 따라 바뀌는 거라면

2D는 거기에 방향도 적용 시킬수 있다..    음  뭐 이정도면 굳이 procedural방식의 애니메이션을 할 필요가

없을거 같다.( 근데 이게 원리가 뭐지 각 클립마다 시간 싸이클이 같지 않을텐데 신기하네.. )

 

 

 

 

 

 

애니메이션 부분별 섞기

 

 

강좌에 몽타주라는 개념이 나오는데 그건 뭐냐 잘 모르겠다..

물고기의 애니메이션을 설정하는데 고려할 게 많다. 우선 속도변화 좌우상하 방향전환

그리고 부분별 애니메이션 섞기 등이 있을 거 같다. 

예를들어 물고기의 입 애니메이션을 잡았다.  그러면 이동 중에 랜덤하게 입의

애니메이션만 끼워넣어야 한다. 

 

본 하이라키 전체 애니메이션말고 부분의 애니메이션이 섞여야 하는데 이런건 어떻게

해야 할까. 위의 강좌 20번을 보면 비슷한 내용이 있다. 걷고 달리는 애니메이션에 주먹질

애니메이션을 허리 위쪽만 섞는 내용이 나온다. 참고하면 될듯.

 

 

 

 

 

애니메이션 진행 프로세스

 

 

unreal engine 4 ai behavior tree & navmesh 강좌 예제에서는 3가지 state를 이용하였다.

Patrol, Search, Attack

 

패트롤에 있다가 적을 발견하면 어택을 하고 적이 시야에서 사라지게 되면 잠시 서치를 하고는

다시 패트롤로 돌아간다.  패트롤은 targetPoint를 찍어놓은 곳들을 반복하여 돌아다니는 방식이다.

 

나는 state 구성을 어떻게 해야할까.

 

State

 

Swim

Search

Eat

 

swim을 하다가 먹이를 주면 가다가 eat,  마우스 클릭을 때서 먹이를 그만 주면

search로 잠시 먹이를 찾다가 다시 swim으로 돌아간다..    우선 이렇게 구성하고 애니메이션 동작은

Idle하나만 적용해서 구현해보자.

 

fishChracter 블루프린트 모습인데 디폴트 블루프린트 - 캐릭터를 생성하면 그림처럼 캡슐모양의

콜리더가 생성이 된다. 내 캐릭터는 캡슐모양이 어울리지 않으므로 구로 바꿔서 달려고 한다.

( 구 중심에 root 조인트 위치가 오도록 조절해야겠지? )

 

다만 구 하나만 놓으면 몸통쪽 밖에 커버가 안되는데 머리와 꼬리쪽에도 구를 달아서 충돌이 일어나도록

해야할 것이다. 그건 블루프린트 3인칭 게임 제작 강좌 21번을 참고하면 된다. 강좌에서는

손목에 구를 달아서 주먹질을 하면 주먹의 콜리젼을 인식하도록 했다.

 

( 최상위 콜리젼을 캡슐에서 구로 바꾸려고 했는데 방법을 모르겠다...  그래서 그냥 캡슐의 모양을 구처럼

바꾸어 주는걸로 넘어감 )

 

캐릭터 블루프린트의 뷰포트모드에서 구 콜리전 두개를 만들어 배치하고 컨스트럭션 스크립트로 간다.

위와 같이 연결한다. in socket name에 있는 이름들은 소켓을 따로 만들지 않고 그냥 joint의 이름을

적어준 것이다. 근데 또 뭔가 에러가 난다.   붙긴 붙는데 sphere의 사이즈가 엄청나게 커져있다.

아무래도 fbx를 가져올때 단위를 바꿔 import하면서 joint의 사이즈는 임포트시 원래 크기로 들어와

메쉬가 안맞는게 아닌가 조심스레 예측해본다...

 

그래서 그냥 sphere의 radius를 0.5 정도로 매우작게 줄였다.. 매번 느끼지만 항상 제대로 한번에 되는게

하나도 없다.

위쪽은 level에 캐릭터 블루 프린트를 배치했을대 모습이고 아래는 블루프린트 윈도우의 모습인데

가운데 노란색  캡슐콜리전의 크기가 다르게 보인다. 저건 원래 그런건가?

 

.....................................................................................................................

 

테스트로 키를잡은 anim_idle을 적용해보자. fish를 만든 파일의 하이라키구조는

최상위에 그룹이 있고 그아래 메쉬그룹과 root 조인트가 있다.

anim파일의 fbx의 하이라키구조는 최상위 그룹( 이름이 달라도 되는거 같다 ) 밑에 root 조인트의

구조를 가진다.

 

근데 애니메이션은 24fps로 키를 잡았는데 그런건 상관없나?

 

skeleton 블루프린트로 들어가서 idle애니메이션을 적용한 모습인데 저건뭐냐..

목 부분이 찌그러져 있다. 한번이라도 그냥 제대로 작동하라고 ㅜ ㅅㅂ ㅁㄴ이ㅏ럼니ㅏ;ㅇ럼

역시 임포트할때 사이즈 단위를 바꿔서 생기는 문제인가?  저부분이 root의 weight와 관련있는

부분처럼 보이는데 root는 weight에서 제외 시켜봐야겠다.

 

음..  해결되었다. root는 제외하고 스키닝해야한다.

 

................................................................................

애니메이션을 적용하였더니

오마갓;

내 이럴줄 알았다. 본의 스케일이 안맞아서 스케일이 늘어나 버렸다...

본은 왜 스케일이 안맞지???  개념을 모르겠네.  아마 FBX export시 스케일을 0.1로 바꾸는 과정이

전체 씬을 그룹으로 한번 싸서 0.1 때려버리는거 같다. 하위 스케일이 다 틀어지는듯.

 

또 첨부터 다시 스케일 맞춰야 할거 같다..

현재 씬의 크기가 실제 오브젝트들보다 10배씩 키운상태의 스케일감이라 물고기가 엄청 거대한 오브젝트로

인식되어 lod까지 먹었다.

 

수정방법이 두가지 방향이 있다. 실제 사이즈에 맞게 씬을 다시 수정하는것과..

마야자체에서 10배씩 키워서 작업하는 방법..   어떤걸로 할까.  향후 진행과정을 생각하면

내가 나무나 풀을 하나씩 만들 수 없기 때문에 거의다 템플릿들을 가져와 사용할 거다.

나무 풀 등 자연물 샘플들은 어떠한 스케일 감으로 작업이 되어 있는지 확인해 보자.

 

/////////////////////////////////////////////////////////////

 

전에 열어봤던 open World Demo Collection 샘플이 어쩐일인지 아무리 시간이 지나도 열리지가

않는다..   업데이트 이후의 현상인거 같아서 하위버젼 엔진을 새로 다운받았지만 하위버젼과

호환되는 샘플이 아니다.. 어쩌라는 건지.

 

구글에 봐도 원래 시간이 오래 걸리는거 같다.

 

 

 

 

 

Scale Unit 문제

 

 

 

open World Demo Collection 같은 무료 샘플 파일들에서 오브젝트 들을 가져다 쓰려고 한다.

그래서 오브젝트의 스케일들을 비교해봤는데 마야에서 cm로 맞추고 만든 오브젝트들이

open World Demo Collection 씬에 들어오면 1:1 스케일보다 조금 작게 들어온다.

 

프로젝트들이 실사이즈로 오브젝트를 만드는건 아닌거같다?

 

----------------------------------------------------------------

 

마야에서 cm로 설정하고 plane width 30의 크기에 맞춰 물고기를 만들어 UE4로 가져오나

마야에서 m로 설정하고 plane width 30의 크기에 맞춰 물고기를 만들어 UE4로 가져오나

 

모두 같은 크기로 들어온다.

 

 

아래그림의 왼쪽은 BSP로 만든 200 200짜리 플랜이고 오른쪽은 마야에서 cm로

유닛을 세팅하고 만든 200 200짜리 플랜이다.  일치한다.

 

마야에서 m로 유닛을 설정하고 200 200으로 플랜을 만들어 가져와 오른쪽에 붙였다. 역시 같은 사이즈로

들어온다.

 

 

 

 

 

 

 

마야와 언리얼에서 unit을 맞추는 설정은 찾아봐도 딱히 안나온다. uit scale을 조절하는 옵션은 world

settings / vr / world to meters라고 하나 있는데 임포트 스케일 등과는 관련이 없는거 같다.

유일하게 스케일을 바꾸려면 import할때 옵션에서 스케일을 바꿔주어야 한다.

이 값을 바꾸면 static mesh 윈도우에 들어가면 디테일 옵션에서 볼수 있는 import uniform

scale값이 바뀐다. 근데 임포트할때 말고 디테일 옵션에서 나중에 바꾸면 실제 씬에 적용되지는 않는다.

(왜지?)

 

 

 

----------------------------------------------------------------

 

그래서 나는 마야에서는 실제 크기에 맞춰 만들고 import시에 2.5스케일로 불러와 보려고 한다.

본 애니메이션에 문제가 없어야 할텐데..

//  테스트 결과 애니메이션에도 문제가 없다. 2.5 스케일업 해서 쓰는걸로.

관련글 더보기