반응형

최근 마티네 작업중에 카메라밖에 있는 캐릭터일 경우 렌더링 되지 않는 문제가 발견됬습니다.

그것을 해결하기 위해서는 Always Tick PoseAlways Tick Pose And Refresh Bone 으로 설정을 변경해 주시면 해결 됩니다.

 

레벨-> 해당 스켈레탈 캐릭터의 디테일 옵션 -> Skeletal Mesh의 MeshComponent Updata Flag를 보시면

Always Tick Pose로 되어 있습니다.

해당 옵션의 설명을 보면 Always Tick, But Refresh Bone Transforms only when rendered 이라고 설명하고 있습니다.

번역  - 렌더링  경우에는 반드시 하지만 업데이트 에만 변환합니다....  한마디로 렌더링이 되어야 업데이트를 한다는 이야기입니다.

 

이 옵션을 Always Tick Pose And Refresh Bone으로 설정을 변경해 주시면 정상 출력이 되는데요, 이 설정은 렌더링 되든 안되든 항상 본의

트랜스폼을 감지하게 됩니다.

 

당연히 이 옵션이 Always Tick Pose보다 무겁기 때문에 모든 캐릭터에 켜주시면 안되고, 불가피하게 안나오는

캐릭터들에게만 체크해 주시기 바래요^^

반응형
반응형

 

FBX와 언리얼상에 애니메이션 속도가 다르게 재생되는 문제가 발생했습니다.

여러가지 확인해 본 결과 FBX의 샘플링 속도와 엔진에서의 샘플링 속도 차이로 생기는 문제였습니다.

매번 발생하지 않고, 간헐적으로 발생하는 문제인데요~

문제 발생시 Use Default Sample Rate 를 체크하고 임포트 해주면 문제가 해결됩니다.

 

반응형
반응형

시네마팀에서 마티네에서 애니메이션 레이어 기능이 필요하다고 하셔서 내용 연구하여 공유합니다.

 

1. 편집할 애니메이션 선택


 

 

2. 어셋 생성하여 시퀀스 추가

- 첫 포즈만 불러올지 애니메이션을 전체 불러올지 정할 수 있습니다.


 

 

3. 생성된 시퀀스 에서 모션 편집

- 정면을 보면서 걷는 모션을 왼쪽을 보면서 걷는 키를 만들어보고자 합니다.


 

4. 각 메뉴별 상세 설명

(1) 현재 편집 시퀀스 - 현재 모션이 저장될 시퀀스 입니다.

(2) 현재 편집 관절 - 키를 수정할 관절입니다.

(3) 뷰 상에서 로테이션, 포지션, 스케일 키등을 편집후 +키 버튼을 누르면 애니메이션 키가 적용됨

(4) 커브 에디터 - 맥스의 커브 에디터와 거의 흡사하며 그래프의 꺽임등을 수정할 수 있고, 키도 수정할수 있습니다.

(5) Roll , Pitch , Yaw의 각축의 락을 걸어 원하는 축에만 모션을 줄 수 있음

(6) 작업을 하다보면 그래프가 보이지 않는 곳으로 사라질 때가 있는데, 새로 고침이나 모두 표시 버튼을 눌러주면 보기 편하게 정리해 줍니다.

 

- 이미지를 클릭하시면 크게 보실 수 있습니다.

 

작업된 모션 영상

- 원래 정면을 보던 모션인데 위 기능을 활용하여 왼쪽을 바라보며 걷도록 수정해 봤습니다.

 

 

키 작업시 주의사항

- 맥스만큼 편하게 키를 제어하는 것은 어렵습니다.. 당연히 간단한 레이어 포즈 편집용으로만 사용해 주시는게 좋을거 같습니다.

1. 키 복사가 쉽지 않다. 맥스에서는 Shift 버튼으로 간편히 키 복사가 되지만, 언리얼에서는 그래프상에서 수치를 복사하여 사용합니다.

2. 키 편집 공정이 맥스와 매우 달라 숙지하는 시간이 필요함. - 틈틈히 연습이 필요해 보입니다.

3. 오토키(Autokey)가 아닌 셋키(Setkey) 방식입니다~  풀어서 설명하자면 모션을 움직인 후 반드시 키버튼을 눌러줘야 모션이 적용됩니다.

 

반응형
반응형

얼마전에 맥스의 프랍이 언리얼로 넘어가면서 y축으로 90도 돌아가는 문제가 있었습니다.

그 이유를 명확히 이야기 하자면 맥스와 언리얼의 좌표계가 다르기 때문입니다.

맥스 - 오른손 좌표게 , 언리얼 - 왼손 좌표계

 

 

여기서 오른손 좌표계와 왼손 좌표계에 대한 간단한 설명.

3차원 좌표계를 표현할 땐 보통 아래의 그림과 같은

왼손 좌표계(left-handed coordinate system)와 오른손 좌표계(right-handed coordinate system) 두 가지 방법을 이용합니다.

 

오른손 좌표계는 근 100여년 동안 표준적으로 사용되어온 방법입니다. 물리학계를 비롯해 OpenGL 등 대부분은 이 좌표계를 사용합니다.

왼손 좌표계를 사용하는 대표적인 사례로는 Direct3D가 있습니다.

 

이 두 좌표계를 외우는 방법은 다양하겠지만다음과 같은 방법으로 숙지하면 알기 편합니다.

 

  1. 박수 칠 때 처럼 양 손을 마주 보도록 펼친다. 이 때 엄지손가락은 나머지 손가락과 직각이 되도록 한다.

 

  2. 가운뎃손가락을 손바닥에 수직이 되도록 반 쯤 접고, 약손가락과 새끼손가락은 완전히 접는다.

 

  3. 마치 '쌍권총 자세'를 연상케하는 모양이 되었을 것이다.

 

     왼손은 엄지손가락부터 순서대로

 

     [엄지손가락-x, 집게손가락-y, 가운뎃손가락-z]

 

     오른손은 반대 순서로

 

     [엄지손가락-z, 집게손가락-y, 가운뎃손가락-x]

 

     이런 식으로 대응시킬 수 있다.

 

이 상태로 양 손의 집게손가락을 하늘을 향하게 해서 위의 그림에 나온 좌표계와 비교해보시면 똑같은 배치가 되어있음을 알 수 있습니다.

 


추가질문 - 다른 뼈들은 알아서 축정렬이 되서 잘 들어오는데 왜 소켓에 붙은 Prop만 그렇지?

그 이유도 간단합니다. 다른 모든 더미와 뼈들은 맥스에서 제작해서 넘어오기 때문에 알아서 부모축을 따라가면서

문제가 없지만, 무기에 붙은 소켓 더미는 언리얼에서 제작한 것으로 언리얼 원본 좌표를 따라갑니다.

거기서 프랍이 혼란을 갖게 됩니다.

프랍은 맥스에서 만든거라 오른손좌표계로 기억되어 넘어오지만, 언리얼에서 만든 소켓은 왼손 좌표계다 보니

축이 다르게 설정 되는 겁니다.

이 문제를 해결하기 위해서 무기 축 더미를 언리얼 소켓이 아닌 맥스에서 더미를 만들어 사용하게 되면

문제가 해결되는데, 현재 언리얼에서 쓰는 소켓 더미는 엔진상에서 많이 사용되고 있기 때문에 그 상태를 유지하도록 한겁니다.

 

반응형
반응형

*제작한 이펙트가 처음엔 잘 나오다가 시간이 지나면 알파값이 제대로 안빠지고 소팅도 안되는 문제가 발생하고 있습니다.  동시에 프레임도 떨어지고 있습니다. .(갤럭시s5, 넥서스5, G2 모두 발생)

 

 

원본 이펙트

 

 

빌드후 시간이 지나면서 문제가 발생하는 모습

 

 

여러가지 테스트를 거쳐 원인을 파악해 본 결과 파티클에 패너 함수가 적용되면서 값이 누적되면서 발생하는 문제로 추정됩니다.

파트클에도 움직임을 주고 쉐이더에도 움직임을 주면서 뭔가 문제를 발생하는거처럼 보입니다.

패너값을 0으로 놓고 파티클로만 움직임을 주고 빌드를 하면 문제가 발생하지 않습니다.




**이 문제의 해결방안~

이 문제점을 커스텀 UV를 사용하여 해결하였습니다.

기존에는 PANNER를 이미지에 바로 연결하여 UV애니메이션을 적용했는데, 모바일 빌드시에는 텍스처에 바로 연결하지 않고

커스텀 UV를 만들어 연결해줘야 느려지는 현상이 없어집니다.

반응형
반응형

모프타겟을 사용하여 마티네에서 표정애니를 추가할 수 있는 것을 확인했고, 모바일에서도 작동됨을 확인했씁니다.

 

이 작업이 들어가기전에 선행되어야할 중요한 사항.

- 모프타겟은 버텍스 애니라 연산부하가 있어 표정애니 넣을 부분만 파츠로 나눠서 적용한다.
- 얼굴만 따로 분리하니까 2400 poly 정도 됩니다. 몸 전체는 15000개 이상이라 그냥은 절대 넣을수 없음.PC에서도.. 퍼포먼스 테스트를 거친후 무리가 없다고 판단될때 게임에 적용.

 


작업 공정 가이드

1. Max 에서의 작업

맥스의 모퍼 기능을 활용해 필요한 표정들을 셋팅해 준다. 여기서는 테스트로 5가지만 넣었음.
모퍼의 장점은 모델러들에게 부탁해 원하는 표정을 버텍스를 이용하여 퀄리티 있게 마음껏 만들어 사용할 수 있다.

(1) 원본 모델 소스를 여러개로 복사해 원하는 표정의 모델링을 한다.

 

(2) 원본 모델 소스에 복사된 캐릭터들의 표정 데이터를 모퍼에 추가해 준다.

- 0~100의 수치를 조절하여 표정을 다양하게 꾸밀 수 있다.

 

(3) 맥스에서 익스포트시 체크사항

익스포트 스크립트를 사용하시면 안되고, 아래 사항을 체크하셔서 수동으로 익스포트 하셔야 합니다.

 

 

 

2. 언리얼에서 작업
 

(1) 임포트시 체크사항

- 모프타겟 체크


 

 

(2) 메쉬창에 모퍼 리스트가 뜨는지 확인

-맥스에서 지정한 모핑 리스트가 그대로 넘어왔는지 수치를 조절하며 테스트

 

 

(3) 페이셜을 추가할 시퀀스에 표정애니를 추가해줍니다.

- 모핑할 시퀀스를 추가 -> 변수 추가 -> 모퍼네임설정(수동으로 적으면 인덱스로 불러옴) -> 커브 추가로 애니 추가


 

- 커브 유형을 모프커브로 설정해 줍니다~ 설정안해주시면 애니가 안나와요~


 

(4) 마티네에서 표정애니가 추가된 시퀀스를 호출함

 

 

아래는 위 공정을 거쳐 마티네상에 표정애니를 추가해본 테스트 영상입니다.

 

반응형
반응형

1. 발사 모션을 상체에만 적용 시키기 위해 Fire라는 몽타주 애니메이션을 만들어 발사 Anim 파일을 적용시켜 줍니다.

 

 

제작된 몽타주 파일에 발사 모션을 연결해 준뒤 UpperSlot을 생성해 줍니다. - 상체모션만 넣기 위한 준비


 

 

 

2. 준비가 끝나면 Animation Blueprint로 와서 새롭게 코딩을 해줍니다.

- 애니메이션 블루프린트 제작할때 완료했던 모션을 캐시로 저장하여 메모리에 넣어줍니다.

 

 

