ÀÌ ¹®¼´Â Á¦°¡ 3D Studio Max 3.x SDK ÇÁ·Î±×·¡¹ÖÀ» ÇÏ¸é¼ Á¦°¡ ÇÊ¿äÇÑ °Íµé¸¸ Á¤¸®
ÇѰÍÀÔ´Ï´Ù. Àú¸¸ ¾Ë¾Æº¼ ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Â ºÎºÐÀÌ ¸¹½À´Ï´Ù. ½Ã°£³¯ ¶§ ´Ù½Ã Á¤¸®
ÇϰڽÀ´Ï´Ù.
--------------------
SDK °ü·Ã »çÀÌÆ®
--------------------
http://www.discreet.com/support/max/download/download.php3 : SDK ´Ù¿î·Îµå
http://sparks.discreet.com/downloads/downloadshome.cfm : SDK °ü·Ã °¢Á¾ ´Ù¿î·Îµå
http://sparks.discreet.com/search/
http://support.ktx.com/~200/
http://sparks.discreet.com/webboard/wbpx.dll/~maxsdk/
http://support.discreet.com/webboard/wbpx.dll/%7Emos
http://www.gamasutra.com/features/19980220/baumann_01.htm
http://www.scriptspot.com : max sciprt °ü·Ã
--------------------
MAX SDK °ü·Ã ¼Àû
--------------------
Maxscript and the Sdk for 3d Studio Max
: http://www.amazon.com/exec/obidos/ASIN/0782127940/
--------------------
TimeValue
--------------------
Max ¿¡¼ ½Ã°£Ç¥ÇöÀº TimeValue ¶ó´Â ŸÀÔÀ¸·Î »ç¿ëÇÑ´Ù. À̰ÍÀº ticks ¶ó´Â ´ÜÀ§ÀÇ
Á¤¼öÇ¥ÇöÀε¥, 1ÃÊ´Â 4800 ticks ¿¡ ÇØ´çÇÑ´Ù. À̰ªÀº ¾Æ·¡ÀÇ Ç¥ÁØ ÇÁ·¹ÀÓ¼ö¿¡ ±Ù°Å
ÇÏ¿© ¸ðµÎ ³ª´©¾î Áú ¼ö ÀÖ´Â Àû´çÇÑ °ªÀ» ¼±ÅÃÇÑ °ÍÀÌ´Ù.
24 - Çʸ§, 25 - PAL, 30 - NTSC
TimeValue start = ip->GetAnimRange().Start();
TimeValue end = ip->GetAnimRange().End();
int number_of_frames = (end - start) / GetTicksPerFrame() + 1;
int frame_per_second = GetFrameRate(); // = 4800 / GetTicksPerFrame()
--------------------
Transformation Matrix Order
--------------------
Max ¿¡¼ TM(Transform Matrix)´Â Matrix3 Ŭ·¡½º·Î Á¤ÀǵȴÙ. ÀÌ´Â ÈçÈ÷ ¸»ÇÏ´Â
Çà·ÄÀ» ÀǹÌÇÑ´Ù. ´Ù¸¥ Á¡ÀÌ ÀÖ´Ù¸é 4x3 Çà·ÄÀ̶ó´Â °ÍÀÌ´Ù. ³»ºÎÀûÀ¸·Î´Â
float m[4][3]; ó·³ Á¤ÀÇµÈ µ¥ÀÌŸŸÀÔÀ» °¡Áö°í ÀÖ´Ù. Max¿¡¼ ¸ðµç º¤ÅÍ´Â
Ç຤ÅÍ·Î °£ÁֵDZ⠶§¹®¿¡ º¤ÅÍ-Çà·Ä°öÀº ´ÙÀ½°ú °°Àº ½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù.
[v0 v1 v2 v3] * | m00 m01 m02 m03 | = [ v0' v1' v2' v3' ]
| m10 m11 m12 m13 |
| m20 m21 m22 m23 |
| m30 m31 m32 m33 |
(* m00, m01,...mij µîµîÀÇ Ç¥ÇöÀº i¹øÂ° Çà, j¹øÂ° ¿ÀÇ Çà·Ä¿ä¼Ò¸¦ ÀǹÌÇÑ´Ù.
¹è¿À̶ó°í Çϸé m[i][j]¶ó°í Ç¥ÇöÇÒ ¼ö ÀÖ´Ù)
¿ÀÇÂÁö¿¤¿¡¼´Â ¾Æ·¡¿Í °°Àº ¿º¤Å͸¦ »ç¿ëÇÑ´Ù. À¯ÀÇÇÒ Á¡Àº ¸Æ½º¿¡¼¿Í´Â ´Þ¸® º¤
ÅͰ¡ °öÇÏ·Á´Â Çà·ÄÀÇ ¿ìÃø¿¡ À§Ä¡ÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù.
| m00 m01 m02 m03 | * | v0 | = | v0' |
| m10 m11 m12 m13 | | v1 | | v1' |
| m20 m21 m22 m23 | | v2 | | v2' |
| m30 m31 m32 m33 | | v3 | | v3' |
ÇÏÁö¸¸, ¸Æ½º¿¡¼´Â vector * TM »Ó¸¸ ¾Æ´Ï¶ó, TM * vector µµ Çã¿ëÇÑ´Ù´Â »ç½ÇÀ»
¾Ë¾ÆµÎÀÚ(°á°ú´Â µ¿ÀÏÇÏ´Ù).
¸Æ½º¿¡¼ »ç¿ëÇÏ´Â Çà·ÄÀº ¾Õ¼ ¸»ÇѰÍó·³ 4x3 Çà·ÄÀ̱⠶§¹®¿¡ ÀϹÝÀûÀÎ Çà·ÄÀÇ
w(scale)¼ººÐÀÌ ¾ø´Ù. Çà·ÄÀÌ ¾Æ·¡¿Í °°Àº ½ÄÀ¸·Î ±¸¼ºµÈ´Ù.
| m00 m01 m02 |
| m10 m11 m12 |
| m20 m21 m22 |
| m30 m31 m32 |
¸¸¾à, [v0 v1 v2] ÀÎ º¤ÅÍ¿ÍÀÇ Çü·Ä°öÀº ³»ºÎÀûÀ¸·Î ¾Æ·¡¿Í °°ÀÌ °è»êµÉ °Í °°´Ù.
[v0 v1 v2 1] * | m00 m01 m02 | = [v0' v1' v2']
| m10 m11 m12 |
| m20 m21 m22 |
| m30 m31 m32 |
Ç຤Å͸¦ »ç¿ëÇÏ´Â ¸Æ½ºÀÇ Çà·ÄÀ» ¿º¤Å͸¦ »ç¿ëÇÏ´Â OpenGL¿¡¼ »ç¿ëÇÏ·Á¸é Çà·ÄÀ»
ÀüÄ¡(Transpose)½ÃÄÑ¾ß ÇÑ´Ù.
(¸Æ½º:Ç຤ÅÍ»ç¿ë) (¿ÀÇÂÁö¿¤:¿º¤ÅÍ»ç¿ë)
| m00 m01 m02 N/A | | m00 m10 m20 m30 |
| m10 m11 m12 N/A | => | m01 m11 m21 m31 |
| m20 m21 m22 N/A | | m02 m12 m22 m32 |
| m30 m31 m32 N/A | | N/A N/A N/A N/A |
Á¤ÀǵǾî ÀÖÁö ¾ÊÀº [N/A N/A N/A N/A] ´Â [0 0 0 1] ·Î ´ëÀÔÇÏ¿©¾ß Çϸç, ¿ÀÇÂÁö¿¤
Àº Çà·ÄÀ» ¹è¿·Î Ç¥Çö½Ã¿¡ ¾Æ·¡¿Í °°Àº ¼ø¼¸¦ ÃëÇϱ⠶§¹®¿¡,
| g0 g4 g8 g12 | | g00 g10 g20 g30 |
| g1 g5 g9 g13 | = | g01 g11 g21 g31 |
| g2 g6 g10 g14 | | g02 g12 g22 g32 |
| g3 g7 g11 g15 | | g03 g13 g23 g33 |
¸Æ½ºÀÇ m¹è¿Àº OpenGLÀÇ g¹è¿·Î ¾Æ·¡¿Í °°ÀÌ ¸ÅÇεȴÙ.
| m00 m10 m20 m30 | | g00 g10 g20 g30 |
| m01 m11 m21 m31 | = | g01 g11 g21 g31 |
| m02 m12 m22 m32 | | g02 g12 g22 g32 |
| 0 0 0 1 | | g03 g13 g23 g33 |
¿îÁÁ°Ôµµ, MAX ÀÇ m[i][j] ÀÇ °ªÀº OpenGL ÀÇ g[i][j] ¿Í °°´Ù. g[0][3] - g[3][3]
ÀÇ °ªÀÌ [0 0 0 1] ÀÎ Á¡¸¸ Á¦¿ÜÇÏ¸é ³ª¸ÓÁö °ªÀº MAX ¹è¿ ¼ø¼¿Í ÀÏÄ¡ÇÑ´Ù.
ÄÚµùÀ» ÇÑ´Ù¸é ¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.
for (i = 0; i < 4;i++) {
for (j = 0; j < 3;j++) {
OpenGL[i][j] = Max[i][j];
}
OpenGL[i][3] = 0.0;
}
OpenGL[3][3] = 1.0;
--------------------
Transformation Matrix
--------------------
o Object Offset TM
Object OffsetÀ̶õ ¸Æ½ºÀÇ Pivot ÃàÀ» ±âÁØÀ¸·Î ÇÏ¿© Áö¿À¸ÞÆ®¸®°¡ À§Ä¡ÇÏ´Â TMÀ»
¸»ÇÑ´Ù. ¸Æ½º¿¡¼ PivotÀ» ¿òÁ÷À̰ųª ȸÀü½Ãų ¼öµµ ÀÖ´Â °ÍÀº ÀÌ ¶§¹®ÀÌ´Ù.
¾Æ·¡¿Í °°ÀÌ °è»êµÈ´Ù.
Object Offset TM = Offset Scale * Offset Rotation * Offset Position
o NodeTM
NodeTMÀ̶õ Pivot ÃàÀ» ¿ùµåÁÂÇ¥·Î º¯È¯Çϱâ À§ÇÑ TMÀÌ´Ù.
o Object TM
Object TMÀ̶õ ¿ÀºêÁ§Æ®ÀÇ ÇÑ Á¡À» ¿ùµåÁÂÇ¥°è·Î º¯È¯Çϱâ À§ÇÑ TMÀ» ÀǹÌÇÑ´Ù.
ObjectTMÀº ºÎ¸ðTM, NodeTM, ObjectOffsetTMÀ» ¸ðµÎ Æ÷ÇÔÇÑ´Ù.
ObjectTM = Offset Scale * Offset Rotation * Offset Position *
Controller Scale * Controller Rotation * Controllers Position *
Parent Transformation
o Local Transformation
NodeWorldTM = NodeLocalTM * ParentLocalTM * ParentLocalTM * ParentLocalTM ...
ParentWorldTM = ParentLocalTM * ParentLocalTM * ParentLocalTM ...
NodeWorldTM = NodeLocalTM * ParentWorldTM
NodeLocalTM = NodeWorldTM * Inverse(ParentWorldTM)
¿¹Á¦)
...
INode *parent;
Matrix3 parentTM, nodeTM, localTM;
nodeTM = node->GetNodeTM(0);
parent = node->GetParentNode();
parentTM = parent->GetNodeTM(0);
localTM = nodeTM*Inverse(parentTM);
...
--------------------
MAX 3.0 À» Windows 2000 (ÇÑ) ¿¡¼ ½ÇÇàÇϱâ
--------------------
Max 3.1 ¿¡¼´Â »ó°ü¾øÁö¸¸ 3.0 ¹öÁ¯À» Windows 2000 (ÇѱÛ) ¿¡¼ »ç¿ëÇÏ·Á¸é
´ÙÀ½°ú °°Àº ¿É¼ÇÀ» ÁÖ¾î ½ÇÇàÇÑ´Ù.
C:\3DSMAX3\3dsmax.exe -q
Max ½ÇÇàÈÀÏÀÇ ¹Ù·Î°¡±â ¾ÆÀÌÄÜÀ» ¸¸µç´ÙÀ½ µî·ÏÁ¤º¸ÀÇ "´ë»ó"¿¡¼ ½ÇÇà¿É¼ÇÀ»
À§¿Í °°ÀÌ Àû¾îÁÖ¸é µÈ´Ù.
--------------------
SDKLINK.ZIP
--------------------
MAXSDK/HELP µð·ºÅ丮¸¦ º¸¸é SDKLINK.ZIP ¶ó´Â ÆÄÀÏÀÌ ÀÖ´Ù. ¾ÐÃàÀ» Ç®°í .DOC
ÆÄÀÏÀ» º¸¸é ¾Ë ¼ö ÀÖ°ÚÁö¸¸, ÀÌ ÆÄÀÏÀº ºñÁÖ¾ó ¾¾¸¦ »ç¿ëÇÒ ¶§¿¡ TOOL ¿¡ µî·ÏÇÏ¿©
ÇïÇÁ¸¦ ½±°Ô »ç¿ëÇϱâ À§ÇÑ ¹æ¹ýÀ» ¼³¸íÇØ ÁÖ°í ÀÖ´Ù. ¿¹¸¦ µé¸é, SDK ÇïÇÁ¿¡¼
ã°íÀÚ Çϴ Ŭ·¡½º À̸§À̳ª ÇÔ¼ö¸íÀ» ¼±ÅÃÇϰí Ctrl+Alt+C ¸¦ ´©¸£¸é ÇØ´çÇÏ´Â
MAXSDK ÇïÇÁâÀÌ ¶ßµµ·Ï ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¿ïÆ®¶ó¿¡µðÆ®³ª ¿¡µðÆ®Ç÷¯½º µî¿¡¼µµ
ÇÒ ¼ö ÀÖ´Ù.
--------------------
Class Mesh
--------------------
[from MAX SDK Help]
- UVVert *tVerts;
ÅØ½ºÃÄ ¹öÅØ½º ¹è¿. UVW ÁÂÇ¥¸¦ ÀúÀåÇÑ´Ù. 2D ¸ÅÇÎÀ» À§Çؼ´Â 2°³ÀÇ °ª¸¸ ÇÊ¿äÇÏ
´Ù. ¿¹¸¦ µé¸é. UV ¶Ç´Â VW, WU. ÀÌ´Â »ç¿ëÀÚ¿¡°Ô UV, VW ¶Ç´Â WU Áß¿¡¼ ¼±ÅÃÇÒ
¼ö ÀÖµµ·Ï Çϱâ À§ÇÔÀÌ´Ù.
(UVVert ÀÇ Á¤ÀÇ : typedef Point3 UVVert;)
- TVFace *tvFace;
3D ½ºÆ©µð¿À(µµ½º¿ë) ½ÃÀý¿¡´Â UV ¹è¿°ú ¹öÅØ½º ¹è¿»çÀÌ¿¡ ÀÏ´ëÀÏ´ëÀÀÀÌ µÇ¾úÀ¸
´Ù(Áï, °¢°¢ÀÇ ¹öÅØ½º¿¡ ´ëÇØ¼ ÇϳªÀÇ UV¸¸). ÇÏÁö¸¸, ¸Æ½º¿¡¼´Â UVVert ¹è¿Àº
¹è¿°ú ¿ÏÀüÈ÷ µ¶¸³ÀûÀÌ´Ù. ´ë½Å¿¡, º°µµÀÇ TVFace ¹è¿ÀÌ ÀÖ´Ù. ¸ðµç ¸éÀº ÇϳªÀÇ
TVFace ¸¦ °¡Áö¸ç, ÇϳªÀÇ TVFace ´Â UVVert ¸¦ °¡¸®Å°´Â ¼¼°³ÀÇ À妽º°¡
ÇÊ¿äÇÏ´Ù. ÀÌ·¸°Ô ÇÑ ÀÌÀ¯´Â °³¹ßÀÚ°¡ ¸ÅÇο¡ µû¶ó ¿ÏÀüÈ÷ ´Ù¸¥ ÅäÆú·ÎÁö¸¦ Àû¿ëÇÒ
¼ö ÀÖµµ·Ï Çϱâ À§ÇÔÀÌ´Ù. °´Ã¼ °¢°¢ÀÇ ¸éÀº °¢ÀÚ ÀÚ½ÅÀÇ ¸ÅÇÎÀ» °¡Áú ¼ö ÀÖ´Ù.
(´Ù½Ã ¸»Çϸé, ÀÎÁ¢ÇÑ ¼·Î ´Ù¸¥ ¸éÀÇ ¹öÅØ½º¿¡ ´ëÇØ¼ ¿¬¼ÓÀûÀÎ ÅØ½ºÃÄ ¸ÅÇÎ
ÁÂÇ¥¸¦ °®Áö ¾Ê¾Æµµ µÈ´Ù´Â °ÍÀÌ´Ù.)
--------------------
Object Creation
--------------------
- utiltest.cpp -> MakeObject()
1. (Object * ip)->CreateInstance(CLASSID); // CLASSID from PLUGAPI.H
2. ParameterBlock->SetValue
3. CreateObjectNode()
4. Redraw()
--------------------
Rotate
--------------------
- DegToRad (45.0f)
angle Àº radian À̹ǷΠdegree ·Î ¹Ù²Ü°Í
--------------------
TM
--------------------
- A¶ó´Â TM¿¡¼ b¸¸Å ¶³¾îÁø B¶ó´Â TM ±¸Çϱâ (from camera.cpp)
bM = aM;
bM.PreTranslate(Point3(0.0f, 0.0f, b));
--------------------
Node ´Ù·ç±â
--------------------
INode * node;
TSTR name(_T("MyNode"));
ip->MakeNameUnique(name);
node->SetName(name); // Node À̸§ ¹Ù²Ù±â
ip->RedrawViews(ip->GetTime());
INode *parent;
Matrix3 parentTM, nodeTM, localTM;
nodeTM = node->GetNodeTM(0);
parent = node->GetParentNode();
parentTM = parent->GetNodeTM(0);
localTM = nodeTM * Inverse(parentTM);
ptm = node->GetParentTM(ip->GetTime());
INode * GetINodeByName (const TCHAR *name) = 0;
--------------------
INode Method
--------------------
Matrix3 GetNodeTM (TimeValue t, Interval * valid = NULL);
; ³ëµåÀÇ pivot ÀÇ ¿ùµå TM ±¸Çϱâ
Matrix3 GetObjectTM (TimeValue time, Inverval * valid = NULL);
; ObjectOffsetTM + NodeTM + WSM
Point3 VectorTransform (const Matrix3& M, const Point3& V);
--------------------
´ëÈ»óÀÚ ÆùÆ® ÀÛ°Ô
--------------------
regedit.exe -> HKEY_CURRENT_CONFIG -> Software -> Fonts -> FONTS.FON ¿¡¼
hvgasys.fon ¸¦ vgasys.fon À¸·Î º¯°æ ÈÄ ¸®ºÎÆÃ.
http://www.cgmate.com/zeroboard/zboard.php?id=cgmate_master&no=20
--------------------
Ç÷¯±×ÀÎÀÌ ·Îµù ¾ÈµÉ ¶§
--------------------
ÀÛ¼ºÇÑ Ç÷¯±×ÀÎÀÌ ¾î¶² ½Ã½ºÅÛ¿¡¼´Â ·ÎµùµÇÁö¸¸, ¾î¶² ½Ã½ºÅÛ¿¡¼´Â ·ÎµùµÇÁö ¾ÊÀ»
¶§¿¡´Â, ÄÄÆÄÀϽà »ç¿ëÇÑ .DLL ÆÄÀÏÀÌ ¾ø¾î¼ÀÏ ¼ö ÀÖ´Ù.
¿¹¸¦ µé¾î, .net ȯ°æ¿¡¼ ÄÄÆÄÀÏÇϸé, msvcr70.dll À» »ç¿ëÇÏ°Ô µÇ´Âµ¥, ÀÌ ÆÄÀÏÀÌ
¾ø´Â ½Ã½ºÅÛ¿¡¼´Â dllÀÌ µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.
Ç÷¯±×ÀÎ ÆÄÀÏÀÌ ¾î¶² DLLÀ» »ç¿ëÇÏ´Â Áö È®ÀÎÇÏ·Á¸é, ºñÁÖ¾ó¾¾ÀÇ bin µð·ºÅ丮¿¡ ÀÖ´Â,
dumpbin.exe ¸¦ »ç¿ëÇÏ¿© È®ÀÎÇÑ´Ù.
> dumpbin.exe /imports utility.dlu
--------------------
max script ½ÇÇà
--------------------
½ºÅ©¸³Æ®´Â Max ¸Þ´ºÀÇ MAXScript->Run Script...¸¦ ÅëÇØ ½ÇÇàÇÒ ¼ö ÀÖÀ¸¸ç, °£´ÜÇÑ
½ºÅ©¸³Æ®¶ó¸é, ÁÂÃø ÇÏ´ÜÀÇ ¹Ì´Ï ¸®½º³Ê¸¦ ÅëÇØ ÀÔ·ÂÇÏ´Â °Íµµ ÁÁ´Ù. F11Ű³ª
MAXScript->MAXScript Listener...¸¦ ¼±ÅÃÇÏ¿© ³ªÅ¸³»´Â ¸®½º³Ê À©µµ¿ì´Â ºäÆ÷Æ®
¸Þ´ºÀÇ Views->Extended->MAX Script Listener¸¦ ¼±ÅÃÇÏ¸é ºäÆ÷Æ® ³»¿¡ ³»Àå½Ãų ¼öµµ
ÀÖ´Ù.
--------------------
Visual MAXScript
--------------------
MAXScript¸Þ´ºÀÇ Visual MAX Script Editor...¸¦ ¼±ÅÃÇÏ¸é ½ºÅ©¸³Æ® ·Ñ¾Æ¿ôÀÇ »ç¿ëÀÚ
ÀÎÅÍÆäÀ̽º ÄÁÆ®·Ñ µéÀ» ¸¶À½´ë·Î ¹èÄ¡ÇÒ ¼ö ÀÖ´Â ÅøÀÌ ½ÇÇàµÈ´Ù. ÀÌ ÅøÀ» »ç¿ëÇϸé
¹öưÀ̳ª, ¸®½ºÆ® ¹Ú½º µîÀÇ ·Ñ¾Æ¿ô ÄÁÆ®·Ñ µéÀ» ÀÚÀ¯·Ó°Ô ¹èÄ¡ÇÒ ¼ö ÀÖÀ¸¸ç, .ms
ÆÄÀÏÀÎ ½ºÅ©¸³Æ® ÆÄÀÏ·Î ÀúÀåÇÒ ¼öµµ ÀÖ´Ù. ÀúÀåµÈ ½ºÅ©¸³Æ® ÆÄÀÏÀº ´ÙÀ½°ú °°Àº
Çü½ÄÀ» °¡Áö¸ç, ÄÁÆ®·ÑµéÀÇ ³ÐÀÌ¿Í ³ôÀÌ À§Ä¡°¡ ÁöÁ¤µÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
rollout unnamedRollout "Untitled" width:215 height:314
(
comboBox cbx1 "ComboBox" pos:[15,15] width:130 height:3
listBox lbx1 "ListBox" pos:[16,88] width:81 height:2
pickButton btn1 "PickButton" pos:[21,161] width:59 height:20
checkButton ckb1 "CheckButton" pos:[98,159] width:80 height:29
button btn2 "Button" pos:[21,209] width:62 height:31
button btn3 "Button" pos:[102,204] width:64 height:35
)
--------------------
Mesh°ü·Ã max script ¸í·É
--------------------
convertToMesh <node>
: ¾À °´Ã¼¸¦ Editable Mesh·Î º¯È¯ÇÑ´Ù.
<mesh>.numverts
: ¹öÅØ½º °³¼ö¸¦ ¾ò°Å³ª ¼³Á¤ÇÑ´Ù.
<mesh>.numfaces
: ÆäÀ̽º °³¼ö¸¦ ¾ò°Å³ª ¼³Á¤ÇÑ´Ù.
<mesh>.numtverts
: ÅØ½ºÃÄ ¹öÅØ½º °³¼ö¸¦ ¾ò°Å³ª ¼³Á¤ÇÑ´Ù.
--------------------
UltraEdit ¿¡µðÅÍ¿¡¼ max script »ç¿ëÇϱâ
--------------------
¸Æ½ºÀÚü¿¡¼ Á¦°øÇÏ´Â ½ºÅ©¸³Æ® ÆíÁý±â¸¦ »ç¿ëÇÏ¸é ¸Æ½º ÀÚü¿¡¼ Á¦°øÇÏ´Â ¸î °¡Áö
ÀÌÁ¡ÀÌ ÀÖ±â´Â ÇÏÁö¸¸, ÅÇ Àε§Å×À̼ÇÀÌ Á¦°øµÇÁö ¾Ê¾Æ, ¸Å ¶óÀθ¶´Ù ÅÇ Å°¸¦ ´·¯ ¾ß
ÇÏ´Â ºÒÆíÇÔÀÌ ÀÖ´Ù. ´ÙÇàÈ÷ ¿ïÆ®¶ó ¿¡µðÆ®¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ´Â max script¿ë
¿öµåÆÄÀÏÀ» ´©±º°¡ ¹Ì¸® ¸¸µé¾î ³õ¾Ò±â ¶§¹®¿¡, À̸¦ »ç¿ëÇÏ¸é ¿ïÆ®¶ó ¿¡µðÆ®¿¡¼µµ
maxscript¸¦ À§ÇÑ ½ÅÅýº Ä÷¯¸µÀ̶óµç°¡, ÅÇ Àε§Å×À̼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
¾Æ·¡ÀÇ ÁÖ¼Ò¿¡¼ ÆÄÀÏÀ» ´Ù¿î¹Þ¾Æ, ÀÚ½ÅÀÇ ¿ïÆ®¶ó¿¡µðÆ® ¼³Ä¡Æú´õ¿¡¼ wordfile.txt
¿¡ µ¡ºÙ¿© ÁÖ¸é µÈ´Ù.
ftp://ultraedit.com/wf/maxscript.txt
--------------------
max script·Î ´ÙÁß ¸Ê ä³Î µ¥ÀÌÅÍ »Ì¾Æ³»±â
--------------------
Max 3.0 ÀÌ»óºÎÅÍ´Â ÅØ½ºÃÄ ÁÂÇ¥¸¦ ¿©·¯ °³ °¡Áú ¼ö ÀÖ´Ù. ÇϳªÀÇ ¸Þ½¬¿¡ ¿©·¯ ä³ÎÀÇ
ÅØ½ºÃÄ ÁÂÇ¥¸¦ °¡Áú ¼ö ÀÖ°Ô µÇ¸é, °Ç¹°ÀÇ ¶óÀÌÆ® ¸Ê¿¡ ´ëÇÑ uvÁÂÇ¥¿Í µðÇ»Áî ¸Ê¿¡
´ëÇÑ uvÁÂÇ¥¸¦ ´Ù¸£°Ô °¡Áú ¼ö ÀÖ´Ù. ´ÙÁß Ã¤³Î µ¥ÀÌÅ͸¦ »Ì±â À§ÇÑ ¸í·ÉÀ¸·Î ´ÙÀ½°ú
°°Àº ¸í·ÉµéÀÌ ÀÖ´Ù.
meshop.setNumMaps / meshop.getNumMaps
: ¸Þ½¬ÀÇ ¸Ê ä³ÎÀ» ¾ò°Å³ª ¼³Á¤ÇÑ´Ù. ±âº»ÀûÀ¸·Î 2°³ÀÇ ¸ÅÇΠä³ÎÀ» °¡Áö´Âµ¥,
1¹ø°ú 2¹ø ä³ÎÀÌ ¹öÅØ½º »ö»ó°ú ±âº» ÅØ½ºÃÄ ¸Ê ä³Î·Î »ç¿ëµÈ´Ù.
meshop.setMapSupport / meshop.getMapSupport
: ÇØ´ç ¸Ê ä³ÎÀÌ »ç¿ëµÇ°í ÀÖ´Â Áö¸¦ ¾Ë·Á Áְųª, »ç¿ëÇÔÀ» ¾Ë¸°´Ù.
meshop.setNumMapVerts / meshop.getNumMapVerts
: ¸Ê ä³Î¿¡ ÇÒ´çµÈ ¹öÅØ½º °³¼ö¸¦ ¼³Á¤Çϰųª ¾ò´Â´Ù.
meshop.setMapVert / meshop.getMapVert
: ¸Ê ¹öÅØ½º¸¦ ¼³Á¤Çϰųª ¾ò´Â´Ù. ¸Ê ¹öÅØ½º´Â Point3±¸Á¶·Î¼ Åë»ó uvÁÂÇ¥°¡
µé¾î°¡°Ô µÈ´Ù.
meshop.setMapFace / meshop.getMapFace
: ¸Ê ÆäÀ̽º¸¦ ¼³Á¤Çϰųª ¾ò´Â´Ù. ¸Ê ÆäÀ̽º¿¡µµ Point3±¸Á¶À̳ª ¸Ê ¹öÅØ½º¿¡ ´ëÇÑ
À妽º°¡ µé¾î°£´Ù. ¹°·Ð, À妽º´Â 1ºÎÅÍ ½ÃÀÛÇÑ´Ù.
meshop.setNumTVerts / meshop.getNumTVerts
: ÀÏ¹Ý ÅØ½ºÃÄ ¸Ê ä³Î ¹öÅØ½º °³¼ö¸¦ ¾ò°Å³ª ¼³Á¤ÇÑ´Ù. set/getNumMapVerts ÀÇ 2¹ø
ä³ÎÀ» »ç¿ëÇÑ °Í°ú °°Àº °á°úÀÌ´Ù.
--------------------
maxscript·Î ¸ÓƼ¸®¾ó Á¤º¸ »Ì¾Æ³»±â
--------------------
¸Æ½º¿¡¼ ¸Þ½¬ÀÇ faceº°·Î ÀçÁúÀ» ´Ù¸£°Ô ¼±ÅÃÇÏ·Á¸é, Multi/Sub ÀçÁúÀ» ¸¸µé¾î¼
ÇÏ´Â °ÍÀÌ Á¤¼®ÀÌÁö¸¸, ±×·¸°Ô ÇÏÁö ¾Ê¾Ò´õ¶óµµ, ³»ºÎÀûÀ¸·Î´Â Multi/Sub ÀçÁúÀÌ
Çϳª ¸¸µé¾îÁý´Ï´Ù. ´ÙÀ½ÀÇ ÄÚµå´Â °¢ face ´ÜÀ§·Î ÀçÁúÀÇ À̸§À» Ãâ·ÂÇÏ´Â
ÄÚµåÀÔ´Ï´Ù.
for o in objects do
(
faceCount = o.numfaces
for k = 1 to do
(
mtlid = (getFaceMatID o k)
-- if no diffuse map enabled, skip
if (o.material[mtlid].maps[2] == undefined) then continue
-- if no diffuse texture exists, skip
if (o.material[mtlid].maps[2].filename == undefined) then continue
-- get the diffuse map filename
texture_full_path = o.material[mtlid].maps[2].filename
texture_name = filenameFromPath texture_full_path
format "texture_name = %\n" texture_name
)
)
--------------------
maxscript ·Î ÇÇÁöÅ© Á¤º¸ »Ì¾Æ³»±â
--------------------
ij¸¯ÅÍ ½ºÆ©µð¿À 3.x ¿¡¼ ÇÇÁöÅ©¿¡ ´ëÇÑ Á¤º¸¸¦ ½ºÅ©¸³Æ®·Î »Ì¾Æ³»·Á¸é,
1. ¾Æ·¡ÀÇ »çÀÌÆ®¿¡¼ IPhysique.zip¸¦ ´Ù¿î¹Þ´Â´Ù.
http://www.max3d.com/plugins/r4/IPhysique.zip
http://sparks.discreet.com/downloads/downloadshome.cfm?f=2&wf_id=65
(µî·ÏÀ» ÇØ¾ß ´Ù¿î¹ÞÀ» ¼ö ÀÖÁö¸¸, µî·ÏÀº °øÂ¥ÀÌ¸ç µî·ÏÇÒ °¡Ä¡ ÃæºÐÈ÷ ÀÖÀ½)
2. IPhisique.gup ÆÄÀÏÀ» /plugins µð·ºÅ丮¿¡ º¹»çÇÑ´Ù.
3. »ç¿ë¹ýÀº µ¿ºÀµÈ IPhysique.doc ÆÄÀÏ¿¡ ÀÖ´Ù.
4. °£´ÜÇÑ »ç¿ë¿¹.
> physiqueops.getAPIversion $box01
--------------------
max sciprt·Î ÇÇÁöÅ© Á¤º¸ »©³»¿À±â
(IPhysique »ç¿ë)
--------------------
-------------------------------------
-- physique script extract example --
--
-- ´ÙÀ½ÀÇ Ç÷¯±×ÀÎÀÌ ÇÊ¿äÇÏ´Ù.
--
-- http://sparks.discreet.com/downloads/downloadshome.cfm?f=2&wf_id=65
-- (¶Ç´Â http://www.max3d.com/plugins/r4/IPhysique.zip )
--
-- by zho@korea.com
-- 2002.12.26
-------------------------------------
function extract_physique_info physiqued_obj =
(
po = physiqued_obj
pm = physiqueOps.getPhysiqueModifier po
ver = physiqueOps.getAPIVersion po modifier:pm
bone_arr = physiqueOps.getBones po modifier:pm
vertex_count = physiqueOps.getVertexCount po modifier:pm
format "ÃÑ ¹öÅØ½º °³¼ö : %\n" vertex_count
for v_index = 1 to vertex_count do
(
-- check vertex type
-- physiqueOps.getVertexType po v_index modifier:pm
format "¹öÅØ½º ¹øÈ£[%] : " v_index
affected_bone_count = physiqueOps.getVertexBoneCount po v_index modifier:pm
format "ÃÑ %°³ÀÇ º»¿¡ ÀÇÇØ ¿µÇâ¹ÞÀ½\n" affected_bone_count
for b_index = 1 to affected_bone_count do
(
bone_node = physiqueOps.getVertexBone po v_index b_index modifier:pm
weight = physiqueOps.getVertexWeight po v_index b_index modifier:pm
offset = physiqueOps.getVertexOffset po v_index b_index modifier:pm
format "\tº»Á¤º¸ : À妽º[%]-" b_index
format "À̸§[%]-" bone_node.name
format "°¡ÁßÄ¡[%]-" weight
format "¿ÀÇÁ¼Â[%]\n" offset
)
format "\n"
)
)
extract_physique_info $Box01 -- sample test
---------- ½ÇÇà °á°ú -------------------
ÃÑ ¹öÅØ½º °³¼ö : 66
¹öÅØ½º ¹øÈ£[1] : ÃÑ 1°³ÀÇ º»¿¡ ÀÇÇØ ¿µÇâ¹ÞÀ½
º»Á¤º¸ : À妽º[1]-À̸§[Bip01 Pelvis]-°¡ÁßÄ¡[1.0]-¿ÀÇÁ¼Â[[-46.969,-32.857,5.82977]]
¹öÅØ½º ¹øÈ£[2] : ÃÑ 1°³ÀÇ º»¿¡ ÀÇÇØ ¿µÇâ¹ÞÀ½
º»Á¤º¸ : À妽º[1]-À̸§[Bip01 R Foot]-°¡ÁßÄ¡[1.0]-¿ÀÇÁ¼Â[[5.73779,0.0505373,6.23943]]
............
¹öÅØ½º ¹øÈ£[66] : ÃÑ 2°³ÀÇ º»¿¡ ÀÇÇØ ¿µÇâ¹ÞÀ½
º»Á¤º¸ : À妽º[1]-À̸§[Bip01 R Calf]-°¡ÁßÄ¡[0.973368]-¿ÀÇÁ¼Â[[15.982,-5.13998,-4.0716]]
º»Á¤º¸ : À妽º[2]-À̸§[Bip01 L Calf]-°¡ÁßÄ¡[0.0266323]-¿ÀÇÁ¼Â[[15.982,-5.13998,5.57165]]
--------------------
maxscript·Î Limb IK Èä³»³½ ÄÚµå
--------------------
-------------------------------------- begin of iktest.ms
--------------------------------------
-- Simple Limb Inverse Kinematics Test
-- by Jiho Choi (zho@korea.com)
-- from [ http://zho.pe.kr ]
-- 2002.10.28
--------------------------------------
resetMAXFile()
-- object creation
global initial_hip_rotation
global initial_knee_rotation
bone pos:[0, 0, 0] name:"hip"
bone pos:[103.707,-7.60097,0] name:"ankle"
bone pos:[56.633,-1.67554,0] name:"knee"
bone pos:[49.3482,-52.7234,0] name:"target"
-- construct parent-child hierarchy
$ankle.parent = $knee
$knee.parent = $hip
-- rotate segment by a given knee angle
fn rotate_segment segment angle_axis =
(
local local_pos = (in coordsys parent segment.pos)
in coordsys parent segment.pos -= local_pos -- align to segment's origin
in coordsys parent segment.rotation = angle_axis
in coordsys parent segment.pos += local_pos
in coordsys local segment.rotation = (quat 0 0 0 1)
)
-- compute rotation by from_vector and to_vector
-- returns AngleAxis value
fn get_rotation_from_vectors from_vector to_vector =
(
from_vector = from_vector
to_vector = to_vector
axis_vector = normalize (cross from_vector to_vector)
angle = acos (dot (normalize from_vector) (normalize to_vector))
return (angleAxis angle axis_vector)
)
-- get knee rotation axis
fn get_knee_axis =
(
knee_to_ankle = $ankle.pos - $knee.pos
knee_to_hip = $hip.pos - $knee.pos
knee_axis = normalize (cross knee_to_ankle knee_to_hip)
-- format "knee_axis = %, " knee_axis
return knee_axis
)
-- rotate hip segment directing to end-effector
fn rotate_hip =
(
rot = get_rotation_from_vectors $ankle.pos $target.pos
$hip.rotation = rot
)
fn get_knee_angle =
(
-- L^2 = L1^2 + L2^2 - 2*L1*L2*cos(theta)
l1 = distance $knee.pos $hip.pos
l2 = distance $ankle.pos $knee.pos
L = distance $target.pos $hip.pos
if (L > (l1 + l2)) do
(
L = l1 + l2 -- do not exceed total length
-- print "cannot reach"
)
knee_angle = acos ((l1*l1 + l2*l2 - L*L) / (2*l1*l2))
-- angle constraint
-- if (knee_angle < 10) do knee_angle = 10 -- minimum
-- if (knee_angle > 170) do knee_angle = 170
-- current knee_angle means inner angle, thus convert to outer angle
-- format "knee_angle = %\n" knee_angle
knee_angle = 180 - knee_angle
return knee_angle
)
fn rotate_knee =
(
knee_angle = get_knee_angle() - initial_knee_rotation.angle
-- knee_axis = get_knee_axis()
knee_axis = initial_knee_rotation.axis
rotate_segment $knee (angleAxis knee_angle knee_axis)
)
-- from initial configuration, compute knee axis for later use
initial_hip_rotation = $hip.rotation
initial_knee_rotation = get_rotation_from_vectors $knee.pos ($ankle.pos - $knee.pos)
viewport.activeViewport = 1
viewport.setType #view_top
max tool maximize
max move
select $target
when transform $target changes do
(
$hip.rotation = initial_hip_rotation
rotate_knee()
rotate_hip()
)
-------------------------------------- end of iktest.ms
|