posted by cimple 2011. 11. 2. 09:18
모션 캡쳐된 데이터를 Maya Rig 에 Retargeting.

현재 테스트중.

 
posted by cimple 2011. 5. 9. 16:47

특정 캐릭터의 잘 된 스키닝을 다른 캐릭터로 옮겨줄 수 있을까?

이 질문에 대한 한 가지 방법으로, Skin Weight Map 을 사용하는 방법을 소개한다. 이 방법은 Maya 에 있는 Skin>Edit Smooth Skin 안에 있는 Export Skin Weight Maps... 와 Import Skin Weight Maps... 를 사용하는 방법으로, 다음과 같은 케이스일 때 사용할 수 있다.


1. 두 캐릭터의 Joint Hierarchy 구조가 동일하다.

2. 두 캐릭터 메쉬의 UV 맵이 동일하다.


즉, 두 캐릭터의 리깅이 똑같고, 메쉬 구조도 똑같으며, 두 캐릭터의 UV 맵도 동일한 경우. 즉 단지 메쉬를 deform 시켜서 만든 새로운 캐릭터인 경우라면 이 방식을 사용한 Skinning Transfer 가 최적의 성능을 보인다고 할 수 있다.

그렇게 보면 비교적 심한 제약조건이라고 볼 수 있지만, 대신 그만큼 스키닝은 잘 옮겨진다;

리깅이 완료된 여자 캐릭터의 스키닝을 남자 캐릭터로 옮겨 줄 것이다.



1. Export Skin Weight Maps

Step 1)
먼저 여자 캐릭터의 잘 된 스키닝에서 Skin Weight Map 을 뽑아준다. Export Skin Weight Maps... 메뉴를 사용하는데, 옵션 박스를 눌러 옵션을 조절할 수 있다.

여성 캐릭터 mesh 를 선택한 다음 Export Skin Weight Maps...




Alpha 와 Luminance 가 이곳에서 어떻게 적용되는지는 추후에 더 구체적으로...

맵 사이즈를 조절할 수 있는데, 맵 사이즈를 크게 뽑으면 해상도가 높은 만큼 스키닝을 그대로 정확하게 옮겨줄 수 있고 대신 맵 파일의 용량이 커진다. 맵 사이즈가 작아지면 스키닝이 옮겨졌을 때 따라오지 말아야 할 버텍스가 따라오는 등 에러가 발생하기도 한다. 경험상 대략 1024x1024 정도면 무리가 없을 듯 하다.


Step 2)
그럼 Write Map 이라는 창이 뜨는데, 현재 프로젝트 폴더의 sourceimages 폴더 안에 weight map 을 생성하게 된다. 적절한 이름을 넣고 save 를 누르면 저절로 맵을 생성한다.



생성한 다음 폴더 안에 들어가 보면 다음과 같이 Weight Map 파일이 생성되었음을 볼 수 있다.



Weight Map 의 예


그리고 아까 지정한 이름에 .weightMap 이라는 확장자를 가진 파일도 생성된 것을 확인할 수 있는데, 어떤 내용을 가지고 있는지 메모장 등에서 확인해 볼 수 있다.

생성된 .weightMap 파일 (test.weightMap)

.weightMap 의 내용

위 그림과 같이


mesh 이름          조인트 이름        해당 조인트의 weightMap 이미지파일


형태로 이루어져 있음을 볼 수 있다. 이렇게 weightMap 을 export 하는 과정은 종료되었다.



2. Import Skin Weight Maps

Step 1)
Import 하는 방법도 어렵지는 않다. 일단, smoothbind 만 되어 있는 타겟 캐릭터의 메쉬를 선택하고 -> Skin>Edit Skin>Import Skin Weight Maps... 에서 Import 하면 된다.

target 이 되는 캐릭터. 물론 리깅&SmoothBind 까지 되어있어야 한다.



Import Map 창이 뜨면 일단 아무것도 보이지 않는데, 맨 아래 Files of type: 탭을 All Files 로 바꾸어준 다음, 아까 생성했던 .weightMap 파일을 선택해주면 된다.

아까 생성했던 test.weightMap 을 import 하면 된다.

그럼 잠시 현란한 스키닝 기술을 보여주며 마야가 캐릭터를 스키닝하는 것을 볼 수 있다. 이 때 스키닝하는 방식은, 마야 스스로 Paint Skin Weights Tool 을 실행시켜서 자동으로 스키닝을 한다.

이후, 스키닝이 잘 옮겨진 것을 볼 수 있다.


3. 참고사항들

이 방식을 사용하는 데 있어서 몇 가지 참고사항이 있어서 적어본다.

1) 마야 스크립트(MEL, Python script) 로 해당 프로세스를 수행하고 싶을 경우, 타겟이 되는 캐릭터를 'bindSkin' 스크립트를 이용해서 bind 하면 이 skinWeight 명령어를 사용할 수가 없다. 'SmoothBindSkin' 이라는 스크립트를 사용해서 초기 smoothBind 를 해야 한다.

2) 남자 캐릭터의 리깅을 처음부터 다시 하는 것은 낭비가 심하다. 여자 캐릭터의 리깅을 남자 캐릭터에 옮겨줄 때, joint 와 컨트롤러 위치 정도만 바꾸어 주는 것으로 리깅을 그대로 사용할 수 있다. 이 때 조인트나 컨트롤러 상위에 NULL 노드들을 삽입해서 해당 NULL 노드들을 움직여 주는 것으로 리깅을 간편하게 옮겨줄 수 있다.



ThEnd.

posted by cimple 2011. 5. 9. 15:27