-저장된 포즈를 불러와 사용합니다.

 

 

- 그 다음 '본 마다 레이어로 블렌드'를 불러옵니다.

 

- 블렌드의 세부 설정으로 가서 어느 본의 몇 번째 부터 블렌드가 시작될건지 정해 줍니다.

 

- 몽타주로 설정한 슬롯을 불러옵니다.

 

- 필요한 노드들이 전부 불러졌으면 최종적으로 연결해줍니다.

 

 

 

 

 

3. Animation Blueprint에서 제작된 것을 Character Blueprint에서 적용하도록 셋팅해 줍니다. 

위 그림처럼만 연결해주면 이제 발사버튼을 누를때 마다 볼사모션이 나옵니다.

이제 마지막으로 물리가 적용된 총알을 만들어 적용시켜 봅시다.

 

 

 

4. MyProjectile 이라는 물리가 적용된 총알을 만들어 줍니다.

물런 블루 프린트로~

 

 

 

5. 마지막으로 모바일 터치에 대한 부분과 총알 발사에 대한 부분을 캐릭터 블루프린트에서 코딩해 줍니다.

여기까지 마무리되면 모든 적용이 끝났습니다~!

언리얼은 계속 공부해 보고 싶은 엔진이긴 합니다..^^

 

적용이 완료되면 배경 오브젝트에 충돌이 일어나며 상하체 모션에 블렌드가 일어납니다~^^

 

 

반응형
반응형

- 게임모드 제작하여 게임속에 주인공 캐릭터 넣기

 

1. 게임모드 블루 프린트를 만든다.

- 이녀석은 아이콘에 따로 색이 안붙는거 같네요~

 

 

2. 디폴트 창에서 기존에 제작한 캐릭터 블루 프린트 연결하기


- 캐릭터 뿐 아니라 UI와 컨트롤러등도 내가 제작한 걸로 넣을 수 있습니다.

 

 

3. 월드 세팅에서 제작한 게임모드 불러 오기

여기까지 만들면 게임에서 뛰어다니는 주인공을 넣는데 필요한 모든셋팅이 끝났습니다.

 

 

PLAY~~!! 

 

 

근데 아무것도 든거 없이 맨손으로 필드만 뛰어다니니 왠지 심심하네요..

쓰는김에 발사모션 적용하는 방법과 총알에 물리 적용하는거 까지 같이 적어보겠습니다... To Be Continue..

 

반응형
반응형

 

*본 가이드는 4.6때 작성된것으로 최신버전과는 다소 차이가 있을수 있습니다.

**주인공 캐릭터 만들기 2번째

애니메이션 블루 프린트 만들기​



1. 주인공이 사용할 모션을 임포트해 옵니다.

​- 필수적으로 필요한 모션은 이동 모션(상,하,좌,우)과 대기모션과 발사모션입니다.

애니메이션 관련 문서

https://docs.unrealengine.com/latest/KOR/Engine/Animation/Sequences/index.html







2. 캐릭터 블루프린트를 제작하면서 사용된 원본 모델의 스켈레톤을 설정합니다.

블루프린트를 생성하려고 하면 스켈레톤 설정 화면이 나옵니다.

- 애니메이션 블루 프린트 파일. 이 녀석은 특이하게 주황색입니다. 

 

 


3. 주인공의 이동모션에 사용될 앞,,,우 모션을 블렌드 스페이스로 만들어 설정해 준다.


이미지를 클릭하시면 원본으로 보실수 있습니다.


- 필요한 모션들을 드래그앤 드랍으로 블렌드 제어창으로 넣을 수 있습니다. 여기에 필요한 대기, 이동관련 모션들을 넣어줍니다.


 



4. 주인공의 총구겨냥포즈에 사용될 앞,,,우 모션을 Aim Offset으로 만들어 설정해 준다.

 

- AimOffset은 강력한 포즈 저장기능이라 MeshSpace 형식으로 되어 있는 모션만 불러와서 사용할수 있다. 사용할 모션들을 전부 MeshSpace 형태로 바꿔줍니다.


 - 여기서도 필요한 모션들을 드래그앤 드랍으로 블렌드 제어창으로 넣을 수 있습니다. 여기에 필요한 각 방향별 Aim 모션을 불러옵니다.

 



 

5. 위 두가지 제어가 끝나면 다시 애니메이션 블루프린트로 가서 애님 스테이트를 만들어 준다.

(1) 기본 스테이트 머신 추가​

스테이트머신이 만들어진다.

생성 완료후 서로 이어준다.


 

 (2) New State Machine 을 더블클릭후 스테이트머신 제어창으로 들어간다.

- 그러면 비어있는 Entry라는 스테이트 연결고리가 나온다.​


(3) Entry에서 화살표방향으로 마우스를 드래그앤 드랍을 한 후 MOVE 라는 스테이트를 추가한다.


-Move에 대한 스테이트를 제작할거라 Move라고 이름지어줍니다.(이름은 자유입니다~)​



 (4) Move로 제작된 스테이트 머신을 다시 더블클릭해서 스테이트 제어창으로 들어와 위에서 제작했던 블렌드 스페이스와 에임 오프셋을 드래그앤 드랍으로 창에 올려 넣는다.

이미지 클릭하시면 원본으로 보실수 있습니다.



-여기까지 들어오면 이제 스테이트머신에서 모션 연결의 최종단계까지 왔습니다.


6. 블렌드 스페이스와 에임 오프셋에 사용된 변수값을 블루프린트에서도 선언하여 같은 구조로 움직이도록 설정한다.

  

방향, 속도, z축(Yaw),y축(pitch)에 대한 변수를 Float형으로 선언~


- 선언된 변수들을 스테이트창으로 드래그 하여 GET으로 얻어온다.


- 이제 마지막으로 아래 그림처럼 서로 연결해 주면 마무리 된다.




이동속도와 회전 의 변수값을 넣어보면서 캐릭터가 프리뷰창에서 원하는 대로 움직이는지 확인한다.


 

 

 

7. 애님 스테이트 제작이 끝났다면 이벤트 그래프로 가서 캐릭터 블루 프린트 값을 형변환으로 불러와 위치 제어 함수를 블루프린트로 제작해 준다. 

 


- 이동과 회전에 대한 블루프린트

(블루프린트의 제작 공정에 대한 자세한 코멘트는 생략합니다.)

이미지 클릭하시면 원본으로 보실수 있습니다.



- 캐릭트 블루프린트에서 움직임이 일어났을때 방향과 속도에 어떤식으로 영향을 끼칠지에 대한 함수입니다. 속도와 방향을 벡터로 변환해주고 기존에 선언했던 변수들의 값을 얻어온 값으로 SETTING해 줍니다.




- 총구 겨냥에 대한 블루프린트

(블루프린트의 제작 공정에 대한 자세한 코멘트는 생략합니다.)

이미지 클릭하시면 원본으로 보실수 있습니다.


- 캐릭트 블루프린트에서 마우스 회전이 일어났을때 총구 방향에 어떤식으로 영향을 끼칠지에 대한 함수입니다. 여기서도 방향을 벡터로 변환해주고 기존에 선언했던 변수들의 값을 얻어온 값으로 SETTING해 줍니다.

 

 

여기까지 제작후 컴파일후 에러가 없으면 완료된겁니다.

 


8. 애님블루 프린트 제작이 끝나면 캐릭터 블루 프린트에서 사용할수 있도록 디폴트 창을 열어 방금 제작한 애님 블루 프린트를 연결해 준다.

 이미지를 클릭하시면 원본으로 보실수 있습니다.


 

처음 해보시는분은 워낙 절차가 많아서 어렵고 복잡하게 느끼실수 있으실거 같네요..


블루 프린트 설정에 대해서는 언리얼 문서를 참조하시면 많은 도움 받으실거에요~

https://docs.unrealengine.com/latest/KOR/Engine/Animation/AnimBlueprints/index.html

여기까지 애니메이션 블루 프린트의 제작 방식이었습니다.

반응형
반응형

**본 가이드는 언리얼4.6에서 제작한거라 최신버전과는 다소차이가 있을수 있습니다.

 

언리얼엔진의 강력한 기능중 하나가 주인공 캐릭터 제작이 타 엔진보다 간편하다는 점입니다.

하지만, 언리얼엔진을 자주 접해 보지 않은 사람에게는 결코 쉽지 않아 보이기도 합니다.

항상 느끼지만 알기 전까진 어렵다가 알고 나면 쉬운게 언리얼엔진인거 같아요..ㅎㅎ

주인공 캐릭터 제작방식에 대해서 3개의 카테고리로 나눠 살펴보고자 합니다.

**메시 임포트 같은 기본적인 사항은 문서를 참조하도록 하고 넘어가도록 하겠습니다.

**총알 발사나 무기 장착 같은 테크닉에 대해서는 잠시 예외로 하고 추후에 다루도록 하겠습니다.


주인공 캐릭터를 만들기 위해 필요한 파일은 3가지입니다.

  

캐릭터 블루 프린트

 

애니메이션 블루 프린트

 

게임모드 블루 프린트



이 시간에는 주인공 캐릭터를 만들기 위해 가장 뼈대가 되는

캐릭터 블루 프린트 제작 방식 에 대해서 살펴 보겠습니다.



1.주인공으로 사용될 스켈레탈 메시 파일을 임포트 합니다.

기본적으로 메쉬, 피직스 에셋, 스켈레톤 세개의 파일이 생성됩니다.


스켈레탈 메시 임포트에 대한 언리얼 문서 -

https://docs.unrealengine.com/latest/KOR/Engine/Content/FBX/SkeletalMeshes/index.html


2.주인공 스켈레탈 메시를 제어할 캐릭터 블루프린트를 생성해 줍니다.

파일을 생성할 창에서 오른쪽 마우스 -> 블루프린트-> 캐릭터로 들어가 생성후 보기 편한 이름으로 지정해 줍니다.



이 예제에서는 여자주인공을 사용하기 때문에 Women_BP 라는 이름으로 설정합니다.

프리뷰에서 색깔별로 어떤 에셋인지 구분하도록 되어 있습니다.

블루프린트는 이름답게 파란색으로 되어 있네요~





 


3. 블루프린트 -> 컴포넌트 에서 사용할 메쉬와 카메라를 설정해 줍니다.


(1) 캐릭터 설정

​- 메시에 대상 캐릭터를 선택후 화살표 버튼을 눌러서 넣어줍니다.


- 메시가 바운더리 박스와 같은 위치에 있도록 위치값을 맞춰 줍니다.

- 메시가 Arrow(하늘색 화살표 방향)와 일치하도록 회전해 줍니다.



(2) 카메라 설정

컴포넌트 추가 -> 스프링 암

스프링암을 부모로 하여 하위에 카메라를 연결해 줍니다.

스피링암 추가후 카메라 추가


-  일반 카메라를 넣어도 되고 스프링 암 카메라를 넣어도 되지만, 스프링 암 컴포넌트는 부모와 자손에 일정한 거리를 유지해주며 충돌이 생기면 벽을 뚫고 나가는 것을 방지해주는 컴포넌트입니다.


- 카메라의 위치값을 설정하여 주인공을 바라보는 뷰를 정해 줍니다.



수치로 설정해 주면 되는데 실시간으로 화면을 보면서 설정하고 싶다면, 현재까지 설정한 캐릭터 블루 프린트 파일을 컴파일 후 저장한 다음 레벨(씬)에 올려 실시간으로 카메라 위치를 변경할 수 있습니다.


 

 


4. 편집 -> 프로젝트 셋팅 -> 입력으로 가서 키보드입력에 대한 설정을 해줍니다.

