zho.pe.kr

[¼Ò°³] - [½ºÅ©¸°¼¦] - [ÀÛ¾÷½Ç] - [ÈÞ°Ô½Ç] - [±ØÀå] - [¸µÅ©] - [Àϱâ] - [±Û¾²±â]

:: ¸ñ·ÏÀ» º¸·Á¸é ¿©±â¸¦ Ŭ¸¯ ::


ÃÖÁöÈ£(zho¾ÜkoreaÁ¡com)
2001.08.18
 
ÀÌ ¹®¼­´Â Á¦°¡ 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
 
[top]

- bye zho -

¨Ï 2001-2006 Choi Jiho. all Nights reserved.