1. Nurbs Curve 색깔바꾸기

넙스커브 선택

shape 노드 들어가보기

Object Display

Drawing Overrides

Enable overrides(check)

Color 변경


 

posted by cimple 2010. 10. 1. 17:13

1.  Node Properties 의 중요성

Node 의 initialize() 파트에서 node 의 properties 를 지정해 주는 일은 생각보다 아주 중요하다.

일례로, 제대로 된 노드 구조를 만들어 놓았으나, keyable 이나 storable 등을 잘못 지정해 주면 제대로 노드가 돌아가지 않는 경우가 발생한다.

예를 들어 이번에는 이런 경우를 겪었다.


Custom Node 에서 특정 값을 다른  Node 에 꽂아주는데, output attribute 에서 값이 나간다.
이 값을 좀 보고 싶어서 outputNode 의 property 를 'Keyable' 로 해 두었더니, 값이 초기값인 0 그대로 머물러 있다.

아마도 다른 attribute 들로부터 값을 받아서 값을 내뱉는 역할을 하는 outputValue 는 keyable attribute 가 되면 안 되는 것 같으며, 따라서 keyable 속성은 false 로 해야 한다.

이 외에 중요하다고 생각되는 setHidden 과 setStorable 의 속성값도 바꾸어 보았지만 차이는 없었다.

하지만 안전하게 setHidden 은 true 로, setStorable 은 false 로 해 주는 것이 나을 것 같다.



2. MAYA API 에서 numeric value 를 String 으로 바꾸어주고 싶다면

string 객체를 만들 때, numeric value 를 붙여주어 incremental 하게 이름을 만들어 주고 싶을 때가 있다.

한 가지 방법으로, 다음과 같은 방법이 있다.

MString str("curve");
MString str2;
str2.set((double)i); // i   is incremental
str = str+str2;

이렇게 하면 원하는 string 을 만들어 낼 수 있다.




ThEnd.


(계속 업데이트 예정)
posted by cimple 2010. 3. 18. 15:40

랩 후배가 어느날 물었다.

"형, 커브 그리는데 CV 커브가 좋아요, EP 커브가 좋아요?"

"...그냥 CV 커브 써."



아무 생각 없이 curve 를 그려서 사용하지만, 사실 curve 에 대해서 정확하게 알지 못하고 그냥 대충 만들어서 사용하는 경우가 대부분이다.

그래서 오늘은 이제까지 내가 알고 있는 Maya Curve 에 대한 지식들을 정리해 보고자 한다.



1. Maya Curve 의 구조에 대하여

Maya Curve 는 다음과 같은 구조로 되어 있다.


(curve 를 생성한 뒤 object 모드에서 선택하고, Attribute editor 에서 Component display 의 속성들을 체크해 주면 CV, EP, Hull 등을 볼 수 있다.)


CV : Control Vertex 이다. Maya 는 curve 를 생성할 때 Nurbs curve 방식으로 생성하기 때문에, 하나의 curve 를 생성하기 위해서는 적어도 4개의 point 가 필요하다. 이 point 들을 Control vertex 라고 부른다. 따라서 이 CV 들을 조작함으로써 curve 를 edit 할 수 있는 것이다.

nurbs curve 가 어떤 식으로 생성되는지는 다음의 wikipedia 링크 참고.
http://en.wikipedia.org/wiki/Non-uniform_rational_B-spline


Convex Hull : CV 들을 연결한 선이라고 보면 된다. 4개의 CV로 하나의 Nurbs curve 가 만들어 질 때, 그 Nurbs curve 는 CV들을 연결한 Convex hull 안에 반드시 위치하게 된다.
이 Convex Hull 을 직접 조작하거나 하는 경우는 없지만, Computer Graphics 에서 여러 계산을 할 때 Covex hull 은 꽤나 유용한 의미를 지닌다.


EP : Edit Point 이다. EP 는 curve 위에 놓여지며, curve span, 즉 curve 를 얼마나 나누어 놓았느냐에 따라 갯수와 위치가 정해지게 된다.


예를 들어 위 그림처럼, curve 를 만든 다음 curve span 을 4를 주면, curve 는 4개의 구간으로 나뉘게 되고, 따라서 EP 는 curve 를 4등분하는 각각의 위치에 놓여지게 된다.






따라서 CV curve 로 생성하든, EP 커브로 생성하든 똑같은 Nurbs curve 가 생성되기 때문에 차이는 없다. 단지 커브를 사용하는 목적에 따라서 어떤 방식으로, 또 어떤 기준으로 커브를 생성하는 것이 좀 더 직관적이고 편할 것인가에 대한 차이가 있을 것이다.

(이 포스트는 차후에 지속적으로 업데이트 될 예정입니다.)
(업데이트 목록들)
- construction plane 관련내용
- curve degree
- knot spacing
- curve edit



ThEnd.

posted by cimple 2010. 2. 21. 21:21

Windows 7  에서 Premiere Pro CS3 을 실행시키는데 계속해서 Audio 드라이버 문제가 발생해서 골치가 좀 아팠다.

문제의 원인은 정확하게 알 수는 없었다. 사운드 드라이버를 설치할 때의 문제인 것인지, 좌우지간 증상은 이와 같다.


증상

"The currently installed soundcard driver does not support DirectSound Input. Recording audio is not possible."


이런 에러 메시지가 뜨는데, 이건 에러는 프리미어도 그렇고 After Effect 도 마찬가지이다.

다음과 같이 해결하였다.



해결법

1. 제어판 > 하드웨어 및 소리 > 오디오 장치 관리

