Tuesday, July 28, 2009
Saturday, July 25, 2009
Maya에서 모델링한 obj 파일 ZBrush로 import 할때 UV 깨지는 현상 해결법
답 : 지브러시는 UV 가 세로가 반대이다. 텍스처 로딩시 Flip Vertical 만 해주면 된다.
부연 : 이런 작업은 16비트 맵에만 해당됨
설명 : http://www.zbrushcentral.com/zbc/showthread.php?t=28393
(본문중에서) Yes. You can apply your texture to the model in ZBrush. Simply load the model and draw it on the canvas. Enter Edit mode. Import the texture into the Texture palette and flip it vertically. It will now wrap correctly onto the model. The catch is that each model can only have one texture applied to it. So if your model uses multiple textures you will probably want to bring each part into ZBrush separately.
주의점 : Photoshop 의 Color Profile 관련 옵션을 제대로 해줘서 포토샵이 멋대로 색을 수정하지 않게 해줄 것.
관련자료 : Scott Spencer의 강좌를 참조할 것 : Gnomonology Rendering Zbrush Displacement Maps
지브러시 및 displacement map 을 알려면 반드시 봐야 하는 강좌임
Thursday, July 23, 2009
Mac이 PC보다 더 좋다?
드림웍스 Dreamworks 에서 사용하는 컴퓨터 스펙 (2007당시)
Wednesday, July 22, 2009
photoshop의 "not enough RAM", "not enough memory" error
Saturday, July 18, 2009
How can I use the old style render layers in Maya 2009?
However you can still create these overrides by using the following Mel
Where layer1 is the name of the Layer you like to override.
Ambient Occlusion
renderLayerBuiltinPreset occlusion layer1;
Luminance Depth
renderLayerBuiltinPreset linearDepth layer1;
Normal Map
renderLayerBuiltinPreset normal layer1;
Geometry Matt
renderLayerBuiltinPreset matte layer1;
Diffuse
renderLayerBuiltinPreset diffuse layer1;
Specular
renderLayerBuiltinPreset specular layer1;
Shadow
renderLayerBuiltinPreset shadow layer1;
From http://mayastation.typepad.com/
http://eltepedia.blogspot.com/2009/04/can-i-use-old-style-render-layers-in.html
Render pass, multipass render
Friday, July 17, 2009
진짜보다 더 진짜같이… ‘오감체험 놀이’가 뜬다
Thursday, July 16, 2009
Endorphin에서 Character Rig Setup
Saturday, July 11, 2009
CUDA releases RUINS, a Real Time Shatter tool for Maya
NaturalMotion Endorphine 내츄럴모션 사의 엔돌핀
doMenuComponentSelection 관련 에러 해결법-dagMenuProc source 해주기
메뉴 관련해서 Mel 함수를 만들 때 doMenuComponentSelection 가 없다는 에러메시지가 뜨는 경우가 있다.
특히 마야를 처음 띄우고 할때 이런 메시지를 종종 보게 되는데 일단 오른버튼을 눌러서 메뉴를 띄운 후에 실행하면 제대로 됨을 알 수 있다. 이것은 right mouse button menu 관련 코드인 dagMenuProc.mel 가 아직 source 되지 않았기 때문이다. 마야는 시작시에 모든 스크립트를 한꺼번에 다 로드하지 않는다. 예를 들면, Right mouse button menu 관련 코드는 오른 마우스버튼이 처음 눌렸을 시점에 로드한다.
따라서 MEL 처음 부분에
- if(!`exists doMenuComponentSelection`) eval("source dagMenuProc");
를 라고 넣어주면, doMenuComponentSelection 관련 에러를 보지 않고 제대로 실행되게 할 수 있다.
doMenuComponentSelection 가 dagMenuProc.mel 에 포함된 함수인지 어떻게 아는가 하면, 다음과 같이 whatIs 명령을 쓰면 된다.
- whatIs doMenuComponentSelection;
그러면 다음과 같이 나온다. // Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2009/scripts/others/dagMenuProc.mel //
- 관련 링크 http://www.3dbuzz.com/vbforum/showthread.php?t=168546 http://forums.cgsociety.org/archive/index.php/t-226244.html
참고로 MMM에서는 F6 눌러 build 할때 install script 초반에 자동으로 이 코드를 넣어주고 있다.
MMM에서 whatIs 에 해당하는 함수는 ScriptingUtil_FindMelFileFromFunction() 이다.
오브젝트의 children 얻을때 listRelatives 에 -path 플래그 줄것
- string $children[] = `listRelatives -c $obj`;
- string $children[] = `listRelatives -c -path $obj`;
- ListUtil_ListChildren($obj);
Vertex의 위치를 구하는 법
Component 모드에서 선택된 $vertex 의 world 위치를 구하려면
- float $pos[] = `pointPosition -w $vertex`;
와 같이 하면 된다.
MEL에서 object의 position 얻기 Get position
Object의 월드좌표에서의 좌표를 얻기를 원하는 경우가 많은데 그때 다음과 같이 하면 안된다.
- float $x = `getAttr ($obj + ".translateX")`; float $y = `getAttr ($obj + ".translateY")`; float $z = `getAttr ($obj + ".translateZ")`;
다음과 같이 얻도록 한다.
- vector $pos = `xform -q -ws -rp $obj`;
-q 는 query, -rp 는 rotate pivot 즉 오브젝트의 피봇, -ws 는 world space 을 의미.
MMM을 써서
- vector $pos = GeomUtil_GetPos($obj); vector $pos = GeomUtil_GetPosAsVector($obj); // 위와 동일 float $pos[] = GeomUtil_GetPosAsArray($obj); // float array 로 얻어짐
MEL 의 move 명령 메모 Set Position
MEL 에서 헷갈리기 쉬운 것이 move 명령의 플래그 -wd 와 -os 등이다. -a 와 -r, -wd, -os 등을 정리해보자.
move 명령은 주로 다음과 같이 쓴다.
물체를 절대좌표 원점으로 옮기기
- move -a 0 0 0 $obj; // -a 는 -absolute 의 약자.
물체를 vector로 나타낸 절대좌표 $pos 로 옮기기
- move -a ($pos.x) ($pos.y) ($pos.z) $obj;
물체를 현재위치에서 relative하게 object space 기준으로 z축 -3 만큼 이동
- move -relative -objectSpace -worldSpaceDistance 0 0 -3 $obj;
- move -r -os -wd 0 0 -3 $obj; // (위와 동일)
-worldSpaceDistance 라는 플래그는 object space 에서 scale 등이 적용되었을 때 world space 내의 distance 와 object space 내의 distance 가 다르기 때문에 사용된다.
Object space 단위의 distance 로 움직이려면 -wd 를 빼고 다음과 같이 하면 된다. Scale 하고 rotate 한 오브젝트로 시험해보면 쉽게 알 수 있다.
- move -r -os 0 0 -3 $obj;
주의할점은 물체를 월드 상의 특정 위치에 위치시키려할때
- setAttr ($obj + ".translateX") ($pos.x); setAttr ($obj + ".translateY") ($pos.y); setAttr ($obj + ".translateZ") ($pos.z);
와 같이 하지 말고 move 명령을 -a 플래그와 함께 써야 쓰라는 것이다. 또는 MMM 의
- GeomUtil_SetPos();
를 쓰면 편하다.
두 object가 identical 한 것인지 비교 하려면
Array 를 $arr 라고 할 때
- $arr[size($arr)] = 값
하면 저절로 array 가 늘어나면서 값이 들어간다.
두 object가 identical 한 것인지 비교 하려면
connectAttr 로 각도 attribute 를 연결할때 자동으로 생성되는 unitConversion 노드
여기서는 connectAttr 로 각도 attribute 를 연결할때의 현상을 알아보자.
// 1. 물체 $a 와 $b 를 만든다.
// $a 에는 angle 이라는 attribute 가 들어갈 것이다. 그 attribute는 // $b 의 rx 를 조절할 것이다.
string $a = CreateSimpleObjUtil_Cube(); // polygon Cube 를 만들어준다.
string $b = CreateSimpleObjUtil_Pipe(); // polygon Pipe 를 만들어준다.
// 2. cube 에 "angle" 이라는 Attribute 를 slider와 함께 추가
// (기본값 0, slider 최소값 0, slider 최대값 360)
NodeUtil_AddAttr_Double_WithSlider $a "angle" 0 0 360;
// 3. connect attribute 한다.
connectAttr -f ($a + ".angle") ($b + ".rx");
이제 이렇게 하면 $a 의 angle 어트리뷰트를 슬라이더로 조절할 때 $b 즉 pipe 가 회전하는 것을 볼 수 있다.
2. unitConversion 노드
이제 다음과 같이 해보자.
connectionInfo -destinationFromSource ($a + ".angle");이렇게 하면 아마 pPipe.rx 가 출력될거라고 예상할 것이다. 하지만 실제로는
// Result: unitConversion1.input //같은 값이 출력된다. 그 이유는 이 값이 angle 값이기 때문이다. (내부적으로 아마 라디안 값으로 변환하는 모양이다) 다른 보통의 attribute 들을 connectAttr 하면 unitConversion 노드 없이 바로 연결된다. 참고로
ls -type unitConversion;를 해보면 모든 unitConversion 노드를 list 해볼 수 있다.
3. disconnect 하는 방법 중간에 unitConversion 노드가 있기 때문에 모든 경우에 disconnectAttr 함수를 쓸수는 없다. 따라서 다음과 같이 해주면
NodeUtil_DisconnectAttr ($a + ".angle") ($b + ".rx");unitConversion 노드가 있는 경우와 없는 경우 모두 connection 이 제대로 끊어진다.
4. Connected 여부 알아내기 중간에 unitConversion 노드가 있는 경우, MEL 에서 기본 제공되는 isConnected 함수를 쓸 경우 connect 되지 않았다고 나온다. 이는 매우 이상하게 느껴질 수 있다 왜냐하면 분명히
- connect -f "A.rot" "B.rx"
- isConnected "A.rot" "B.rx"
listRelatives 에서 틀리기 쉬운 것 (Flag 의 and 조건 안됨)
예를 들면 특정 노드 $obj의 child 로 되어 있는 light 들만 얻으려 할 때
string $children[] = `listRelatives -c -typ light $obj`;라고 하면 될 것 같지만, 이렇게 하면 잘 되지 않는다.
-c 와 -typ 플래그가 and 의 조건으로 동작하지 않는 것이다.
2. 해결책
따라서
string $children[] = `listRelatives -c $obj`;와 같이 한 후 여기서 light 노드들만을 가려내는 식으로 얻어내야 한다.
따라서 다음과 같은 함수를 만들어 쓰면 편하다.
ListUtil_ListAllTextures()
ListUtil_ListAllLights()
Maya의 project path와 workspace path
그러나 Project 마다 workspace.mel 파일이 있는 것으로 보아, 마야의 Project 파일이 workspace.mel 이라는 것을 유추할 수 있 다. 또한 메뉴의 File > Project > Set .. 에서 프로젝트를 세팅한 후
workspace -q -fullName하면 방금 세팅한 project directory 가 나오는 걸로 보아 workspace 가 project 와 동일한 의미라는 것은 명백하다. 또한 workspace 명령에 -projectPath 같은 프로젝트 관련 플래그가 있는 것도 이러한 사실을 뒷받침해준다. 한가지 혼동될 수 있는 것은
workspace -q -fullName가 서로 다른 결과를 준다는 것인데 이는 다음 예를 보기로 하자.
workspace -q -directory
C:/gameModeling를 set project 하고
C:/gameModeling/scenes/packman.mb라는 모델링 파일을 로딩했다고 해보자. 이 상태에서
workspace -q -fullName 하면
C:/gameModeling 가 되고
workspace -q -directory 하면그런데 여기서 만약 C:/modelingSources/scenes/star.mb 라는 모델링 파일을 로딩했다고 하자. 그러면 현재 project 는 여전히 C:/gameModeling 지만 씬은 C:/modelingSources 라는 다른 프로젝트에서 로딩되는 것이다. 따라서
C:/gameModeling/scenes 가 된다.
workspace -q -fullName 하면
C:/gameModeling 가 되고
workspace -q -directory 하면따라서 workspace -q -fullName 를 SystemUtil_GetProjectDir() 라는 함수로 만들어주고
C:/modelingSources/scenes 가 된다.
workspace -q -directory 를 SystemUtil_GetWorkspaceDir() 라는 함수로 만들어주면
혼동 없이 쓰기 좋다.
Light 노드 리스트list 시 주의점
1. objectType 에서의 -isType
어떤 오브젝트 $obj 가 라이트인지 구별하기 위해
- if(`objectType -isType light $obj` == "light")
와 같이 하면, 스팟라이트 같은 경우 리턴값이 spotLight 이 되기 때문에 의도한것과는 다르게 if 문 자체가 false 가 되어버리는 문제가 있으므로 주의해야 한다.
2. ls 의 -type
ls 를 쓸때는
- ls -type light
와
- ls -type spotLight
를 용도에 따라 둘다 사용할수 있다.
3. Light shape 노드와 Transform 노드
ls 명령으로 light 노드를 리스트하면 light shape 노드들이 리스트되는데, 원하는 것이 light transform 노드인 경우라면 귀찮아진다. 따라서 이런 경우는 MMM 의 ListUtil_ListAllLights() 등을 쓰는 것이 간편하다.