티스토리 뷰

[원글 - 2007년 이글루스]


김용준님의 IT EXPERT 3D 게임프로그래밍 책으로 공부하다가

MAX는 스크립트를 이용하여

Vertex 정보와 Index 정보를 뽑아내는데

MAYA는 그런거 없을까?

라는 의문점을 가지고 직접 마야를 파헤쳐서

드디어 스크립트를 사용하여 정보를 뽑는 법을 알아내었다

======================================================================

[시작하기 전에]

시작하기 전에 반드시 집고 넘어가야 하는 점은

마야를 100%아는게 아니라 설명하긴 어렵지만

바로 History에 대한 정보이다

주로 여러 폴리곤들을 Combine 시켰을 때 나타나는데

다음 그림을 보도록 하자



위의 그림은 2개의 Cube를 Combine시킨 것인데

Combine 결과로 새로 생성된 폴리곤이 polySurface1이고

polySurface1은 합쳐진 2개의 pCube1과 pCube2의 정보를 History로 가지게 된다

이 경우 스크립트를 통한 Select과정에서 pCube1과 pCube2까지 선택이 되서

스크립트 오류가 뜨게 된다

그러므로 먼저 polySurface1의 History정보를 지워주고

그 다음 pCube1과 pCube2는 이제 polySurface1과 관계가 없으므로 그냥 지워주면 된다

아래 사진은 일련의 과정을 보여준다


1. Combine된 Polygon을 선택하고 History정보 삭제


2.Window->Outliner확인


 모양으로 된 것만 있어야 한다. 만일 첫번째 그림처럼

 모양으로 된 Object가 있다면 그냥 지워주자


당연한 이야기지만...

폴리곤의 기본 구성은 삼각형으로 구성되어 있는데

MAYA에서는 기본이 사각형이므로 반드시 모델링을 완성한 이후에

Polygons -> Triangulate 를 해줘야 한다는 것!!!

사전준비는 이정도면 대충 완료한 것 같다

MEL언어 자체에 대한 설명은

우리가 애니메이션 등을 컨트롤 하는 것이 아니라

기본적인 정보만을 빼올 것이기에

자세히 설명하지 않겠다

Script사용법도

C언어를 배우신 분들이라면 아마 Tutorial을 한번 읽어본 정도로

대충은 이해하실 거라 생각하기에 생략한다

[ Vertex 정보를 뽑아보자 ]

자 이제 바로 본론으로 넘어가서 정보들을 뽑아보도록하자

먼저 Vertex정보를 뽑아보도록 하자

다음은 스크립트 소스이다

select -ado;

string $a[];
$a = `ls -sl`;
 
$fileId = fopen("c:/vertex.txt","w");
 
string $str;
int $num[];
int $i;
float $pt[];
 
for($str in $a)
{
   $num = `polyEvaluate -v $str`; // vertex(정점)의 수가 얼마인가?
   fprint ($fileId, "name : "+$str+"\n");  // mesh의 이름
   fprint ($fileId, "num : "+$num[0]+"\n");  // mesh의 Vertex 수
  
   for($i=0;$i<$num[0];$i++)
  {
     fprint ($fileId, "<"+$i+"> ");
     $pt = `pointPosition -w ($str+".vtx["+$i+"]")`;
     fprint ($fileId, "( "+$pt[0]+", "+$pt[1]+", "+$pt[2]+" )\n");
   }
}
fclose $fileId;

1. select -ado;

먼저 Object들을 선택한다

2. string $a[]; 
     $a = `ls -sl`;

이 스크립트는 a라는 문자열 배열을 만들고

그 문자열 배열에 현재 선택된 Object들의 이름을 집어넣는다

3. string $str; 
    int $num[]; 
    int $i; 
    float $pt[];

문자열 str변수는 for문으로 a배열에서 str에 문자를 하나씩 뽑을 때 사용한다

정수형 num변수는 폴리곤의 Vertex(정점) 수를 일시적으로 저장하는데 쓰인다

정수형 i는 따로 말이 필요없다 for문 돌릴때 쓰인다

실수형 pt배열은 Vertex의 좌표를 일시적으로 저장하기 위해서 사용한다

4. for($str in $a)

C만 배우신 분들에게는 생소하게 보이시겠지만

MAX 스크립트나 MAYA의 MEL에는 이런 for문이 있다

굳이 설명하자면

a배열의 내용을 하나씩 str변수에 하나씩 집어넣으며

a배열의 내용을 모두 꺼냈다면 루프를 종료한다

5. $num = `polyEvaluate -v $str`;
    fprint ($fileId, "name : "+$str+"\n");
    fprint ($fileId, "num : "+$num[0]+"\n");

자 이제부터는 대충 훑어봐도 무슨 내용인지 이해가 갈 것이다

polyEvaluate는 폴리곤의 다양한 정보를 빼내는 script명령으로

flag로 '-v' 를 붙이면 Vertex(정점)의 수, '-f' 를 붙이면 Face(면)의 수 등을 리턴한다

str변수에는 현재 a배열에서 빼낸 Object의 이름이 들어있다

