상세 컨텐츠

본문 제목

hCurve v0.2 개발 과정

Maya_Plugin_Development /hCurve

by hwano 2014. 9. 26. 11:50

본문

아이콘과 쉘프 정리

 

작동이 쉽도록 좀 더 단순하게 버튼화

hCurve에 집어넣기 위해 예전에 만들었던 treeSet 아이콘들도 집어넣었다

 

 

 

 

 

profile curve 적용과정을 버튼화 시키자

 

커스텀 커브를 profile curve로 hCVL_curve를 path curve로 이용하여

폴리와 넙스화 시키는 버튼을 만들어보자.

 

버튼을 추가 해 주었다.

 

 

 

######작업할 목록들

 

1. profile curve와 path curve를 선택하여 버튼을 누르면 메쉬화 되도록 자동화하자.

2. profile curve를 먼저 선택하게 하고 path curve를 선택하되,  path curve는

   복수로 선택할 수 있도록 한다.

3. profile curve가 열린 curve면 만들어진 폴리곤도 열린 모양이 반영이 되도록 하자.

4. 메쉬가 만들어지면서 가장 기본 재질이 적용되도록하자.

5. 메쉬가 만들어질때 노말이 정상적이 되도록 하자.

 

-------------------------------------------------------------------------------------------

 

 

CVLocator가 일직선으로 배치되어있는 경우 메쉬생성문제

 

 

Create CV hCurve 버튼을 눌러서 hCVLocator들이 일직선상으로 배열되어있는 커브를 만들고

그 커브를 이용해 바로 폴리화 시키면 메쉬 생성이 정상적으로 되지 않는다.

 

이는 curve의 안쪽방향을 가르키는 normal이 curve가 곡률이 전혀없는 상태이므로

0값이 되버려서 일텐데 이를 수정해 보자. 

 

 

노말이 모두 0값이면

n.x = 0

n.y = 0

n.z = 1

이 되도록 해서 이를 해결하였다.

 

 

 

 

 

 

profile curve의 열림 닫힘 적용

 

 

profile curve의 cv갯수와 위치만을 파악해서

이를 메쉬의 vertex로 치환해서 사용하기 때문에 profile curve의 open/close가

적용이 안되고 있다. 이를 적용 시켜보자.

 

int curveForm  = inputProfileCurveFn.form();

 

열림 닫힘 상태는 위 값으로 읽어올수 있는데

당혀있으면 3 열려있으면 1이 반환된다.

 

주의할 점이 열려있을때는

inputProfileCurveFn.numCVs(); CV갯수를 가져와야되고

닫혀있을땐

inputProfileCurveFn.numSpans(); Span갯수를 가져와야 된다.

위만 조심하면 큰 문제 없이 적용된다.

 

 

 

 

노말을 정리해보자.

 

 

노말을 정리해보자. 

두가지 노말을 정리해야하는데 우선 닫힌 커브를 profile curve로 사용한 메쉬의 경우

페이스 노말이 뒤집혀 있는데 이를 바로 잡아야 한다.

 

또한 초기 set normal angle값이 너무 높게 설정되어 만들어 지는데 이를 낮추어야 한다.

 

두번째 것은 그냥 스크립트로 해도 무방하지만 api 쪽에서 해결할 수 있는 방법을 체크 해 볼것.

 

 

첫번째 방법 -

mfnmesh쪽에 getNormals, setNormals가 있다.

MfloatVectorArray로 노말들을 가져올수 있는데 inverse해서 다시 집어넣으면 될듯.

 

getNormals, setNormals로 뺐다가 다시 넣었는데 엄한 vertex normal만 틀어진다.

 

MFloatVectorArray normalArray;
normalArray.setLength( numPolys ); <-
editMesh.getNormals( normalArray );

 

getNormals로 값을 가져올때 MFloatVectorArray의 길이를 numPolys로 잡았다.

난 폴리곤의 노말값이 나오는지 알았지.

 

getNormals의 api문서 설명을 보면

This method copies the normal list for this mesh into the given array.

The normals are the per-polygon per-vertex normals.

 

이렇게 되어 있다. per-polygon per-vertex란 말이 무슨말인지 모르겠다.

각폴리곤의 노말, 각폴리곤에 속한 버텍스 노말 1, 2, 3, 4 란 말인지

각폴리곤에 속한 버텍스 노말 1, 2, 3, 4 의 나열이라는 건지..   근데 결과만보면

 

 

폴리곤 노말이 뒤집어 진건 하나도 없고 버텍스 노말만 값이 이상하게 다 뒤틀어져있다.