2. '녹음' 탭에서 우클릭한 뒤, '사용할 수 없는 장치 표시' 를 체크

3. 그럼 '스테레오 믹스' 가 추가되는데, 이것을 '사용'

컴퓨터에 따라 이 화면은 다를 수 있습니다.


4. 이제 프리미어 / 에펙이 잘 실행되는 것을 볼 수 있다.





해결 방법은 구글에서 검색한 뒤, 다음 링크의 "caixamagica" 의 답변을 통해서 얻을 수 있었다.

구글 만쉐이!



ThEnd.
posted by cimple 2010. 1. 16. 16:46

 

CGAL Open Source Project 의 목적은, 효율적이고 신뢰할 수 있는 Geometric Algorithm 을 C++ 라이브러리 형태로 제공하는 데 있습니다.

 

 

CGAL 의 매뉴얼 형태

 

CGAL 의 Documentation 을 보면 Overview / Online Manual / Tutorials / All Manuals 로 나뉘어져 있습니다.

여기서 Overview 에 들어가면 크게 17개의 Part로 나뉘어져 있고, 각 Part 는 몇 개씩의Chapter 들이 있는데, 각 Chapter 마다 User Manual 과 Reference Manual 로 나뉘어져 있습니다.

User Manual 은 해당 Chapter 의 대략적인 설명과 함께 예제들이 나와 있고, Reference Manual 은 Class 와 Function 에 대한 자세한 설명들이 나와 있습니다.

 

 

 

CGAL 의 Hello World

 

CGAL 의 'Hello World' 라면서 가장 처음에 나오는 예제가 이것입니다.

 

 

뭔가 좀 황당하기도 한데… (그렇다고 CGAL 이 Hello World 를 찍는 것을 첫 번째 예제로 할 수도 없는 일이니)

CGAL 의 첫 입문은 5개 Point 의 Covex Hull 을 구하는 것부터 시작됩니다. 굉장히 간단한 프로그램처럼 보이지만, 생각보다 그렇게 간단하지는 않습니다.

먼저 CGAL의 Exact_predicates_inexact_constructions_kernel 이라는 커널을 K로 정의하고 그 K로부터 Point 2 를 정의합니다.

이 Point2 클래스의 객체 points 라는 녀석도 참 희한합니다. 일단 2D 평면좌표 2개를 가지고 초기화되는 클래스라는 사실은 알겠는데,

일단 convex_hull_2 라는 함수에서 convex hull 을 이루는 점을 반환하는 공간은 result 인데, 이 함수 전체가 리턴하는 값은 Point_2 의 포인터인 ptr 입니다.

Iterator 를 도는 것도, points 에서부터 points+5 를 돌면 points[5] 라는 배열 전체를 한바퀴 돈다고 하는데 이것도 잘 이해가 가지 않고,

ptr-result 를 하면 convex hull 을 이루고 있는 점들의 개수가 나온다는 것도 잘 이해가 가지 않습니다.

result 는 분명 convex hull 을 이루고 있는 점들입니다. result[0], result[1], result[2] 가 바로 convex hull 을 이루는 점들이었거든요.

 

설명을 해 보면 이렇습니다.

 

일단 Exact_predicates_inexact_constructions_kernel 이라는 커널은 실제로 지오메트리를 construct 해 주지는 않지만, 점들의 좌표 정보나 방향 등을 간단하게 알아보는 데 사용되는 커널입니다.

 

convex_hull_2 함수는 3개의 인수를 가지는데, input 의 시작점 포인터와, 마지막 점 바로 다음의 포인터, 그리고 결과물의 첫 포인터 입니다.

배열의 이름은 곧 포인터로 사용되기 때문에, 위의 예제에서 points 는 points[5] 배열의 첫 번째 요소, 즉 points[0] 을 의미하게 되겠고, 그 주소값을 가지고 있을 것입니다.

points[1] 의 주소값은 points+1 과 같습니다. 그러므로 points+5 는 points 배열이 끝나는 points[4] 의 바로 다음 주소지요. 마지막 점 바로 다음의 포인터입니다.

그리고 result 에 convex-hull 을 이루는 점들이 배열 형태로 저장되게 되고, result 는 동시에 그 배열의 첫 번째 요소를 가리키는 포인터입니다.

 

그리고 convex_hull_2 함수는 리턴하는 값이 있는데, convex hull 을 이루는 배열 바로 다음 주소의 포인터를 반환합니다.

따라서 ptr-result 를 하게 되면, ptr 의 주소값이 result 의 첫 번째 요소의 주소값으로부터 얼마나 떨어져 있는가를 알 수 있게 되고, 그로부터 result 의 크기를 알 수 있게 됩니다.

 

저 또한 포인터와 배열의 관계에 대해서 조금 불명확하게 알고 있었기 때문에 (사실 이 부분은 C 문법에 해당합니다) 조금 헷갈리는 부분이 있는데

보충 설명이 필요하다면 미팅 시간에 설명하도록 하겠습니다

 

 

다음은 같은 예제를 STL 을 사용하여 표현하는 방법입니다.

CGAL 의 Point_2 라는 클래스 자료형태를 vector 로 묶었습니다.

 

보시는 바와 같이, STL 로 Points 와 result 라는 벡터를 만듭니다.

그러면 convex_hull_2 함수가 벡터의 begin() 부터 end() 까지 iterator 를 돌면서 convex_hull 을 찾아주고, back_inserter 함수로 result 라는 벡터에 해당 결과들을 밀어 넣습니다.