​- 입력에 대한 정보를 얻어 오기 위해 키보드 입력을 직접 설정할 수 있습니다.

-MoveForward의 Scale 값은 캐릭터의 움직이는 값입니다.



- 전부 만들기 힘들다면 다른 프로젝트에서 구성된 입력을 익스포트하여 임포트로 불러와서 사용해도 무방합니다.



5. 블루프린트 코딩 - 아래 그림을 참조하셔서 코딩해 줍니다.


 

전진버튼을 누르면 Action Mappings의 입력제어에 캐릭터의 새로운 벡터값을 구해 무브먼트를 설정하는 구조.


 


마우스를 회전하면 Axis Mapping의 축 변환에 따라 캐릭터의 새로운 로테이션값을 구해 무브먼트를 설정하는 구조.

 

오른쪽 마우스를 눌렀을때 화면이 변경하도록 하는 설정 - 바이오하자드 방식을 따라했습니다.



스마트폰 화면 터치 입력 - 모바일 컨트롤러 지정 

터치를 실행하기 위해서는 회전과 전진에 대한 Float형 변수를 먼저 선언해야 합니다.




 그 외에 총알 발사나 무기 변경 같은 함수도 캐릭터 블루 프린트에서 지정할수 있지만, 그 부분에 대해서는 마지막 시간에 다뤄보도록 하겠습니다.


여기까지 캐릭터 블루 프린트의 제작방식이이었습니다.

다음에는 애니메이션 블루프린트 제작에 대해서 살펴보겠습니다.  To be Continue..

 

반응형
반응형

캐스케이드는 언리얼에서 제공하는 이펙트 전용 툴입니다.

1부에서 제작한 불 쉐이더를 이용하여 이펙트를 제작했습니다.

불 이펙트에 사용된 인자는 아래와 같습니다.


사용된 인자를 순차적으로 살펴보겠습니다.

 

1. Required

사용할 메터리얼과 그 메터리얼에 대한 설정을 변경할 수 있습니다.


 

 

2. Spawn

- 이미터 파티클의 스폰개수 / 속도에 영향을 끼치는 모듈.

 

 

3. LifeTime

- 스폰시 파티클의 초기 수명을 설정하는 데 사용되는 모듈입니다.

 

 

4. Size

? 파티클 수명상의 여러 지점에서 그 크기에 영향을 끼치는 모듈입니다.

   (1) Initial Size - 파티클 수명상의 여러 지점에서 그 크기에 영향을 끼치는 모듈입니다.

 

(2) Size Scale - 파티클의 사이즈를 BaseSize에다 지정된 스케일 인수를 곱한 값으로 설정하는 모듈입니다. 주의할 점은 해당 프레임에서 이 모듈 이전의 모든 크기 조절을 덮어쓰는 모듈이라는 겁니다.

 

 

4. Parameter

- 머터리얼 같은 다른 부분을 제어할 수 있도록 파티클 시스템 외부로 데이터를 전달하는

모듈입니다.

(1) Dynamic - 모듈에 대한 동적 파라미터 배열입니다.


 

 

5. Velocity

? 다양한 방법으로 파티클의 속도를 조절하는 모듈입니다.

(1) Initial Velocity ? 파티클의 초기 속도를 설정하는 모듈입니다.

 

 

6. Location

- 파티클 수명상의 여러 시점에서 파티클의 위치에 영향을 끼치는 모듈입니다.

(1) Initial Location ? 파티클의 스폰시 초기 위치를 설정하는데 사용되는 모듈입니다.


 

(2) Cylinder - 원통형 모양 내에서 파티클의 초기 위치를 설정하는데 사용되는 모듈입니다.

 

(3) Pivot Offset - 방향성을 어떻게 할지 설정하는 모듈입니다.


 

7. SubUV

? 다수의 개별 프레임격자 배치되는 SubUV텍스처를 파티클에 활용할 수 있도록 해 주는 모듈입니다.

(1) Subimage Index ? 플로트 분포에 따라 사용할 서브이미지를 선택하는 모듈입니다. 현재 서브 이미지는 왼쪽에서 오른쪽, 위에서 아래 순입니다.

 

8. Color

- 방출된 파티클의 색에 영향을 끼칩니다.

** Color 모듈은 이미터에 사용되는 머티리얼이 Particle Color 머티리얼 표현식을 사용하여 모듈에서 머티리얼로 색을 전하도록 해야 합니다.

(1) Initial Color

-스폰시 파티클의 색을 설정하는 모듈입니다. 다른 컬러 모듈이 덮어쓰지 않는 한 파티클은 수명에 걸쳐 이 색을 유지하게 됩니다. 다음과 같은 멤버가 포함됩니다:

psys_initial_color.gif

 

(2) Color Over Life

-파티클의 수명에 걸쳐 그 색을 설정하는 모듈입니다.

psys_color_life.gif

 

 

위 그림과 같이 설정을 하면 아래 영상과 같은 불 이펙트가 출력됩니다. 

 

반응형
반응형

**  이펙트 쉐이더 제작 **

다이내믹 파라미터를 사용하여 파티클과 연동해주면 쉐이더를 캐스케이더에서 편집이 가능하게 해줍니다..

다이내믹 파라미터는 파티클 에미터가 네개의 값을 전해 어떤 식으로든 사용할 있도록 주는 통로입니다. 값은

캐스케이드에서 ParameterDynamic 연결되서 사용됩니다.

여기서 사용된 이펙트는 세개의 다이내믹 파라미터를 캐스케이드와 연결하여 사용됐습니다.

 

첫째는 Alpha Erosion

  • (혹은 연기) 특유의 일렁이는 효과를 주기 위한 노드

  • 다이내믹 파라미터를 이용하여 캐스케이드에서 수치를 조절할 있도록 설정했다.

 

둘 째는 Random 0-1 per particle

  • 0~1 수치 사이에서 다양한 형태로 패닝 되도록 설정

  • 이 수치 역시 다이내믹 파라미터를 이용하여 캐스케이드상에서 수치 조절할 수 있도록 설정

 

셋 째는 Distortion Amount

  • 일그러짐 효과를 주기 위한 노드

  • 다이내믹 파라미터로 구성

 

 

최종 쉐이더

 

 

 

다이내믹 파라미터를 최소화하여 간단히 만들기

  • Alpha Erosion 효과만 다이내믹으로 설정하고 나머지는 기본 셋팅만 해줘도 출력품질에 큰 차이는 나지 않습니다. 모바일에서는 이 방식을 쓰는걸 추천합니다.

 

 

**모바일에서 알파가 정상적으로 빠지게 하는 방법

기존 구매한 쉐이더에서는 아래 그림처럼 알파가 잘 안빠집니다.

 

모바일에서 정상적으로 알파가 빠지는 설정을 하려면 Opacity값으로 설정해 줘야 합니다.

(알파 텍스쳐를 추가하지 않고 Lerp를 이용하여 나오는 마스크이미지를 사용했습니다.)

 

그러면 아래그림처럼 정상적으로 알파가 빠짐

 

 

쉐이더 설정에 대한 가이드가 끝났습니다.

이어서 캐스케이드 설정에 대해서..(내일 올리겠습니다.)

 

반응형
반응형

시네마가 나올때는 UI가 사라져야 하는데, 간단한 구현 방법입니다.

 

 

반응형
반응형

제작한 UMG를 화면에 띄우고 싶으실땐 아래 함수를 레벨 블루프린트에

추가해 주시면 PLAY시에 UMG가 출력됩니다~ 참고하세요~

 

반응형
반응형

8. 꼬리와 포니테일


(1) 플립현상을 개선한 Spline IK 제작

  • 6번에서 만들었던 난플립 셋팅 방식을 사용하면 된다.

        

    

  • 바로 상위에 있는 본을 따라가는 구조가 되도록 난플립 방식으로 각 본마다 셋팅한다.

  •  

  • 핑속님이만든 SOK_NonFlipBone 스크립트를 사용. 동일한 반복작업을 최소화 할 수 있다.

 

 

(2) Stretch 컨트롤 추가

  • Freeze Length 체크를 해제 하면 자식본에 의해 사이즈가 변환된다.

  • $.stretchTM.scale을 활용하면 얼만큼 사이즈가 늘어나는지 확인이 가능하다. 자식본의 로컬 트랜스폼에 의해 변화가 일어난 부모본의 스트레치 값 확인

  • Stretch를 조절해줄 조절자 더미를 만들어 파라미터 에디터에 연결해 준다.

  • 더미와 연결될 본들은 SplineIK로 만들어 최초 더미와 본을 조절자 더미에 링크해준다.

  • 파라미터가 생성되면 더미와 하위 본들과 와이어 파라미터로 연결해 준다.

  • 연결하기 전에 페이런트로 했을 때 얼만큼의 로컬 포지션이 움직여 졌는지 확인한다.

  • 움직인 로컬 수치를 저장하고 와이어 파라미터를 연결한다.

     

  • 스트레치값에 100을 나누는 이유는 어트리뷰트 값의 디폴트가 100으로 되어 있기 때문이다. 그래야 1이라는 수치가 나와 로컬 포지션인 32.668의 값을 보기 좋게 조절하게 된다.

 

  • 하위 본들도 모두 위와 같은 방식으로 연결해 주면 파라미터 수치로 전체 사이즈 조절이 가능해 진다.

 

 

(3) Tentacle 속성 추가하기.

  • Tentacle 기능은 부가적인 기능으로서 알아두기만 하자. 계산에 의해 이루어지는 프리시쥴 애니메이션이라 할 수 있다.

  • 시중에 텐타클 제어가 가능한 다양한 스크립트들이 많은데 그 중에 편하게 테스트가 가능한 툴을 소개한다.

 

 

  • 이 툴을 활용하면 수학적으로 게산된 텐타클 본 생성을 편하게 할 수 있다.

  • 스크립트를 활용하여 본을 만들고 텐타클 파라미터를 활용하여 어떤식으로 움직이는 본을 만들지 조절하여 사용 할 수 있다.

  • 텐타클 본을 기존에 생성했던 난플립 본에 와이어로 연결해 주면 난플립본의 장점과 텐타클 본의 장점을 함께 사용할 수 있다.

  • Z로테이션의 스크립트를 열어보면 공식을 알 수 있다.

  • 텐타클본의 z축과 난플립본의 y축을 연결해 준다. 각각 본마다 다 연결해 준다.

  • 이 과정을 마친 후 전 과정에 스트레치 조절용으로 사용했던 조절자 더미에 텐타클 이펙트를 조절할 수 있는 파라미터를 추가후 연결해 주면 두가지를 다 조절할 수 있는 파라미터 에디터 생성이 가능해 진다.

  • 조절자에 키를 주면서 다양한 느낌을 추가 할 수 있다.

 

 

(4) 스프링 테일(Spring Tail)

  • Bone01Point01을 바라보는데 Point01Dummy01의 자식으로 링크되어 있다. 그리고 Bone02Point02를 바라보는데 Poit02Bone01의 자식으로 링크되어 있다.

  • 이 방식은 우리회사에서도 가장 많이 쓰는 방식으로서 범용적으로 많이 쓰이는 방식이다.

 