아무래도 폴리곤에 속한 버텍스 노말 값들만 뽑혀져 나온다는 말인거 같다.

 

 

------  

 

여기서 집고 넘어갈것이

http://sin3514.tistory.com/234

페이지에 써놨던 것처럼

 

M뭐시기Array  클래스들을 쓸때 바로 set을 하면 에러가 나서

위에서 numPolys로 먼저 전체 크기를 잡아주었는데 여기서는 그 과정이 필요없다.

 

변수들을 프린트해보니

numPolys는 88이었고 normalArray의 setLength를 numPolys, 즉 88개로 잡아놨지만

getNormals( normalArray )로 값을 받은 후의 normalArray.length()값 출력해 보면 96으로

늘어나 있다. set으로 바로 집어넣는 경우가 아니면 어레이의 길이는 자동으로

세팅되는거 같다.

 

------

 

다시 돌아와 getNormals로 받아진 normalArray의 length가 위에 테스트 했던 폴리곤 오브젝트의

버텍스 수와 일치하므로 getNormals는 폴리곤의 노말은 제외하고 폴리곤에 속한

버텍스 노말만 가져온다는 뜻이다.   

 

 

사실 이렇게 복잡하게 생각안해도 마야에서 display vertex normal을 킬수 있다...

까먹고 있었다. 켜보면 profile curve를 움직일때마다 vertex normal들만 엉망으로 돌아가는 것을 볼 수 있다.

 

 

 

폴리곤 노말은 api문서에

 

Per-polygon normals Polygonal objects store a normal for each polygon. These normals can be accessed via MItMeshPolygon::getNormal(normal) or MFnMesh::getPolygonNormal. So, a cube, which is comprised of 6 polygons would contain 6 such normals.

 

 

위 두 방법으로 가져올수 있다고 되어있다.  문제는

getPolygonNormal은 있는데 setPolygonNormal은 없다.

set으로 시작되는 노말관련 메서드들은 전부 버텍스노말과 관련한것들밖에 없어서

폴리곤 노말 값으로 받아온 벡터를 계산으로 뒤집더라도 어떻게 이 벡터값들을

다시 적용시킬수있는지 모르겠다.

 

 

 

찾아보니 이런 얘기가 있다.

 

You cannot set polygon normals - they are computed by Maya, and as such you can't change them. The only thing you can explicitly set are the vertex-normals. If it's just a poly winding( 폴리곤 굴곡?으로 해석해야하나 ) issue, change the index winding for the polys. If you want to set all vertex normals to be the same as the face normal, either set them manually using MFnMesh::setFaceVertexNormals, or just set the normal smoothing angle to zero.

 It's not trivial for me to check the winding order for my mesh faces, and as I have to set normals anyway, it would be nice to do it in my plugin.

 It is! Do a cross product between two edge vectors of each poly to get the face normal. Then do a dot product with one of your vertex normals. If the answer is less than zero, reverse the face winding.

 

 

폴리곤 노말을 사용자가 컨트롤은 할 수 없다는 거고, 버텍스 노말만을 움직일수 있다는데

버텍스 노말을 뒤집어도 폴리곤 노말은 뒤집어지지 않았다..  어찌하는지 모르겠다.

 

노말을 이용하는건 다음에 더 테스트 해보고 그냥

nCurve 오브젝트를 생성할때 스크립트로 뒤집거나,  아님 폴리곤을 만들때 버텍스 순서를 반대로

해보자. 버텍스 순서에 따라 폴리곤 노말 방향이 결정될 수도 있으니까.

 

아,,  해결되었음.  api상에서 normal을 컨트롤하는건 이것저것 다 해봤는데 답을 못찾겠고

버텍스 순서를 바꿔주는걸로 해결했다.  시계방향을 반시계 방향으로 뒤집는 방식으로

노말을 뒤집을 수 있었다.

 

 

 

 

###### 이후 작업할 목록들

 

1. Set Normal Angle값을 수정하자.

2. hCurve Poly의 Cap을 만들자.

   평면으로 잘려진 cap과 둥그런 cap 두가지버젼으로 만들어지도록 하자.

3. 애니메이션이 가능한 Start, End, Offset, Radius 등을 만들자.

4. hCurve Nurbs 만들기

 

 

 

-------------------------------------------------------------------------------------------

 

Set Normal Angle 수정

 

 

폴리곤이 만들어지면 set normal angle값이 180도 정도로 매우 크게 되어있다.

만들어진 오브젝트의 각들이 모두 둥글둥글하게 되어 있다.

처음 오브젝트가 생성될 당시 set normal angle값이 60도 정도가 되도록 수정해 보자.

 

 

 

 

 

관련글 더보기