이 result 의 크기만 측정하면 convex hull 을 이루는 점의 개수를 알 수 있겠죠. 이번에는 굳이 convex_hull_2 함수의 리턴값을 사용할 필요가 없을 것입니다.

 

 

 

마지막으로 유저로부터 입력받은 좌표로부터 convex hull 을 구하는 프로그램입니다.

이번에는 낯선 것이 'iterator' 라는 것을 include 하는군요.

 

 

실행 결과는 정말 신기합니다;;;

 

 

제가 이런 실행 결과를 원하면서 같은 프로그램을 만들었다면 for 문과 if 문의 향연이 되었을텐데, istream_iterator 와 ostream_iterator 로 이렇게 간결하고 멋진 프로그램이 작성이 가능합니다.

(STL 에 놀라고 있을 때가 아니라 CGAL 을 알아봐야 하는건데 이 무슨;;;)

 

 

좌우지간 Hello World 부터 쉽지만은 않습니다.

 

그렇다고 못할 것도 없죠.

 

ThEnd.

posted by cimple 2010. 1. 7. 07:00



CGAL (Computational Geometry Algorithms Library) 은 오픈 소스 기반의 강력한 Geometry Library 입니다. 하지만 조금 복잡한 설치 과정 때문에 설치에 어려움을 겪는 분들이 많은 것 같습니다. 제가 성공했던 설치 과정과 구성을 말씀드리고, 조금이나마 손쉽게 CGAL 을 사용할 수 있도록 하는 바램으로 포스팅을 해 봅니다.



CGAL 라이브러리 설치하기


1. 필요한 파일 다운로드

(1) 먼저 CGAL 을 다운로드 받습니다. 가장 간편한 것은 Windows install 버전을 받는 것입니다.
아래의 링크에서 CGAL 최신 버전의 파일을 받습니다. 제 경우에는 CGAL-3.5.1-Setup.exe 파일을 다운로드 받았습니다.

CGAL 다운로드

(2) Cmake 를 다운로드 받습니다. 역시 Windows install 버전을 받습니다. 제 경우에는 cmake-2.8.0-win32-x86.exe 파일을 다운로드 받았습니다. 아래 링크에서 다운로드 받습니다.

Cmake 다운로드

(3) QT 를 다운로드 받습니다. 아래 링크에서 다운로드 받을 수 있습니다. 제 경우에는 4.6.0 버전입니다.

QT 다운로드

(4) MinGW 를 다운로드 받습니다. 아래 링크에서 다운로드 받을 수 있습니다. 제 경우에는 5.1.6 버전입니다.

MinGW 다운로드

(5) Boost 를 다운로드 받습니다. 아래의 링크에서 Windows install 버전을 다운로드 받습니다.

Boost install version 다운로드


뭐가 이렇게 필요한 게 많어? 라고 생각하실 수도 있습니다. CGAL 을 설치하는 데 번거로운 것이 이러한 다양한 프로그램들을 순서대로 잘 설치하고, 설정을 해 주는 것이 생각보다 까다롭기 때문입니다.

자, 이제 필요한 파일은 모두 다운로드 받았습니다. 이제 본격적으로 설치를 해 보도록 하겠습니다.

설치에 앞서서 한가지 당부 말씀은, 라이브러리 설치에 익숙하지 않으신 분들은 웬만하면 과정을 그대로 따라하시고, 설치 경로명까지 일치시켜 주셨으면 합니다. 설치 경로명이 조금씩 달라지거나, 경로명 안에 한글 혹은 공백이 있으면 오류가 발생하는 경우가 빈번하기 때문입니다.

2. Cmake 인스톨

(1) 다운로드 받은 cmake 파일을 실행시켜서 인스톨을 시작합니다. 인스톨을 진행하다 보면 다음과 같이 인스톨 옵션을 묻는 화면이 나옵니다.


보시는 바와 같이 system PATH 에 cmake 를 등록하는 메뉴를 선택합니다. 그리고 계속 다음> 을 눌러서 cmake 를 설치합니다.

(2) 그리고 나서 환경 변수에 등록을 해야 합니다. 환경 변수에 등록하는 방법은 '내 컴퓨터' 에서 우클릭>'속성' 에 들어갑니다.



다음 '고급' 탭 안에 있는 '환경 변수' 를 클릭합니다.



환경 변수 윈도우를 보면 아래에 '시스템 변수' 메뉴 중에서 PATH 를 찾아서 누르고 '편집' 을 누릅니다.


그럼 이제까지 등록한 변수들이 나오고, 새로운 시스템 변수를 추가할 수 있는 '시스템 편수 편집' 윈도우가 나타납니다. 여기에 환경 변수를 추가해 주면 되는 것입니다. 환경 변수를 추가할 때에는 구분이 되는 세미콜론(;) 을 끝에 붙여 주면 됩니다.



여기에 cmake 의 바이너리 폴더 주소를 환경 변수로 등록해 줍니다. 저 같은 경우에는 C:\Program Files\CMake 2.6\bin 을 추가시켜 주었습니다.


3. Boost 인스톨

Boost 는 설치 과정에 약간 귀찮은 부분들이 있습니다. 아마도 Boost 가 강력하기는 한데, 오랜 시간에 걸쳐 많은 사람들에게 의해 만들어진 라이브러리이다 보니 이러한 과정들이 필요한 것 같습니다.

(1) Boost 의 인스톨 버전을 다운로드 받았으니, 이것을 가지고 설치를 해 줍니다. 설치 과정중에 보면 다음과 같이 설정을 묻는 화면이 나오는데, 자신이 사용할 컴파일러를 선택하고, 나머지는 전부 선택합니다.