9. 엉덩이


  • 인간의 관절 중에서 가장 자유롭게 회전할 수 있는 관절이 어깨라면, 엉덩이 관절 또한 그에 못지 않게 자유로운 회전 특성을 가진다. 하지만 리깅의 난이도는 어깨에 비해서 상대적으로 낮은 편인데, 어깨는 견갑골이나 쇄골 등에 의해서 좀 더 다양한 상황이 만들어지기 때문에 엉덩이 비해 난이도가 높다.

  • 엉덩이 중간 본 만들기

    Orienttion Constraint 방식의 엉덩이 본

  • Point03의 역할이 가장 중요한데, Pelvis의 자식으로 링크되어 있고, 축 정렬은 왼쪽 허벅지와 축을 맞춰야 한다. 업노드가 아닌 그냥 축정렬.. 헷갈리지 않기.

  • 그리고 엉덩이 보정 본인 Bone05Point03 과 바이패드 트위스트 본과 Orientation으로 연결해 준다.

    Point03을 사용한 이유는 펠비가 허벅지와 축이 너무 다르기 때문에 Orinetatin 타깃으로 삼기에 적절하지 않다. 축이 정렬되지 않은 두 오브젝트는 금방 플립 현상이 생기게 된다.

  • 바이패드 트위스트본을 사용한 이유는 그냥 허벅지 오브젝트를 타깃으로 사용하게 되면 트위스트 상황에서 엉덩이가 너무 많이 비틀어져 엉덩이 중간 으로서의 역할을 하기 힘들어 진다. 

 

 

 

10. 대흉근/광배근


  • 대흉근은 아래 그림으로 빨간색으로 표시된 부분이다.

  • 2번 위치에 대한 접근이 가장 중요하다.

     

     

  • 만약에 2번없이 1번과 3번만으로 제어를 한다면 팔을 뒤로했을경우 몸을 파고드는 문제가 발생하며, 그 외에도 많은 제약사항이 따른다.

  • 2번 위치를 제어하기 위해서 LookAt방식을 적절히 사용하면 문제 해결이 용이해 진다.

  • 제작 방식 총 가이드

 

(1) 먼저 가슴의 위치를 잡아 줄 두 포인트를 만든다. 여기서는 서클로 만들었다. 중간에 있는 빨간색 본은 대충 위치를 잡아 주기 위한 보조 본이며

나중에 삭제 된다.

 

(2) 대흉근의 크기를 알려 줄 간단한 서클 제작 ? 여기서는 서클을 사용했지만 실제 모델링의 가슴크기에 맞게 셋팅하면 된다.


(3) 가상 대흉근 서클의 중심에 있게 될 Point01과 대흉근의 크기에 맞게 회전하게 될 Point02를 만든다. Point02Point01의 자식으로서 대흉근 크기에 맞게 회전되도록 한다.


(4) Point01은 가슴과 팔의 중간쯤을 항상 바라보도록 해 주기 위해 LookAT을 활용하여 서클0102를 바라보도록 셋팅한다.


(5) 이제 Bone을 만들기에 앞서 중간본들이 너무 과하게 움직이지 않도록 중간에서 잡아줄 헬퍼가 하나더 필요하기 때문에 적절한 위치에 Point03을 하나 만들어 준다. 왜 만드는지 이유가 궁금하다면 말로 설명 듣기보다 직접 따라하기 원한다. 그러면 Point03이 꼭 필요하다는 것을 알게 된다.


(6) 이제 가슴 쪽을 바라보게 될 두 개의 본을 만들어 준다.

Bone01 Bone02의 셋팅은 아래를 참고하자.

   

(7) 다음은 팔쪽을 바라보게 따라다니게 될 Bone03Bone04를 만들어 주면 끝난다.

  • Bone04의 포지션 컨스트레인트 셋팅은 bone02와 동일하며 LookAt만 팔쪽 서클을 바라보록 변경해주고, 그에 따라 Bone03역시 PositionConstraint를 팔쪽 서클써 따라다니도록 셋팅해 주면 모든 과정이 끝난다.

 

 

반응형
반응형

캐릭터 셋업 실전

 

 

1. 반자동 목(Neck) - 목젖의 움직임을 살펴보면서 목을 돌려보자.

  • Point01 헬퍼를 만들고 Rotation ControllerOrientation Constraint로 변경한 후 회전을 참조하는 타깃으로서 Bip01 HeadBip01 Spine2를 설정한다. 그러면 Point01은 언제나 머리와 가슴의 중간방향이 될 것이다.

     

  • Bip01 Neck 위치에 Bone01을 설치하고 Rotation ControllerLookAt Constraint로 변경한다. 그리고 언제나 머리를 바라보도록 설정한다. 그리고 가장 중요한 트위스트 방향(Select Upnode)Point01과 일치하도록 설정한다.

  • 최종적으로 스킨이 적용될 본은 Bone01이고 Bip01 Neck은 애니메이션 작업만을 위한 본이 된다.

  • Bone01이 위치가 고정되도록 Position Expression으로 지정한다.

 

 

 

2. 캔디 랩 현상과 중간 본


  • 본 기반의 스키닝 환경에서는 오브젝트의 외형을 구성하는 수 많은 버텍스들이 각각의 본을 어느 정도 비율로 따라가는지를 지정해주는 스킨 웨이트(Skin Weight) 작업을 해야 한다. 그런데 스킨 웨이트 값을 아무리 잘해도 관절이 심하게 꺽일 경우 피부의 부피가 줄어드는 현상이 발생한다.  사탕껍질이 비틀어진 모양과 비슷하다고 해서 캔디 랩이라고도 부른다.

    일반적으로 캐릭터의 관절을 어색하지 않게 표현하기 위해서는 적당히 많은 엣지(Edge)가 필요하다. 하지만 아무리 많은 폴리곤을 사용해서 엣지가 충분하더라도 캔디 랩 현상은 중간 본을 추가하지 않는 이상 어쩔 수 없이 발생한다.

  • 아래 그림은 엉덩이에서 자주 발생하는 상황의 샘플이다.

    왼쪽의 경우는 중간 본을 사용해서 회전을 분담한 경우이고 우측의 경우는 중간 본을 사용하지 않아서 부피가 심하게 줄어든 상황이다. 캐릭터의 대퇴부가 심하게 꺽이는 경우에 중간 본을 사용하지 않으면 우측처럼 부피가 줄어들어서 엉덩이가 볼품없이 보이게 된다.

 

 

3. 손목 트위스트


  • 팔은 몸 전체 중에 가장 큰 각도로 움직일 수 있는 부위이고 그 중에서도 손목은 180도 회전이 가능하여 캔디랩 상황이 빈번하게 발생하는 부위이다.

     

  • 중간 본을 몇 개를 사용해야 하는가?

    파란색은 트위스트 모디파이를 사용한 완전하게 비틀어진 모습이다.

    빨간색은 중간본이 없어 180도 돌렸을 때 캔디 랩이 발생한 모습이다.

    노란색은 중간본 한 개를 이용하여 지지대 역할을 해준 모습이다. 중간본이 늘어날수록 파란색과 같은 완전한 모습을 갖추게 된다. 퍼포먼스와 퀄리티를 고려하여 몇 개의 중간본을 이용할 지 논의하는 과정이 필요하다.

     

  • 바이패드 트위스트를 사용할지, 일반 본을 사용할지

  • 바이패드 트위스트를 사용하면 생성이 쉬운 장점이 있지만, 한 개만으로는 원하는 느낌을 주기가 힘들다. 무조건 50도만 따라가게 설정되어 있어 중간 본 역할로서는 한계가 있다 보니 여러 개를 만들어야 하는데, 그러면 퍼포먼스 문제가 있어 사용에 제약이 생긴다. 하지만, 본을 사용하여 셋팅하면 원하는 각도와 움직임을 설정할 수 있어 한 개만으로도 충분히 원하는 느낌을 만들 수 있다. 셋팅하는게 조금 번거럽긴 하지만, 그다지 문제될 정도는 아니다.

  • 손목 트위스트 설정

     

  • 팔목 플립을 최소화하기 위해서 보조 포인트를 추가하여 완화시킬수 있음

이 방법은 재철씨가 알려준 꿀팁입니다.

황군 사이트 참조 - http://hwanggoon.tistory.com/153


 

 

 

4. 팔꿈치와 무릎


  • 팔꿈치와 무릎은 두께가 두꺼워서 중간본의 역할도 있지만, 본의 위치도 중요한 역할을 하게 된다.

    A는 굽힐수록 뾰족해지는 팔꿈치에 어울리는 셋팅이고, B는 굽힐수록 뭉툭해지는 무릎에 어울리는 셋팅이다. C는 중간본을 활용하여 팔꿈치의 느낌을 더욱 강화한 셋팅이다.

  • 쐐기골 무릎 형태 만들기

  • 다리를 들어올릴 때 바이패드로만 셋팅하면 허벅지와 무릎이 쪼그라드는 문제가 있다. 이런 형태를 완화시킬수 있는 셋팅법 에 대해서 알아보자.

  • 보조 본의 위치를 잡아줄 포인트 더미를 만들어 아래와 같이 셋팅한다.

    Point는 발목을 LookAt으로 바라보고 업 노드는 허벅지와 축 정렬되어 있다. 이 상태에서 무릎이 구부러지는 상황에서 각도가 증가하게 된다. Point의 부모 오브젝트는 바이패드 허벅지이기 때문에 파란색과 허벅지 사이의 각도가 Local 회전 값이다.

     

  • 허벅지 본 셋팅이 중요하다.

    허벅지 보조본의 컨트롤러는 Orientation Constraint Controller가 적용되어 있는데 PointWorld가 타깃으로 지정되어 있다. World를 타깃에 포함시킨 이유는 바이패드의 움직임에 Bone01이 반응하는 정도를 조절하기 위함이다. PointWeight 값을 감소시키면 바이패드의 움직임에 의해서 Bone01이 조금 회전하게된다.

    가장 중요한 설정은 Transform Rule 그룹에서 ‘Local -> Local’ 옵션이다. Orientation Constraint가 로컬 방식으로 작동해야만 Point의 로컬 회전 값이 Bone01의 로컬회전으로 반영하기 때문이다. 만약에 ‘World -> World’ 기준으로 했다면 Point와 상관 없이 Point11의 방향과 상관없이 Point의 방향을 그대로 따라갔을 것이다.

     

  • !!중간에 빠진 내용이 있다!! -- Up 본의 부모는 바로 Thigh 바이패드 본이 아닌 Thigh의 보조 헬퍼본이 부모가 되어주고, 보조 헬퍼본은 원본 바이패드와 Y정반대 축으로 설정해 줘야 무릎을 올릴때 반대축으로 Up본이 올라간다~ 

        원래 허벅지의 축    <-->    허벅지 보조 헬퍼의 축 반대로 : 이부분이 Up본의 부모가 된다.



  • 무릎 연골 셋팅

    허벅지를 따라가는 Point01과 종아리를 따라가는 Point02를 만들고 허벅지와 종아리의 중간에 무릎 관절을 만들어 두 포인트의 중간 값을 따라가도록 설정한다.

    포지션과 로테이션 둘다

 

 

 

 

 

 

 

5. 겨드랑이


  • 겨드랑이는 리깅의 난이도는 낮아도 스키닝의 난이도가 높은 부위이다. 난이도가 높은 이유는 겨드랑이에 영향을 주는 다양한 본들이 모여있기 때문인데 쇄골, 가슴, 척추, 상박등이 겨드랑이에 영향을 주는 본들이다. 근육질의 캐릭터라면 활배근 본과도 관련된다.

 

 

 