fprint는 뭔지 바로 알 것이다.

C의 fprintf와 비슷한 함수이다

fprint (파일포인터, 내용) 이라고 이해하면 된다.

미리 $fileId = fopen("c:/vertex.txt","w"); 라고 fileId라는 변수에 파일을 열어놨다

이름과 Vertex의 수를 각각 출력하고,

6. for($i=0;$i<$num[0];$i++) { 
        fprint ($fileId, "<"+$i+"> ");
        $pt = `pointPosition -w ($str+".vtx["+$i+"]")`;
         fprint ($fileId, "( "+$pt[0]+", "+$pt[1]+", "+$pt[2]+" )\n");
    }

Vertex의 수만큼 for문을 돌리면서

정점의 좌표를 찍는다

여기서 Vertex의 좌표는 'pointPosition' 이라는 스크립트 언어로 알아내는데

위처럼 flag로 '-w'를 붙이면 World좌표를 중심으로

flag를 '-l' 이라고 붙이면 Local좌표로

float형 배열로 결과를 리턴해준다

7. fclose $fileId;

파일을 사용이 끝났으므로 닫는다.


C등의 프로그래밍 언어를 배우신 분들은

이해하시는데 크게 어려움이 없으리라 본다


[ Index정보를 뽑아보자 ]

Index정보를 얻는 것도 위와 크게 다르지 않지만

다만 MEL에서 Index정보를 뽑아내는데에는

int형 배열로 리턴해주는 것이 아닌

string형으로 리턴을 해주기 때문에

결과를 자기가 원하는 형식으로 출력할 수가 없다

먼저 소스를 보도록하자.

select -ado;

string $a[];
$a = `ls -sl`;
 
$fileId = fopen("c:/index.txt","w");
 
string $object;
string $str[];
int $num[];
int $i;
 
for($object in $a)
{
   $num = `polyEvaluate -f $object`;         // face(면)의 수가 얼마인가?
   fprint ($fileId, "name : "+$object+"\n"); // mesh의 이름
   fprint ($fileId, "num : "+$num[0]+"\n");  // mesh의 Polygon 수
   select -r $object;

   $str = `polyInfo -fv`;
 
   for($i=0;$i<$num[0];$i++)
   {
       fprint($fileId, $str[$i]);
   }
}
 
fclose $fileId;

Vertex정보를 뽑을 때와 다른 점이 있다면

polyInfo라는 스크립트 언어인데...

polyInfo같은 경우는 선택된 Object의 정보를 뽑기 때문에

사전에 하나씩 선택을 해놔야 한다

이 때 사용되는 스크립트 언어가 ' select -r $object; ' 이다

Index정보를 뽑아내기 위해서

'polyInfo -fv'라는 스크립트 언어를 이용하는데

위 명령은 폴리곤의 face의 Index정보를 string으로 리턴한다

폴리곤 하나가 선택되었다면

그 선택된 폴리곤의 모든 Face의 Index 정보가 string형 배열로 리턴되므로

str변수는 string형 배열로 선언하였다


여기까지 하면 Vertex 정보와 Index 정보를 모두 뽑아낼 수 있었다

결과는 직접 뽑아보길 바란다

위의 두 스크립트는 서로 겹치는 변수명이 있기 때문에

프로그램을 한번 껏다 켜야하는 번거로움이 있으므로

위의 두 소스를 합쳐보았다

한번 사용해 보길 바란다

본 블로그의 Project 카테고리에 결과물 스크린샷을 올려놓았다

[ 최종 Script ]

select -ado;
string $a[];
$a = `ls -sl`;

$fileId = fopen("c:/vertex.txt","w");
string $object;
int $vnum[];
int $i;
float $pt[];
for($object in $a)
{
    $vnum = `polyEvaluate -v $object`;        // vertex(정점)의 수가 얼마인가?
    fprint ($fileId, "name : "+$object+"\n"); // mesh의 이름
    fprint ($fileId, "num : "+$vnum[0]+"\n"); // mesh의 Vertex 수
    for($i=0;$i<$vnum[0];$i++)
    {
        fprint ($fileId, "<"+$i+"> ");
        $pt = `pointPosition -w ($object+".vtx["+$i+"]")`;
        fprint ($fileId, "( "+$pt[0]+", "+$pt[1]+", "+$pt[2]+" )\n");
    }
}
fclose $fileId;

$fileId = fopen("c:/index.txt","w");
string $object;
string $str[];
int $fnum[];
for($object in $a)
{
    $num = `polyEvaluate -f $object`;         // face(면)의 수가 얼마인가?
    fprint ($fileId, "name : "+$object+"\n"); // mesh의 이름
    fprint ($fileId, "num : "+$num[0]+"\n");  // mesh의 Polygon 수
    select -r $object;
    $str = `polyInfo -fv`;
    for($i=0;$i<$num[0];$i++)
    {
        fprint($fileId, $str[$i]);
    }
}
fclose $fileId;


댓글
최근에 올라온 글
Total
Today
Yesterday
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31