다음에 나오는 화면에서, Boost 의 각 콤포넌트들을 설치하는 옵션 선택 화면이 나옵니다. 저 같은 경우에는 아래 그림처럼 모든 옵션에 대해서 VC9.0(Visual Studio 2008) 으로 선택해 주고 설치하였습니다.


그리고 다음의 경로로 install 해 줍니다. 제 경우에는 C:\boost\boost_1_38 입니다.




(2) boost 의 바이너리 폴더를 아까 cmake 에서 했듯이 환경 변수에 등록해줍니다. 제 경우에는 C:\boost\boost_1_38\bin 입니다. 





4. MinGW 인스톨

(1) MinGW 를 인스톨하는 방법은 어렵지 않습니다. 그냥 다운로드 받은 MinGW 설치 파일을 실행시키고, 별다른 옵션 설정 없이 Next 연타로 설치하시면 됩니다.

(2) MinGW 의 바이너리 폴더를 환경 변수에 등록시켜 줍니다. 제 경우에는 C:\MinGW\bin 입니다.


5. QT 인스톨

한가지 말씀드릴 사항이 있습니다! QT 를 인스톨하는 과정은 굉장히 오래 걸립니다. 제 경우에는 5시간(!) 이 소요되었습니다. 따라서 이 작업을 하실 때에는 자리를 오랫동안 비우시거나 잠자러 가기 전에 하실 것을 권합니다.

(1) 다운로드 받았던 QT 설치 파일을 실행시킵니다.

(2) Next 연타를 하다보면 MinGW 와 관련하여 이런 경고메시지가 뜨는 것을 알 수 있습니다. 그러나 위에서 MinGW 를 잘 인스톨 하셨다면 이 경고메시지는 무시해도 상관 없습니다. 그냥 continue 하면 됩니다.




(3) 다음은 Visual Studio Command Prompt 를 실행시킵니다. 제 경우에는 시작>모든 프로그램>Visual Studio 2008>Visual Studio Tools>Visual Studio 명령 프롬프트  로 실행시켰습니다.

(4) Visual Studio 명령 프롬프트를 실행시킨 다음, cd 명령을 이용해서 QT 폴더로 이동합니다.


(5) 다음 configure 를 입력합니다.
그 다음 묻는 것이 버전마다 조금씩 달라질 수는 있는데, 제 경우에는 먼저 Open source 로 이용할 것이라는 의미의 'o' 를 입력한 다음, 라이선스에 동의하는 'y' 를 입력합니다. 이 과정도 약간의 시간이 걸립니다.



(6) 완료되면, 바로 이 과정이 5시간이 넘게 걸리는 과정입니다. 커맨드 라인에 'nmake' 를 입력하고 난 후, 컴퓨터를 떠나가면 됩니다. 저도 자고 오니 완료되어 있더군요.

한숨 자고 오세요




(7) 완료되면, 환경 변수에 QT 의 바이너리 폴더를 등록시켜 줍니다. 제 경우에는 C:\Qt\4.6.0\bin 입니다.

(8) 컴퓨터를 다시 재부팅해 줍니다. 지금 이 포스트를 잠시 메모해 두고 컴퓨터를 껐다 켜셔야겠죠?



6. CGAL 인스톨

(1) 이제야 CGAL 인스톨입니다;;; 다운로드 받았던 CGAL 인스톨 버전을 실행시켜서 인스톨을 시작합니다.

(2) 다음과 같은 설정 화면이 나오면 원하는 버전의 컴파일러를 선택하고, 모두 선택한 다음에 next 를 해 줍니다.


(3) 이번 과정은 매우 중요한 과정입니다. 제가 한번 완전히 CGAL 을 설치하고 소스코드 컴파일까지 성공했음에도 실행파일에 문제가 생기는 이유는 이 과정에서 문제가 있었을 가능성이 큽니다.

CGAL 설치 폴더를 설정하는데, 보통 그림과 같이 Program Files 에 그대로 설치해버리기 쉽습니다. 그런데 CGAL 홈페이지에서도 이 설치경로에 공백이 절대로 들어가지 않아야 한다고 말합니다.

이렇게 설치하면 안됩니다.


그래서 아래와 같은 경로에 설치할 것을 권장합니다. 중요한 것은 경로명에 공백이 포함되어서는 안 된다는 것입니다.

(4) 다음은 Next 연타로 인스톨을 해 줍니다.

(5) 환경 변수에 QT 의 루트 디렉토리를 등록해 줍니다. 제 경우에는 C:\Qt\4.6.0 입니다.

(6) 환경 변수에 Boost 의 루트 디렉토리를 등록해 줍니다. 제 경우에는 C:\boost\boost_1_38_0 입니다.

(7) 시작>실행>cmd 로 명령 프롬프트 창을 띄웁니다. 그리고 cd 명령어를 이용해서 CGAL 폴더로 이동합니다.

(8) cmake-gui . (한칸 띄우고 마침표) 를 입력해서, Cmake gui 를 실행시킵니다.

(9) Cmake 가 실행되면, 왼쪽 아래의 configure 버튼을 눌러서 원하는 버전의 컴파일러를 선택합니다. 저 같은 경우에는 Visual Studio 2008 을 선택했습니다.

(10) 제 경우에는 해당이 없었지만, Cygwin 이 인스톨되어 있는 경우에는 configure 하는 과정에서 GMP 나 MPFR 의 경로를 제대로 찾지 못하는 경우가 있습니다. 이런 경우에는 GMP 탭 안의GMP_INCLUDE_DIR 과 MPFR_INCLUDE_DIR 을 C:\CGAL\CGAL-3.5.1\auxiliary\gmp\include 폴더로 설정해 줍니다. (버전명은 당연히 제가 현재 인스톨한 CGAL 버전이므로, 달라질 수 있습니다.)