6. 트위스트 플립 현상의 해결


 

  • 난플립 셋팅을 하기 위한 본과 더미 구조

    이제부터 노드를 어떻게 활용하느냐에 의해 플립 현상을 완화시킬 수 있다.

    셋팅하면서 중요하게 여길 부분은 누가 누구의 자식이냐 보다 누가 누구를 바라보면서 업노드 축은 어디를 향하고 있느냐를 유심히 봐야 한다.

    Bone01은 루트본이라 생각하고, Bone01의 보조더미라 할 수 잇는 Point02Bone02의 보조더미인 Point01을 바라보도록 설정하고, 업노드 축은 Bone01을 따라가도록 설정한다.

    Bone02는 자체적으로 움직이는 관절이 아닌 마지막 자식 관절에 의해 움직임이 결정되는 본이라 Point03의 움직임에 의해 움직여지는 관절이다.


 

 

 

 

 

 

 

 

 

 

-> Point02의 설정

먼저 Point02Point01을 같은 길이만큼 배치해 준다. 그리고 Point02Point01을 바라보도록 셋팅한다. 그리고 Bone01의 업노드를 따라가도록 해서 축 정렬을 해준다.

Point02는 루트본의 보조역할을 하면서 하위 본을 바라보는 역할을 한다. 따라서 업노드는 루트 본을 따르고 룩 앳은 하위 관절을 보조 더미를 바라보도록 설정한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

-> bone02의 구조

Bone02를 제어할 Point03을 적절한 위치에 설치하고, Bone02Point03을 바라보게 설정하고, 업노드는 Point02와 축정렬을 이루도록 설정한다.

Bone02는 하위 더미를 바라봄과 동시에 업노드는 자신의 보조 더미를 바라보도록 설정하여 축이 뒤틀어 지지 않도록 설정한다.

이 설정이 트위스트 플립을 일으키지 않도록 하는 가장 중요한 원리라 할 수 있다.

 

 

 

 

 

 


 

 

 

 

-> Point04의 구조

 

Point04Bone02의 보조더미 역할을 해준다. Point01Bone02의 자식으로 연결될Bone02와 함수 가 없기에 보조 역할을 해주는 더미가 된다. Point01Bone02에 연결되면 논리적인 무한 루프에 빠지게 되므로 자체적으로 링크가 되지 않도록 설정된다.

이제 숨겨졌던 실린더 오브젝트를 꺼낸후 Point03 오브젝트를 이리저리 움직여보면 Bone02의 트위스트 특성이 매우 훌륭하게 반응한다는 것을 알 수 있다.

 

 

 

 

 

 

 

 

 

 

7. 어깨 본 구조


  • 어깨에는 트위스트 본과 삼각근 본이 추가로 필요하다. 삼각근과 어깨 관절은 매우 자유로와서 180도 이상 각도로 회전하기 때문에 캔디 랩 현상을 막아줄 중간 본이 필요하고 이 중간 본을 삼각근본이라고 부른다.

  • 아래 그림이 간단한 형태의 삼각근 본과 어깨 트위스트 본의 샘플이다. 포인트 헬퍼에 의해서 삼각근의 특징과(Point01) 트위스트의 기본 특징을(Point03) 구현하고 있다. 그리고 빨간색 삼각근 본과 노란색 트위스트 본은 헬퍼와 Bip02 L UpperArmOrientation Constrant로 참조하고 있다.

  • Point01Point02LookAt Contraint로 바라보면서 업노드 컨트롤은 Bip02 L Clavicle 오브젝트를 기준으로 하고 있다.

  • Point02는 상박과 링크해 준다.

  • Point03은 실제적으로 트위스트 역할을 해주는 본으로서 LookAt을 사용하여 팔꿈치를 바라도록 설정하고 업노드는 Point01로 연결한다.

  • Point03만으로 트위스트를 주기엔 한계가 있어 Box02, Box03을 트위스트 추가본으로 사용하여 Point03과 상박을 Orientation으로 적절하게 트위스팅 되도록 설정해 준다.

  • Box01은 삼각근을 표현하기 위한 추가 본으로서 Point01과 상박에 맞춰 적절히 움직이도록 Orientation으로 연결해 준다.

  • 삼각근 본을 활용하여 어깨 갑주등을 링크 걸어 사용하는데 용이하다.

 

 

 


 

 

 

 

 


반응형
반응형

제2강 - Expression 과 Script


*Expression

 

1. Expression?

- 수학적 표현을 통해서 오브젝트의 파라미터나 애니메이션을 컨트롤하는 방법이다.

- 수학을 써야 한다니 겁을 먹을수도 있지만, 일반적인 수준에서의 캐릭터 셋업은 상식적 산수만 알아도 Expression Controller의 강력한 기능을 사용하는 데에는 큰 문제 없다.

- Scrpit Controller와 상대적으로 비슷하지만, 기능은 더 적다. 하지만, 속도가 빠르다는 장점때문에 많이 이용된다.

 

2. 변수와 상수   

- 예약 변수

1) T : ticks, 맥스에서 시간은 1초에 4800틱의 해상도를 가지고 있다. , 초당 1/4800 만큼의 정밀도로 시간이 계산된다. 1초가 30프레임으로 되어 있는데 1프레임안에 160틱이 들어있는 셈이다. 그렇기에 T값을 160으로 나누면 F와 같아진다.

2) F : frames, 타임 슬라이더의 프레임 숫자를 의미한다.

3) S : secs,초 단위의 실제 시간을 의미한다. 3ds max의 디폴트 세팅에서 1초는 30프레임이므로 30프레임의 위치에서는 S 1의 값을 가지게 된다.

4) NT : normalize time, 해당 오브젝트의 애니메이션 전체 구간을 1이라고 가정했을 때 현재 시간을 의미한다. 예를 들어 애니메이션 전체 구간이 300프레임 일 때 현재 프레임이 150프레임이라면 NT 0.5값을 가지게 된다.

- 예약 상수

1) Pi : 3.14159의 값을 가지는 상수이다. ㅠ 라는 기호로 표시되고 파이라고 읽는다. 파이는 지름이 1인 원의 둘레 길이이다. 그렇기 때문에 원의 둘레를 구하는 공식이 2r이 된다. 파이와 원의 둘레를 구하는 공식은 자동차 바퀴가 굴러가는 등 둥근 물체가 자동으로 정확하게 회전하는 리깅을 위해서 꼭 필요한 공식이므로 매우 중요하다.

2) E : 2.71828의 값이고 자연로그의 밑이 되는 자연상수이다. 미분이나 적분 계산에 매우 자주 사용되는 상수이며 자연에서 발견되는 다양한 성장, 감소현상의 계산에 사용된다.

3) TPS : 4800의 값을 가지는 상수이다. 3ds max 1초에 4 8백번의 틱을 생성하는데 내부적으로 애니메이션을 계산하는 가장 기본 단위가 된다.

- 스칼라 변수와 벡터 변수의 개념 깨우치기

X y 좌표에 (2,3)에 표시될 때 2 3은 각각 스칼라이지만, 그래프상 (2,3)은 벡터이다.

크기만 있고 방향이 없을 때 스칼라라고 표기하고, 크기와 방향을 모두 가지고 있을 때 벡터라고 표기한다.

  • Tick Offset : 특정 오브젝트에 시간차를 두고 오브젝트가 따라다니게끔 설정하는 기능. 예를 들어 게임의 검기가 Tick Offset기능을 활용하여 제작이 가능하다.

 

3. 연산자

- 더하기, 빼기, 곱하기, 나누기를 연산자라고 한다. 하지만 Expression에는 이외에도 다양한 연산자가 존재한다. 공식 레퍼런스를 참조해서 연산자의 종류를 분류해보면 다음과 같다.

1) 스칼라 산술 연산자

연산자

예제

설명

+

P + q

더하기

-

P ? q

빼기

-

-p

마이너스 부호

*

P * q

곱하기

/

P / q

나누기

^

P ^ q

P q제곱

**

P ** q

P q제곱, ^연산자와 같음

 

2) 벡터 컴포넌트 연산자

예제

설명

V.x

벡터의 첫 번째 컴포넌트(X)

V.y

벡터의 첫 번째 컴포넌트(Y)

V.z

벡터의 첫 번째 컴포넌트(Z)

 

3) 스칼라 관계 연산자와 논리 연산자

연산자

예제

설명

=

P = q

P q는 같음.

P < q

P q보다 작다.

P > q

P q보다 크다.

<=

P <= q

P q보다 작거나 같다.

>=

P >= q

P q보다 크거나 같다.

|

P | q

논리 OR로서 pq 둘중에 하나라도 0이 아니면 1인된다.

&

P & q

논리 AND로서 pq 둘다 동시에 0이 아니면 1인된다.


 

4) 벡터 산술 연산자

연산자

예제

설명

+

V + W

벡터 더하기

-

V ? W

벡터 빼기

*

P * V

벡터에 스칼라 곱하기

*

V * P

벡터에 스칼라 곱하기

*

V * W

벡터의 내적 연산

X

V x W

벡터의 외적 연산

/

V / p

벡터에 스칼라 나누기


            V W는 벡터이고, p는 스칼라 즉, 숫자이다.         

            위 도표에서 모든 연산의 결과는 다시 벡터가 된다. , V+W를 연산한 결과 역시 벡터라는 뜻이다. 하지만 벡터의 내적 연산만 결과가 스칼라가 된다.

 

        5) 연산의 우선 순위

            R * 0.5 + B + 0.5 (R * 0.5) + (B * 0.5)에서 처럼 괄호로 연산 순서를 묶어주지 않더라도 연산의 우선순위가 정해져 있기 때문에 덧셈을 가장 마지막에 연산하게 된다.

            Expression에서 사용되는 연산의 우선순위는 다음의 도표를 참조하도록 하자.

연산자

우선 순위 설명

-+

예를 들어 -8이나 +25에서 처럼 양수와 음수를 뜻하는 기호

.

벡터의 컴포넌트 연산, 예를 들어 V.x

**^

제곱 연산

X

벡터의 외적(cross)연산

*/

곱셈과 나눗셈

+-

덧셈과 뺄셈

=<> <= >=

관계 연산자

|&

논리 연산자

 

 

4. 벡터의 내적과 외적

    1) 내적 ? 공간상의 각도를 계산하기 위해 사용되는 기능.

    A B 두 개의 벡터가 있을 때 내적을 이용해서 각도를 계산하는 공식은 다음과 같다.

    Acos(unit(A) + unit(B))

    이 공식을 Max Script로 표현하면 acos(dot mormalize(A) normalize(B)) 두 경우 모두 계산 결과는 각도 단위로 계산된다.


    2) 외적 ? 특정 평면의 수직 벡터를 계산하는데 자주 사용. B벡터R벡터가 있을 때 B * R 연산을 한 결과가 W이다. 여기서 W B와도 직각이고 R과도 직각이다. 외적 연산은 이러한 특징에 의해서     평면의 노말(Normal) 방향을 알아내는데 사용되기도 한다.

 

 

