TECHARTNOMAD | TECHARTFLOWIO.COM

3DSMAX

Leaf Gradient Tool for Max. Update

jplee 2025. 11. 14. 22:15

2022년 가을 즈음 바이트덴스에서 근무 할 때 프로젝트 B 였던 것으로 기억하는데 그때 폴리지 쪽 윈드 가중치 작업을 할 때 불편한게 이만저만이 아니라서 내가 관리 하던 테크아트팀의 DCC 툴 담당자에게 이렇게 만들어 봐라 해서 만들었던 적이 있습니다.
같은 원리로 다시 만들어 봤습니다. 고객사에서 딱히 요청은 하지 않으셨지만 아마도 아티스트들이 엄청 힘들어서 작업을 안하는게 아닌가 하는 그런 생각이 들었어요.

보통 이런 폴리지는 몇 번의 가중치 작업을 해야 할 때도 있습니다. 특히 절차적으로 모델링 되지 않은 경우에 말이죠. 어셋 스토어에서 구매 했다든가 직접 모델링을 했다던가 말이죠. 어셋 스토어에서 구매 한 데이터의 가중치 데이터가 우리가 사용하는 셰이더와 완전히 결합 되지도 않을 것이기 때문에 아티스트가 꼼꼼히 작업 해 줘야 합니다.
최근 언리얼 엔진 5.7 에서 선보인 프로시주얼 플렌트 플러그인 이라면.... 흣흣. 
리프 메시가 구부러져 있거나 복잡한 형태일 때 거리만으로는 제대로 된 그라디언트가 안 나오더라고요. 그래서 좀 더 찾아보니 Epic의 PivotPainter에서 쓰는 선형 투영 방식이 있었습니다. 줄기에서 끝으로 향하는 방향 벡터를 만들고, 각 버텍스를 이 벡터에 투영해서 값을 구하는 방식이었죠. 수학적으로는 내적을 쓰는 건데, 실제로 적용해보니 메시 형태와 상관없이 정확한 결과가 나왔습니다. 이 부분에서 시간을 좀 썼지만, 기초를 제대로 잡으니까 나중에 다른 문제들이 훨씬 쉬워졌습니다.

선형 투영의 이론적 배경
선형 투영(Linear Projection)은 벡터 공간에서 한 점을 특정 방향으로 투영하는 수학적 방법입니다.
구체적으로, 시작 점 S와 끝 점 E가 주어졌을 때, 방향 벡터 D = E - S를 정의합니다. 임의의 버텍스 V에 대해, V에서 S로의 벡터 V - S를 방향 벡터 D에 투영하면 다음과 같이 계산됩니다:
투영 길이 = ((V - S) · D) / |D|²
여기서 · 는 내적(dot product)을 의미하며, |D|는 벡터 D의 길이입니다. 이 투영 길이를 0과 1 사이로 정규화하면 그라디언트 값이 됩니다. 0은 줄기, 1은 끝을 나타냅니다.
이 방식의 핵심 장점은 메시의 실제 형태와 무관하게 일관된 그라디언트를 생성한다는 것입니다. 리프가 구부러져 있거나 뒤틀려 있어도, 각 버텍스는 시작-끝 방향선 상의 논리적 위치에 따라 값을 부여받습니다. 단순 거리 기반 방식에서는 구부러진 부분에서 그라디언트가 왜곡되지만, 선형 투영은 이러한 문제를 해결합니다.

하지만 워낙 작업량이 많기 때문에 매번 줄기 버텍스랑 끝 버텍스를 수동으로 찾을 수는 없었습니다. 그래서 자동 모드를 만들었습니다. 아티스트들이 보통 리프 모델링할 때 피벗을 줄기 쪽에 두니까, 피벗에서 제일 가까운 버텍스를 줄기로, 제일 먼 버텍스를 끝으로 잡으면 되겠다 싶었죠. 실제로 해보니 거의 대부분 정확하게 잡히더라고요.
다만 버텍스가 많을 때 progress bar를 매번 업데이트하니까 오히려 느려지는 문제가 있었습니다. 그래서 전체 버텍스의 1% 정도만 업데이트하도록 간격을 조정했습니다. 사소해 보이지만 이런 디테일이 실제 사용할 때 체감됬습니다.
이 상태로는 엔진에 넣고 셰이더 적용하면 그라디언트가 너무 딱딱하게 끊기는 느낌이 있습니다. 특히 메시 토폴로지가 고르지 않은 부분에서 더욱 심하게 부각됩니다. 평균을 내어 스무딩 옵션을 추가했습니다. 각 버텍스와 엣지로 연결된 이웃 버텍스들의 평균을 내는 방식이며 옵션으로 분리 하여 사용성 측면도 생각했습니다.

 

2025년 11월 13일 버전 3.0
선형투영으로 얻은 값 0 부터 1 값을 커브를 사용하여 폴리지 메시 특성에 맞게 수정할 수 있도록 변경.


2025년 11월 13일 버전 2.0

모드는 이렇게 2가지로 나뉩니다.
설명 보다는 첨부 한 영상을 보면 아~ 하고 이해하실 듯 합니다.