(11) CMAKE 탭 안에 있는 CMAKE_BUILD_TYPE 이 Release 로 되어 있다면, 더블클릭해서 Debug 로 고쳐 넣어 줍니다.

(12) WITH 탭 안에 있는 WITH_demos 와 WITH_examples 는 필요하다면 체크해서 함께 컴파일해서 사용할 수 있습니다. 저 같은 경우에는 체크했지만, 빌드 시간을 좀 더 오래 걸리게 하는 주범인 듯 합니다.

(13) Configure 버튼을 Generate 버튼이 활성화 될 때까지 계속해서 눌러 줍니다.

(13-1) 이 부분에서, boost 와 관련한 오류가 발생하는 것을 확인했습니다.
boost 의 라이브러리 폴더를 찾지 못한다고 하면서,

Boost_LIBRARYDIR 과
BOOST_ROOT 를 추가해 보라고 지시하는 것을 확인했습니다.

cmake 에서 '+Add Entry' 버튼을 누른 다음, 이름은 위에서 지시한 대로(Boost_LIBRARYDIR 과 BOOST_ROOT), Type 은 Path, Value 는 해당 경로(저의 경우 Boost_LIBRARYDIR 은 C:\boost\boost_1_38_0\lib, BOOST_ROOT 는 C:\boost\boost_1_38_0 ) 를 찾아 주어서 각각 추가해줍니다.

(13-2) Generate 버튼이 활성화되면 Generate 버튼도 눌러 줍니다.

(14) 성공적으로 빌드되면 솔루션 파일이 C:\CGAL\CGAL-3.5.1 에 생성됩니다.


(15) 솔루션 파일을 열어서 Visual Studio 를 실행시키고, cmake 를 닫습니다.

(16) Visual Studio 가 실행되면, 빌드(Build) 메뉴에서 솔루션 정리(Clean Solution) 를 눌러서 솔루션을 정리하고, 다시 빌드(Build) 메뉴의 솔루션 다시 빌드(Rebuild Solution) 버튼을 눌러서 다시 빌드해 줍니다.

(17) 됐습니다! 이제 CGAL 라이브러리 설치가 완료되었습니다.

만쉐!







환경 변수 설정 확인


제 환경 변수 설정은 다음과 같습니다. (통째로 복사했습니다;)

C:\Program Files\Autodesk\Maya2009\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Autodesk\Backburner\;C:\Program Files\Common Files\Autodesk Shared\;C:\APM_Setup\Server\Apache\bin;C:\APM_Setup\Server\MySQL5\bin;C:\APM_Setup\Server\PHP5;C:\Program Files\CMake 2.6\bin;C:\boost\boost_1_38\bin;C:\MinGW\bin;C:\Qt\4.6.0\bin;C:\CGAL\CGAL-3.5.1\auxiliary\gmp\lib;C:\Qt\4.6.0;C:\boost\boost_1_38;



Visual Studio Project 설정

1. Visual Studio 의 도구>옵션 에서 '프로젝트 및 솔루션' 탭의 'VC++ 디렉터리' 에 들어갑니다.

2.  포함 파일에 다음의 경로들을 추가시켜 줍니다.

C:\boost\boost_1_38
C:\CGAL\CGAL-3.5.1\include
C:\Qt\4.6.0\include
C:\CGAL\CGAL-3.5.1\auxiliary\taucs\include
C:\CGAL\CGAL-3.5.1\auxiliary\gmp\include



3. 라이브러리 파일에 다음의 경로들을 추가시켜 줍니다.

C:\boost\boost_1_38\lib
C:\Qt\4.6.0\lib
C:\CGAL\CGAL-3.5.1\lib
C:\CGAL\CGAL-3.5.1\auxiliary\taucs\lib
C:\CGAL\CGAL-3.5.1\auxiliary\gmp\lib



4. 다음은 개별 프로젝트의 설정입니다. 일단 프로젝트를 생성할 때, 저는 테스트를 위해서 Win32 콘솔 응용 프로젝트 > 빈 프로젝트 로 만들었습니다. 그리고 C++ 파일 하나를 새 항목으로 추가해 줍니다.

5. 프로젝트에서 우클릭으로 '속성' 창을 엽니다.



6. C/C++ > 일반(General) 탭에서 추가 포함 디렉터리(Additional Include Directories) 에서 다음을 추가해줍니다.


C:\Qt\4.6.0\include\QtCore
C:\Qt\4.6.0\include\QtGui
C:\Qt\4.6.0\include
C:\Qt\4.6.0\include\ActiveQt
debug
.
C:\Qt\4.6.0\mkspecs\win32-msvc2008


위에서  debug  나 콤마는 그대로 입력해주면 되고, msvc2008 도 현재 사용하고 있는 Visual Studio 의 버전대로 선택해서 고쳐 주면 됩니다. 그리고 QT 의 디렉토리들은 사용자가 필요한 기능을 include 해서 사용하면 되는 구조로 되어 있으므로, 현재 include 한 것은 초보자들에게 필요한 폴더들입니다.



7. 다음, 링커(Linker)>입력(Input)>추가 종속성(Additional Dependancies) 에서 다음을 추가해 줍니다.


C:\Qt\4.6.0\lib\qtmaind.lib
C:\Qt\4.6.0\lib\QtGuid4.lib
C:\Qt\4.6.0\lib\QtCored4.lib
opengl32.lib