5. 함수 응용하기

    -일반적으로 함수를 y = f(x)라는 식으로 표현하는데 빵 제조기에 이런 표현을 적용해 보면 빵 = 빵제조기(밀가루)라고 표현할 수 있다.

    Max 함수는 두 숫자를 입력받아서 둘중에 큰 숫자를 출력하는 함수이고 y = max(a,b)라는 식으로 표현할 수 있다. Max 함수에 의해 a b를 비교하고 더 큰 값이 y에 전달된다

    

    1) 삼각 함수

  • 주로 원운동을 하는 경우에 어김없이 등장한다. 예를 들어 삼각 함수를 통해서 피스톤의 왕복 운동을 애니메이션 할 때 피스톤의 크랭크축의 각도라든지 거리를 계산할 수 있다. 지수함수는 그래프의 특성상 천천히 감속하거나 가속하는 특성을 표현할 수 있다.

  • 삼각함수에 아크(arc)가 붙으면 역삼각함수(Inverse Trigonometric Function)이 된다. 역함수의 대표적인 예는 제곱근이다. 3을 제곱하면 9이고 9를 제곱근하면 3이 된다. 역삼각함수 역시 같은 개념이다. Sin(90) = 1이고 asic(1) = 90 이다.

  • Acos(x), asin(x), atan(x), cos(x), cosh(x), sin(x), sinh(x),tan(x), tanh(x) Expression에서 지원하는 9가지 삼각함수이다.

    

    2) 지수 함수, 로그, 자연로그

  • Y = exp(x) 함수는 지수 함수(Exponential Function)이다.  Y=log(x)함수는 로그함수이고, y = ln(x)는 자연로그 함수이다.

     

        

        3) 라디안과 각도 변환 함수 

      • 3dx max에서 pi3.141592.. 의 값을 가지는 상수인데 이 값이 라디안 개념으로는 180도 각도에 해당된다. 다시 말해서 360도 각도는 라디안 단위로는 6.28319..에 해당된다. 라디안과 각도는 이처럼 각도를 표시하는 단위의 차이이기 때문에 마치 인치와 센티미터으 차이와도 비슷하다.

      • 라디안을 각도로 변환해 주는 함수는 radToDeg()이다. 예를 들어 radToDeg(pi)라는 Expression 180을 리턴한다. 반대로 degToRad()함수는 각도를 라디안으로 변환해 주는 함수이다.  degToRad(180) 3.14159 값을 리턴한다.

         

            

            4) 소수점 올림과 버림 함수

        • Ceil() 함수와 floor()함수는 입력된 숫자에 대해서 무조건 소수점 이하 자리가 사라진다. 예를 들어 버림 함수인 floor에 대해서 floor(1.3)이라고 하면 0.3이 사라지고 1.0의 값이 리턴된다. Ceil() 함수는 천장을 의미하는 올림함수, floor()함수는 바닥을 의미하는 내림함수이다.

            

            5) 일반적인 함수

        • Pow는 제곱함수이다. Pow(p ,q) p^q와 동일한 결과가 된다. Pow(2,3) 8이다.

          Maxscript에서는 pow 2 3 이라고 쓴다. Expression maxscrpit에서 다소 결과값이 다르게 나오는데, 이유는 Expression은 부동소수(float) 연산을 하지만, Max Script는 입력되는 값에 의해서 정수(integer)연산을 할 수도 있다는 점을 조심해야 한다.

        • Sqrt(p)

          sqrt함수는 제곱근 함수이고 square root라는 뜻이다. Sqrt(9)를 연산하면 3이 반환된다. 이 함수는 Max Script Expression에서 동일한 사용이 가능하다.

        • abs(p)

         abs함수는 절대값이라고 부른다. P에 입력된 값이 양수이면 그대로 p를 반환하지만 음수인 경우에는 p를 양수로 변환한 뒤 변환(return)한다. abs(8) abs(-8)은 둘다 8을 리턴한다.

        • min(p,q) , max(p,q)

          min함수와 max 함수는 함수 이름에서 역할을 쉽게 짐작할 수 있다. Min은 최솟값이고 max는 최대값이다. 예를 들어 min(3,4) 3을 리턴하고 max(3,4) 4를 리턴한다.

          Max Script에서는 amin , amax 라는 함수가 유사한 기능을 한다.

          myMin1 = amin # (5,1,4,2,8)

          myMin2 = amin 5 1 4 2 8

        • mod(p ,q)

         이 함수는 p q로 나눈 나머지 값을 리턴하는 함수이다.

        P

        Q

        Mod(p, q)

        설명

        13

        1

        0

        13 / 1 =13,나머지 0

        13

        2

        1

        13 / 2 =6,나머지 1

        13

        3

        1

        13 / 3 =4,나머지 1

        13

        4

        1

        13 / 4 =3,나머지 1

        13

        5

        3

        13 / 5 =2,나머지 3

        13

        6

        1

        13 / 6 =2,나머지 1

        13

        7

        6

        13 / 7 =1,나머지 6

        13

        8

        5

        13 / 8 =1,나머지 5

         

         

           

              6) 조건 함수 

            • If 함수

              If(p ,q, r)을 풀어서 이야기 하면 p를 검사해서 맞으면 q이고 틀리면 r이다. 라고 이해하면 된다.

            • 논리 연산자

              P | q : 논리 OR로서 p q 둘중에 하나라도 0이 아니면 1이 된다.

              P & q : 논리 AND로서, p q 둘 다 동시에 0이 아니면 1이 된다.

              논리 OR은 한글 표현으로는 논리 합이라고 부른다. 그리고 논리 AND논리 곱이라고 부른다. 다시 풀어서 쓰자면..

              P | q : p q 둘중에 하나라도 참(true)이면 1이 된다. - OR

              P&q : p q 둘다 참(true)이면 1이 된다. ? AND

            • vif 함수

              이 함수의 사용법은 vif(c, v1, v2)이다. If 함수와 매우 유사한 함수로서 c가 참이면 V1이 결정되고 거짓이면 V2로 결정된다. 이 때 V1 V2에는 벡터가 사용된다는 점이 if 함수와의 결정적인 차이점이다.

               

               

                  7) 벡터 함수 

                • Length(v)

                  Length함수는 벡터의 길이를 리턴하는 함수 인데 원점으로부터 해당 오브젝트까지의 길이(length)를 리턴한다. 리턴되는 값은 벡터가 아니라 스칼라(숫자)라는 점을 조심해야 한다. Length([10,0,0])의 값은 Length([10,0,0])이 되고, length([10, 10, 0])의 결과는 14.1421이 된다. X , y의 위치의 대각선 길이 값을 구하게 된다. 그런데 이 함수는 무조건 월드 중심으로 계산하기 때문에 활용 범위가 그다지 많지는 않다. 하지만 이런경우에 length(오른손 위치 ? 왼손 위치)를 해주면 오른손과 왼손의 길이를 알 수 있다. 벡터의 뺄셈에 의해서 두 오브젝트의 거리에 해당하는 새로운 벡터를 만드는 것.

                • Comp(V , i)

                  컴포넌트 함수는 V 벡터의 i번째 컴포넌트를 리턴한다. I 0이나 1, 그리고 2의 값을 입력받는다. 예를 들어서 A라는 벡터 변수에 [10,20,30]이라는 값이 들어 있다고 할 때, comp(A , 0) 이라고 연산을 하면 10의 값이 리턴된다. Comp(A , 1)이라고 연산을 하면 20의 값이 리턴된다. Comp(A , 2)이라고 연산을 하면 30의 값이 리턴된다.

                • Unit(V)

                  벡터 V의 방향은 유지한 채 길이가 1인 벡터를 리턴한다. 다시 말해서, 벡터의 길이를 1로 변경해 주는 함수인 것이다. 이 녀석은 말로 설명이 잘 안되니, 개념을 잡자_049.Max 파일을 참조하길 바란다.(동영상 개념을 잡자_동영상_014.wmv)
                   

                 


                **Max Script**

                1. 스크립트 리스너

                - 간단한 Script 구문을 실행하고 리턴되는 값을 모니터링 하는 기능

                - Print format 등 출력에 관계되는 함수를 사용할 때 출력될 스트림을 지정하지 않으면 Script Listener로 출력된다.

                - 디버깅 툴

                   


                   2. as 

                    - 형 변환을 시켜주는 코드

                    - Ex> 1.4 as integer -> 1   ,   3 as float -> 3.0    ,   $.pos as string -> “(12,15,0)”

                    - 데이터 형 변환 외에도 컬렉션 타입 변환에도 사용된다. 예를 들어 a = geometry as array 라는, Script geometry라는 오브젝트 셋 컬렉션을 배열 형태의 컬렉션으로 변환시켜 준다.

                       


                      3. 매크로 스크립트

                       - 이 기능을 통해서 키보드 단축키, 툴 바, 쿼드 메뉴, 일반 메뉴 등에 등록해서 편하게 사용할 수 있다.

                      - 스크립트 레퍼런스 문서 어떻게 읽는가?

                      문자

                      영문 표기

                      한글 표기

                      의미

                      […]

                      Bracket

                      대 괄호

                      선택적, 사용해도 되고 안해도 됨

                      {…}

                      Brace

                      중 괄호

                      사용하지 않거나 여러 번 사용 가능

                      {…}+

                      Brace +

                      중 괄호 +

                      최소 한번 이상, 여러 번 사용 가능

                      ( )

                      Parenthesis

                      둥근 괄호

                      묶어주는 기능

                      <rule></rule>

                      Angile Bracket

                      꺽쇠 괄호

                      규칙, 예를 들어<string></string>은 문자열을 의미

                      |

                      Vertical Bar

                      수직선

                      수직선으로 분리된 아이템중 하나를 선택

                       

                      - MacroScript BoxTest category : “My Category” tooltip : “Default Box” (box () )

                      라고 리스너에서 실행하면 Default Box라는 이름의 Macro Script가 등록된다.

                      - Macro Script의 문법

                      • Name : macro Script를 정의할 때 구분짓는 이름이다. 일반적으로 함수나 롤아웃 등을 정의할 때 함수나 롤아웃의 이름은 변수의 속성을 가지고 있어 롤아웃 외부에서 내부로접근이 용이하다.

                      • Category : customize user interface 창에서 구분되는 카테고리의 이름이다.

                      • ButtonText : 버튼에 표시될 텍스트이다.

                      • Icon : 버튼에 표시될 아이콘이다.

                      • Tooltip : 버튼의 툴팁이다. Customize User Interface 창에서 이 이름으로 보여지게 된다.


                       

                           4. 예약어

                           

                            - Max Script에는 특수한 기능을 하는 명령어들이 미리 만들어져 있는데 이것을 예약어라고 한다.

                            - 예약어는 크게 3종류로 나눌 수 있다.

                            • Language Reserved Keywords (Script 언어를 구성하는 예약어)

                            • Punctuation and Symbols (구분과 기호)

                            • Reserved Global Variables (글로벌 예약 변수들)


                             

                                 5. 변수(variable)

                                 

                                  - 말 그대로 변할 수 있는 수이다. 다음문구를 예로 들어보자.

                                  - “오늘 바람이 유난히 많이 부는군요. 세계 기록 수립에는 바람이 변수 입니다.”

                                  • 경기장에 부는 맞바람이 초속 0~10m 사이, 맞바람이 초속 1m가 강해질 때마다 선수들의 100m 달리기 기록이 0.01초씩 늦어진다고 가정했을 때 의 공식

                                  • (달리기 기록) = (선수 최고 기록) + (wind * 0.1)


                                  - 이름(Names)

                                    • 첫 문자는 영어 알파벳과 “_” 문자로 시작되어야 한다.

                                    • 두 번째 이후 문자에는 영어 알파벳과 “_” 문자와 숫자를 사용할 수 있다.

                                    • 영어 알파벳은 대소문자 구분을 하지 않는다.

                                    • 잘못 사용된 예 

                                              1) 1objet : 첫 문자가 영어가 아님

                                                2) Pressed? : 특수문자 ?가 사용되었음.

                                                3) a big number : 이름에는 공백을 사용할 수 없음     

                                     4) seven(7) : “(“ 등의 문자를 사용할 수 없음;.

                                   

                                    - 변수의 종류 

                                                1) 일반 변수 : a = “hello” , a = 1 , a = [10,20,30]  등등..

                                     2) 배열 변수 : 배열의 개념을 설명하기 위해 지하실 락커를 예를 들어보자.

                                     1번락커에 가방, 2번락커에 도시락, 3번락커에 우산, 4번 락커에 신발을 넣었다. 락커[1]은 가방, 락커[2]는 도시락, 락커[3]은 우산, 락커[4]는 신발이 되었다.

                                             락커.count 4가 된다.

                                             비워라 락커 명령은 전체 락커를 비우게 된다.

                                             비워라 락커[3] 명령은 3번의 우산만 비우는 명령이 된다.

                                     Append 락커 코끼리 라고 치면 코끼리가 들어있는 락커 하나가 뒤에 추가된다.

                                     

                                                            2-1) 배열의 사용

                                     

                                      380P~382P를 집중적으로 읽으며 이해하자. tempPos 를 이용한 배열변수 사용.


                                     

                                         

                                        6. 구조체(Structure) 

                                          • Show $.material 이라고 치면 material 의 다양한 프로퍼티들이 나온다. 그중에 디퓨즈맵이 있는데 show $.material.diffusemap 이라고 치면 디퓨즈맵에 대한 프로퍼티를 볼 수 잇다.  이처럼 특정 오브젝트를 정의하는 수 많은 특징들을 계층 구조 형태로 구성한 것을 클래스라고 부른다. 실제로 클래스는 단순히 프로퍼티 뿐 아니라 해당 오브젝트와 관련된 함수도 포함되는 개념이다. 383~385페이지를 정독하기!!

                                           

                                           

                                             

                                            7. 기준 좌표계와 Max Script 

                                              Script

                                              설명

                                              $.pos

                                              선택된 오브젝트의 월드 포지션이 리턴된다.

                                              $.transform.pos

                                              선택된 오브젝트의 월드 포지션이 리턴된다. 바이패드 오브젝트에도 사용할 수 있다.

                                              $.transform.controller.Position

                                              선택된 오브젝트의 로컬 포지션이 리턴된다.

                                              • Max Script에서 바이패드의 로컬 트랜스폼을 ExposeTransform 헬퍼의 도움 없이 알아내기 위해서는 matrix3라는 행렬 데이터를 사용해야 한다.

                                              • Matrix3라는 행렬 데이터는 오브젝트의 위치, 회전, 스케일 정보를 모두 가지고 있는 데이터 형태이다.

                                              • 부모 역할을 P 오브젝트(parent)가 있고, 자식 역할을 하는 C 오브젝트(Child)가 있을 때 C의 로컬 트랜스폼을 알아내는 공식은 다음과 같다.

                                                C의 로컬 트랜스폼 = $C.transform * (inverse $P.transform)

                                                월드 좌표(월드로 부터의 거리)와 로컬 좌표(부모로부터의 거리)에 대해서 확실히 알고 넘어가자!!

                                                 

                                                 

                                                8. 데이터 형(Data type) 

                                                  - 숫자(Number Values)

                                                  Number 형은 우리가 익히 알고 있는 숫자 형태이다.  기본적인 사칙 연산과 제곱 연산이 ‘^’ 연산이 가능하다.

                                                   

                                                              1) Integer : 소수점이 없는 정수형

                                                           2) Float : 소수점으로 표현되는 부동소수형

                                                   

                                                  - 문자열(String Values)

                                                  • 문자 형태의 데이터. Messagebox 1은 에러나지만, messagebox “1”은 정상 출력된다.

                                                    1 as string -> “1”

                                                    1 as integer -> 1

                                                  ​- Point3 , Point2 Vales


                                                  Point3 x,y,z 세 개의 축으로 표현되는 3차원 공간의 한 점을 의미한다. 그리고 point2 x,y 두 개의 축으로 표현되는 2차원 공간의 한 점을 의미한다. 예를 들어 $.pos 등에 의해서 리턴되는 포지션 값이 Point3 데이터이다.

                                                  Point3 데이터의 특이한 점은 Color 데이터 형과 형 변환이 된다는 점이다.

                                                  (color 255 0 0) as point3 [255, 0 ,0]으로 리턴된다.


                                                  - Matrix3 Values ? 중요!

                                                  Matrix3 데이터는 리깅을 하기 위해서 필요한 Script 지식의 정점에 있는 데이터 형이다. 벡터나 Point3 데이터는 공간상의 위치만을 표현하는 데이터지만, Matrix3는 위치, 회전, 스케일을 모두 포함하는 데이터이다.

                                                  • 모든 오브젝트의 위치, 회전, 스케일 정보는 Matrix3에 모두 들어있다.

                                                  • 특정 오브젝트의 트랜스폼(Transform) Matrix3를 곱하면 위치, 회전, 스케일을 변경할 수 있다. 이 때 곱하는 앞 뒤 순서가 중요하다.

                                                  • Matrix3 데이터는 오브젝트 자신의 위치, 회전, 스케일을 표현하는데 사용되기도 하지만, 자기 자신의 각도나 위치 등을 다른 오브젝트에 반영하는데 사용되기도 한다.

                                                  • Matrix 연산법 숙지하기(행렬연산)

                                                  - ​행렬 연산

                                                  • 행렬 표기에서 언제나 행이 첫 번째, 그 다음이 열이다.

                                                  • 게임 프로그래머를 위한 기초수학과 물리에서 제5장 행렬연산을 공부할 것!

                                                     

                                                   


                                                   

                                                     

                                                    9. 쿼터니언과 오일러

                                                     

                                                    쿼터니언과 오일러는 3D 공간에서 물체의 회전 정보를 표시하는 방법이고 서로 장단점을 가지고 있다.

                                                     

                                                    - 오일러

                                                    • 기준 좌표계 

                                                    Script

                                                    기준 좌표계

                                                    바이패드 가능 여부

                                                    읽기

                                                    쓰기

                                                    기타

                                                    $.Position

                                                    World

                                                    X

                                                    O

                                                    O

                                                    $.Pos로 생략 가능

                                                    $.transform.Position

                                                    World

                                                    O

                                                    O

                                                    X

                                                     

                                                    $.tranform.controller.Position

                                                    Local

                                                    X

                                                    O

                                                    O

                                                    사용 권장

                                                    $.Rotation

                                                    World

                                                    X

                                                    O

                                                    O

                                                    값이 뒤집힌다.

                                                    $.transform.Rotation

                                                    World

                                                    O

                                                    O

                                                    X

                                                     

                                                    $.transform.controller.Rotation

                                                    Local

                                                    X

                                                    O

                                                    O

                                                    사용 권장

                                                     

                                                    • 계층구조에 속해 있는 오브젝트를 월드 좌표계 형식으로 회전시켜주는 함수

                                                      Function setWorldEuler obj euler =

                                                      ( var = $B.transform

                                                      $B.transform = (eulerAngles 90 0 0) as matrix3

                                                      $B.pos = var.pos)

                                                      위와 같은 함수를 쓰고 setWorldEuler $B (eulerAngles 90 0 0) 라고 실행하면 계층구조나 이전 방향에 상관없이 월드 좌표계를 기준으로 x축으로 회전된 방향이 된다.


                                                    - 쿼터니언연산과 slerp(Spherical Linear Interpoltion)함수

                                                    쿼터니언은 수학적으로 쉽지 않은 개념이고 관련된 명령어들도 쉽지 않은 것들이 많다. 하지만 리깅을 위해서 쿼터니언과 관련 명령어들을 모두 알고 있을 필요는 없고 몇 가지 필요한 것들만 알고 있으면 된다. 그 중에 가장 핵심적인 명령어가 slerp이다.

                                                    Slerp : 두 개의 쿼터니언 각도의 중간 각도를 계산해주는 명령어이다. 예를 들어서 캐릭터의 팔꿈치나 무릎에 있는 중간 각도의 본을 Script로 제어하기 위해서는 필수적인 명령어이다.

                                                    쿼터니언은 개념적으로 위치 벡터를 이용해서 회전 각도를 표현하는 방식인데 부적절한 쿼터니언 값을 사용해서 slerp 계산을 하게 되면 중간 회전 각도를 계산할 때 가까운 쪽이 아니라 더 먼쪽으로 계산을 하게 된다.

                                                     slerp함수를 제대로 쓰기 위해서는 아래의 함수가 정의 되어야 한다.

                                                    Function MakeClosest quat1 quat2 =

                                                    (     Local dot = quat1.x * quat2.x + quat1.y * quat2.y + quat1.z*quat2.z + quat1.w+quat2.w

                                                    If (dot < 0.0) do (quat2.x = -quat2.x ; quat2.y = -quat2.y ; quat2.z = -quat2.z ; quat2.w = -quat2.w)

                                                    Quat )

                                                    • 쿼터니언은 길이가 1인 공간 벡터 형태로 회전 방향을 표현하게 되는데 모든 방향을 다 표현하면 반지름이 1인 구 형태가 된다. 그리고 slerp함수는 가상의 최단거리에서 정확하게 중간 위치를 알아내게 된다.

                                                       

                                                       

                                                      10. 함수(Function) 

                                                        - ‘함수? ‘특정 기능을 하는 명령어라고 할 수 있다. 예를 들어 abs라는 함수는 절대값을 계산해 주는 함수인데 abs -5를 실행하면 마이너스가 사라지고 절대값(absolute) 5가 리턴된다.

                                                        함수 예제 코드

                                                        fn Factorial n =(  K = 1

                                                                              for i=1 to n do (K=K*i)

                                                                              return K)

                                                        Factorial 10

                                                        결과값은 3628800


                                                        - Return


                                                        함수’를 종료할 때 사용되는데, 많이 생략되어 사용된다.

                                                        종종 예외 상황에 대한 처리로 사용되기도 한다. 예를 들어 Factorial 8.1 이라든지 심지어는 Factorial “가 나 다” 이런식으로 정수 값이 아닌 다른 데이터 형이 입력되면 Factorial 함수는 비정상적인 상황을 맞이하게 된다. 특히 ‘가나다’가 입력된 경우는 파라미터 ‘가나다’가 for 명령어에서 사용되면서 Script 에러가 발생된다.


                                                        - 함수의 문법과 파라미터(Parameter)


                                                        함수라는 것 자체가 중요하기도 하지만 공식 Max Script 레퍼런스를 보는 방법도 매우 중요하기 때문에 이 문법이 도대체 어떤 뜻인지 하나씩 자세히 살펴보도록 하자.


                                                        The syntax for <function_def></function_def> is:

                                                        [mapped] ( function | fn) <name> </name>{ <parameter> </parameter>} = <expr> </expr>

                                                        in which <name></name> is the name of the function.    

                                                        The optional sequence of <parameter></parameter> can be one of:

                                                        <name></name>
                                                        <name></name>: [<operand>] --keyword parameter with optional default value  

                                                         

                                                          • [mapped] ? 함수의 파라미터에 objects 라든지 배열 등 컬렉션을 적용할 경우 mapped function… 이런 식으로 함수를 정의해서 사용해 줘야 한다. Mapped는 대괄호 ‘[ ]’로 묶여 있는데 대괄호는 선택적(optional)이라는 뜻이다. 그렇기 때문에 mapped 없이 그냥 function 명령어를 사용해도 무방하다. Mapped는 상당히 전문적인 개념이라서 대충의 의미 정도만 파악하고 있어도 된다.

                                                          • <name>- </name>함수 이름을 뜻한다. Script Controller변수편에서 설명된 이름(Names)의 규칙대로 함수의 이름을 만들어야 한다. 대체로 예약어만 조심한다면 크게 문제 되지 않는다.

                                                          • {<parameter></parameter>} ? 중괄호 ‘{ }’로 표기 되었다. Script 문법에서 중괄호로 표기된 내용은 여러 개 중복해서 사용될 수 있다는 뜻이다. 함수의 내용에 따라서 얼마든지 늘어날 수 있고, 없을 수도 있다.

                                                          • ‘=<expr>’</expr>은 실제 함수 내용에 해당된다.

                                                            Fn Factorial n =

                                                            Fn Factorial n:10 =

                                                            Fn Factorial n: =

                                                          • “:” 콜론없이 사용한 방식이 일반적인 방식이고, 순서 방식의 파라미터이다. 두 번째와 세 번째 방식은 콜론(‘ : ’)을 사용함으로써 키워드 방식의 파라미터가 되었다.


                                                        - 변수의 스코프

                                                        변수 마다의 활동 영역을 말한다. 즉, A 영역에서 활동하는 변수와 B 영역에서 활동하는 변수의 이름이 같아도 영역이 다르면 서로 다른 변수로 취급된다는 뜻이다. 상황에 따라 로컬 변수로 선언할지 글로벌 변수로 선언할지 잘 선택해야 한다.

                                                        상위 레벨의 스코프에서 생성된 변수는 하위 레벨의 스코프에서 자동으로 인식이 된다.

                                                        • 스코프의 레벨 ? 새로운 스코프가 생성되는 경우들 

                                                                    1) Sript 파일이나 Listner에서 최상위 레벨(Top-level)의 소괄호 ‘(‘ 열기

                                                                  2) 함수 본체(Function body)가 시작될 때

                                                                  3) For 반복문이 시작될 때

                                                          ​4) 유틸리티(utility), 롤아웃(rollout), 우클릭 메뉴, Macro Script 등이 시작되거나 선언될 때

                                                                  5) When 구문이 시작될 때 

                                                        • Lexical Scoping

                                                          Lexical Scoping은 하위 레벨의 스코프에서 local을 명화하게 명시함으로써 동일한 이름의 변수를 하위 레벨 전용으로 사용할 수 있게 해 주는 기능이다.

                                                        • 알고 있어야할 스코프의 개념 

                                                         1) 함수에서 사용된 변수는 로컬 변수이기 때문에 서로 다른 함수간에 변수 이름이 중복되더라도 상관없다.

                                                                 2) 변수가 최초 사용할 때 가급적이면 앞에 local 키워드를 삽입한다.

                                                                 3) 글로벌 변수는 되도록이면 사용을 자제한다.

                                                          

                                                           

                                                          11. Script Controller는 함수(Function)이다.

                                                           

                                                          -Script Controller는 함수와 거의 비슷한 개념이다. 스코프에 의해서 로컬 변수가 사용되는 점이라든지 최종적으로 리턴되는 방식 역시 함수와 동일하다.

                                                           

                                                          - 자세한 내용은 책과 예제를 참조하자! (443P~447P)

                                                           

                                                          반응형
                                                          반응형

                                                           회사 모델러들의 요청으로 모델링 관리를 펴하게 해주는 툴을 제작해 봤습니다.

                                                           

                                                          이 툴에서 사용할 수 있는 기능들 간단 요약

                                                          1. 파일 서치 기능

                                                          2. 맥스파일을 열어보지 않고 고퀄의 프리뷰와 다양한 파일 정보(갯수, 크기, 버텍수등..) 로 미리 확인 가능

                                                          3. 다중 파일을 지정된 폴더에 동시 익스포트 가능

                                                          4. 다중 선택 파일을 지정한 폴더에 자동으로 익스포트 가능

                                                          5. FBX를 맥스로 맥스를 FBX로 변환이 매우 간단함(여러파일 동시에도 가능)

                                                          6. 대규모 파일관리와 여러 프로젝트를 동시에 관리하게 용이함



                                                          * 간단한 기능 설명

                                                          제일 먼저 대표로 사용될 폴더를 지정해 줍니다.

                                                          모델링 라이브러리 SVN 폴더를 지정하시면 됩니다.

                                                           

                                                          (1) 간단한 익스포트

                                                          -단일 파일 익스포트 방식

                                                          익스포트 폴더를 지정하시고 난후 오브젝트를 선택하거나 파일을 선택한후, 혹은 Export나 ExportSelected 버튼을 눌러주시면

                                                          지정한 익스포트 폴더에 바로 익스포트가 진행됩니다.

                                                           

                                                           

                                                           

                                                          ** 익스포트 폴더를 Export Path로 지정하지 않고, 폴더 리스트중에 선택하셔서 지정하실 수도 있습니다.

                                                          Path Clean 버튼을 눌러 Export Path를 초기화 한후 New Folder로 원하시는 폴더를 만들고 폴더를 선택하신 다음 Export 버튼을 누르면 해당 폴더에 익스포트 됩니다.

                                                          --->

                                                           

                                                          -- 다중 익스포트 방식

                                                          파일 리스트에서 익스포트를 원하는 파일들을 모두 선택후 Export Path로 경로를 설정하시면 선택한 파일들 모두 Export가 한방에 진행됩니다.

                                                           

                                                           

                                                           

                                                           

                                                          (2) 간단한 파일 서치와 편리한 프리뷰 기능

                                                          예 -> ART에 사용된 나무 데이터만 추려서 보고 싶을때..

                                                          ART 폴더 지정 -> tree 키워드 입력후 엔터 -> 파일에 대한 정보 출력.

                                                          검색된 파일의 Open, Merge, Export 등이 가능합니다. 

                                                           

                                                           

                                                           (3) 간단한 파일변환 FBX -> MAX   or  MAX -> FBX

                                                          FBX를 MAX로 변환할 파일들을 리스트뷰에서 선택한 후 SAVE 버튼을 누르면 FBX가 있는 폴더에 그대로 MAX 로 저장되면서 파일이 생성됩니다.

                                                           

                                                           

                                                          (4) 맥스에서 씬 배치후 씬 그대로 유니티나 언리얼로 옮겨오기가 간편함

                                                          맥스상에서 터레인과 오브젝트등을 배치한 후 전부 선택한 Export Selected 버튼을 누르면 그대로 각 오브젝트별로 익스포트를 진행해 줍니다.

                                                          FBX  이름은 각 오브젝트 이름으로 지정됩니다.

                                                           

                                                           

                                                          위 과정을 거쳐 익스포트 하시면 Export Path 로 지정한 폴더에 각 이름별로 알아서 FBX 파일이 뽑히게 됩니다.

                                                          그후에 아래 파일들을 유니티로 그대로 임포트해오면 맥스 씬에 있는 그대로 불러와지게 됩니다.  

                                                           

                                                           

                                                           

                                                           

                                                          ModelingLibrary.mse

                                                          반응형
                                                          반응형

                                                          1. 먼저 Newtonsoft.dll 파일을 구해서 원하는 폴더에 넣어 놓습니다. Dll 이 있어야 편하게 파싱이 가능합니다.

                                                          - 처음에 DLL이 없다보니까 텍스트의 라인과 위치까지 세면서 코드를 짜느라 굉장히 애먹었는데, DLL로 파싱하니 굉장히 간단하게 코드가 마무리되었습니다.

                                                          구글에 치시면 금방 찾으실 수 있습니다.

                                                           

                                                          2. 사용될 스크립트 코드에 DLL 을 로드 하는 구문을 넣어 줍니다.

                                                          위 경로에 DLL을 넣고 아래 코드를 넣어주면 DLL을 로드해 옵니다.

                                                           

                                                           

                                                           

                                                          3. JSON이 사용될 부분에서 파싱한다는 코드를 넣어줍니다.

                                                            local data ="" 

                                                            if filePath == undefined then
                                                             return 0

                                                            fs=openFile filePath mode:"r"

                                                            while not eof fs do
                                                            ( 
                                                             jsonString = readline fs
                                                             append data jsonString   ---> 제이슨 스트링을 data 라는 텍스트 어레이 변수에 담으면 제이슨을 읽어옵니다.
                                                            )

                                                            o = JObj.parse data -> 읽어온 제이슨 데이터를 파싱해주는 구문입니다.

                                                           

                                                           

                                                          4. 파싱이 완료되면 아래같은 간단한 코드로 원하는 부분의 텍스트 정보를 읽어오게 됩니다.

                                                             sidelength = ((o.item["gridCells"].item[1].item["sideLength"].value) as integer)
                                                          --> 제이슨 데이터의 GridCells의 첫번째 아이템에서 sidelength의 값을 읽어오라는 코드입니다.




                                                          위 과정을 통해 유니티의 그리드 정보를 json으로 읽어와서 그대로 맥스 스크립트로 옮겨올 수 있었습니다.

                                                           

                                                          test.json

                                                          UnityGridViewer.mse

                                                           

                                                           

                                                          반응형
                                                          반응형

                                                          회사 모델러들이 맥스에서 엔진 버텍스를 바로 보고 싶다는 의견이 있어 혼자서 고민하며 만들어봤습니다.

                                                          여러가지 이유로 엔진과 동일한 수는 얻어 올 수 있지만, 아래와 같은 방법으로 비슷한 수치는 얻어 올 수 있었습니다.

                                                          첨부파일을 받으시면 사용하실 수 있습니다.



                                                          1. 모델링 버텍스가 아닌 언렙 버텍스를 계산하라!

                                                          언렙을 사용하면 한 버텍스에 두개의 UV정보를 가지게 되는 경우가 생기므로 이 때 버텍스가 증가하게 됩니다.

                                                           

                                                           

                                                          따라서 6200개의 버텍스의 모델링이

                                                           

                                                          언렙된 버텍스의 수를 계산하면 8500여개가 됩니다.

                                                           

                                                          따라서 언렙전과 언렙후에 엔진에서는 버텍스수가 달라지게 됩니다.

                                                          스크립트를 사용할 때도 반드시 언렙후에 사용해야 좀더 정확한 수치를 알게 됩니다.

                                                           

                                                           

                                                           

                                                          2. 연속성이 떨어지는 메쉬를 재 연산하라.

                                                          엔진에서 불 연속성의 메시라고 파단될 경우 2배로 곱해져서 버텍스가 연산된다.

                                                          근데 그 기준을 잡기가 매우 애매하다.. 그래서 불연속성이 많이 발생할 것으로 예상되는 아웃라인 쪽의 메시를 한번더 연산했다.

                                                          선택하기가 매우 까다로워 약간의 꼼수를 사용했기 때문에 정확한 갯수는 집계가 어렵다.

                                                          현재는 이 두가지의 버텍스를 카운트 하여 제법 근사치에 가까운 결과를 얻었습니다.

                                                          유니티 9120 - 맥스 6248 = 2872 차이에서

                                                          유니티 9120 - 맥스 스크립트 9086 = 34 개 차이가 남


                                                          위 모델링 외에 5개를 더 테스트해봐도 꾀 만족스러운 결과를 얻었습니다.

                                                          테스트캐릭터   맥스 버텍스 엔진 버텍스 스크립트 사용시
                                                          samuro04  6248 (3000차이) 9120 9086 (40 차이)
                                                          Achilleus  699 (500차이) 1157 1155 (2 차이)
                                                          plane03  822 (700차이) 1568 1422(140 차이)
                                                          agentsmire  711 (400차이) 1162 1160 (2 차이)
                                                          akedb  685 (500차이) 1201 1152(50 차이)
                                                          alfina  783 (400차이) 1179 1203(20 차이)


                                                          하지만, 이 외에도 노멀벡터와 라이팅 등에 의해서 재 연산되는 엔진 버텍스를 정확히 재정의하는것은 무리가 있습니다.

                                                          위 정보에 따른 버텍스는 언리얼과 유니티도 버텍스수가 다릅니다.

                                                          EngineVertexCount.mse

                                                           


                                                           

                                                          반응형

                                                          + Recent posts