8. 이제 Visual Studio 의 셋팅도 끝났습니다.




TEST


그럼 CGAL 이 잘 돌아가는지 테스트 해 보도록 하겠습니다.

바로 위에서 프로젝트를 만들었다면, 아래의 소스 코드를 복사해서 붙여넣기 해 봅시다.


#include <iostream>
#include <boost/format.hpp>
#include <QtGui>
#include <CGAL/Qt/GraphicsViewNavigation.h>
#include <QLineF>
#include <QRectF>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QGraphicsScene scene;
scene.setSceneRect(0,0, 100, 100);
scene.addRect(QRectF(0,0, 100, 100), QPen(QColor(255,0,0)));
scene.addLine(QLineF(0,0, 100, 100));
scene.addLine(QLineF(0,100, 100, 0));
QGraphicsView* view = new QGraphicsView(&scene);
CGAL::Qt::GraphicsViewNavigation navigation;
view->installEventFilter(&navigation);
view->viewport()->installEventFilter(&navigation);
view->setRenderHint(QPainter::Antialiasing);
view->show();
return app.exec();
}


그리고 나서, 컴파일하고 실행시켜 봅니다. 다음과 같은 창이 뜨면 성공입니다.






까다로운 설치 과정이지만, 그만큼 CGAL 은 훌륭한 기능들을 제공하고 있습니다. 아무쪼록 이 포스팅이 CGAL 설치에 어려움을 겪는 분들에게 조금이나마 도움이 되었으면 하는 바램입니다.

감사합니다.




ThEnd.




posted by cimple 2009. 11. 7. 06:58


squash&stretch 는 애니메이션 10대 법칙중 하나입니다. 디즈니의 카툰풍 애니메이션을 보면, 캐릭터들의 팔, 다리, 얼굴 등등이 무지막지하게 눌렸다가, 쭉쭉 늘어나는 것을 볼 수 있습니다. 캐릭터들의 동작을 더욱 역동적이어 보이게 하고, 오히려 더욱 실재감이 느껴지는 애니메이션을 위한 중요한 요소이지요. 
때문에, 3D 애니메이션에서도 이러한 squash&strech 를 구현할 수 있도록 해 주는 Stretch IK 는 셋업에 있어서 중요한 요소 중의 하나라고 할 수 있습니다.

팔 다리가 이렇게 쭉쭉 늘어나야 재미있겠죠?

그럼 마야에서 어떻게 하면 Strech IK 를 만들 수 있을 것인지, 알아보도록 하겠습니다.

stretch IK 를 위한 준비물들

stretch IK 를 만들기 위해서는 다음과 같은 준비물들이 필요합니다.

1. spline IK
2. arc length
3. multiply divide node

그럼 이러한 준비물들이 필요하다는 사실을 염두에 두고, stretch IK 를 만들어 보도록 하겠습니다.


1. 조인트를 그려줍니다.


일단 조인트를 바닥에 아무렇게나 그려 보도록 하겠습니다.


2. 조인트에 spline IK 를 설치합니다.




spline IK 는 IK 를 nurbs curve 로 contol 할 수 있도록 하여서, 척추 등의 부드러운 움직임을 표현하는 데 효과적으로 사용되는 IK 시스템입니다. spline IK 를 설치하면 그림과 같이 IK 와 함께 nurbs curve 가 생성되는데, 이 nurbs curve 의 control vertex 를 조작하면 조인트를 부드럽게 움직일 수 있습니다. spline IK 를 생성하는 옵션에서 span을 늘려 주면 CV 들이 늘어나면서 좀더 부드러운 curve 를 얻을 수 있는데, 3 정도로 준 후 조작을 간편하게 하기 위해서 CV 들을 2개씩 묶어서 클러스터를 설치하겠습니다.




3. Nurbs curve 의 arc length 를 구합니다.

Arc length 는 nurbs curve 의 길이입니다. 만약 유저가 spline IK 의 nurbs curve CV 를 조작한다면, curve 의 arc length 가 달라지게 될 것입니다. 원래 길이에서 달라진 길이의 변화량을 측정해서, 그 값을 조인트의 size 에 곱하면 조인트가 효율적으로 stretch 된다는 것이 stretch IK 의 기본 개념입니다.

마야 메뉴의 Creates > Measure Tools > Arc Length Tool 로 이 nurbs curve 의 arc length 를 구할 수 있습니다.




자, 저는 24.456062 라는 값이 나왔군요. 이 값은 꼭 필요한 값입니다.


4. multiply divide 노드를 만듭니다.

그럼 아까 설명했던 대로 nurbs curve 의 arc legnth를 가지고, (변화량/절대값) 을 구해야 할 것입니다. 이러한 나눗셈을 하기 위해 필요한 것이 multiply divde 노드입니다.

multiply divide 노드를 만드는 방법은 2가지가 있습니다. Maya>Hypershade 에서 multiply divide 노드를 찾아서 생성할 수 있습니다.




또는 간단하게 마야 커맨드 창에 다음과 같이 입력해도 multiply divide 노드를 생성할 수 있습니다. 물론 이렇게 하면 노드의 이름까지 정해주면서 만들 수 있겠지요.


이렇게 만들어진 multiply node 에, 이제 '변화량' 과 '절대값' 에 해당하는 값을 입력해 주어야 할 것입니다.

multiply divide 노드는 input 1X-input 2X 에 들어온 값을 계산해서 output X 로 내보내는 기능을 하고 있는 노드입니다. (물론 마찬가지로 input 1Y, input 2Y 를 계산해서 output Y 로 내보냅니다.) 나눗셈을 할 때에는 1X 를 2X 로 나누어서 몫을 출력합니다. 즉 변화량을 1X 에 입력하고, 절대값을 2X 에 입력하면 되는 것입니다.

먼저, multiply divide 노드를 attribute editor 로 열어서 계산을 divide 로 바꾸어줍니다. 그리고, input2X 에 아까 계산했던 arc length 의 길이. 24.456062 를 입력합니다.



그리고 난 후, outliner 와 connection editor 를 엽니다. outlinder 의 display 에서 DAG object only 를 해제하면 DAG object 들이 아닌 노드들도 확인할 수 있습니다. 그리고 Shapes 를 체크하면 감추어져있던 shape 노드들도 확인할 수 있습니다.

먼저 arc length 노드는 spline IK 를 만들면서 생성된 nurbs curve 의 shape 노드로 존재합니다. 찾아서, connection editor 의 Outputs(from) 위치에 둡니다.
다음 우리가 아까 만들었던 multiplyDivide 노드를 찾아서 connection editor 의 Inputs(to) 위치에 둡니다.



그리고 난 후, connection editor 에서 arcLength 와 inputX 를 연결시켜 줍니다.


이렇게 하면, 아마 channel box 에서 다음과 같이 바뀌어 있는 것을 볼 수 있을 것입니다. 이제 input1X 를 input2X 로 나누어준 계산값이 outputX 로 출력되게 됩니다.


5. 계산된 값을 각 조인트의 scale 에 연결시킵니다.

이제 계산된 값을 조인트의 scale 에 연결시켜서 쭉쭉 늘이는 일만 남았습니다.
connection editor 에서 이제 우리가 만든 multiply divide 노드를 Outputs(from) 위치에 불러들이고, 각각의 조인트들을 Inputs(to) 위치에 불러들입니다. 그리고, outputX 와 각각 조인트들의 scaleX 에 연결시켜줍니다.



이제 다 되었습니다. 결과물을 확인해봅시다.





이런 식으로 간단한 stretch IK 를 만들어 보았습니다. 물론 좀더 발전적인 방법이 있을 수 있습니다. 그래도 혹시라도 어떤 분들이 도움을 받을 수 있다면, 보람된 포스팅이 될 것입니다.

쭉죽 늘어나는 팔다리를 만들어 봅시다!

stretch 하면 빼놓을 수 없는 이분.


ThEnd.

posted by cimple 2009. 11. 5. 01:05

새 날개를 리깅하면서 괜찮은 자투리 지식들이 많아서 모아보았다.


그림과 같이, 새 날개를 리깅하기 위한 1차 방법이다.

일단, 새 날개를 아름답게 접히게 하기 위해서 guide Line 을 5개 잡아준다.


guide 라인을 잡아주는 방법은 상황에 따라서 다르겠지만,
일단 날개 조인트에서 시작해서, 날개를 덮을 수 있는 Nurbs Plane 을 생성하는 것이 목적이기 때문에
가이드 커브를 그려준다.
일단 처음점과 끝점에 가이드 커브를 그린 후, Rebuild Curve 를 해서 Span 을 잘게 나누어주면
그림과 같은 커브를 얻을 수 있다.


그리고 나서, 가이드 커브에 따라 조인트를 만들어준다.


이렇게 만들어진 조인트에, Nurbs Curve 를 스키닝한다. 이렇게 하면 조인트를 움직여서 Nurbs Curve 를 컨트롤 할 수 있게 될 것이다.
스키닝하는 방법은 smooth bind 로, max influence 를 3 정도 주도록 한다.

다음에는 커브를 가지고 Loft 해서 Nurbs Plane 을 만들어 준다.


그럼 그림과 같이 Nurbs Plane 이 만들어 질 것이다. 그런데 만드는 순서에 유의해서 노말방향이 아래쪽으로 뒤집어지지 않도록 유의한다. 왼쪽에서 오른쪽으로 커브를 선택한 후 loft 시켜야 원하는 결과를 얻을 수 있을 것이다.
Loft 시키는 옵션은 박스의 그림과 같이 하면 되는데, Linear 하게, Spans 는 3 정도 주는 것이 적당하다.

이렇게 만들어 두고, Loft 의 History 를 지우지 않으면, Nurbs Curve 가 움직이는 대로 Nurbs Plane 이 따라 움직이는 것을 확인할 수 있을 것이다.




- 폴리클에 joint 를 vertex snap 시키기

생성한 폴리클에 joint 를 vertex snap 시키려 해도 잘 되지 않을것이다.

이럴 때에는 폴리클을 모두 선택한 다음, Display -> Transform Display -> Rotation Pivot 을 하면

그때부터 폴리클에 joint snap 이 가능하다.

snap 을 모두 시켜 준 다음에는 다시 Rotation Pivot 을 꺼준다.



- 폴리클을 joint 에 쉽게 parent 시키기 위한 MEL


다음은 많은 수의 폴리클을 joint 에 쉽게 parant 시키기 위한 MEL 이다.




string $jnt_txt;
string $fol_txt;
for ($x=1 ; $x<=7 ; $x++)
{
 select -cl;
 $y = $x;
 $jnt_txt = "joint" + $y;
 select -r $jnt_txt;
 $fol_txt = "hwak_c_tailFT01_0" + $x;
 select -add $fol_txt;
 parent;
};
 


상황에 따라서 위의 MEL 은 달라지겠지만, 핵심은 string 을 이용해서 MEL 커맨드를 반복적으로 실행시키는 부분이다.

간편한 상황이 많이 나오므로 숙지하도록 하자.