메쉬 생성


3d 메쉬는 외부 모델 파일을 가져와 사용하는 방법이 있고
게임 엔진에서 직접 만드는 방법이 있습니다
godot 엔진의 메쉬 생성 기능과 종류
| 방법 | 노드 | 용도 | 장점 |
| 외부 에셋 가져오기 | meshinstance3d | 정적 3d 모델 | 쉽고 빠름 |
| 절차적 생성(유연) | arraymesh, surfacetool | 복잡한 동적지형 | 유연한 데이터 구축 |
| 절차적 생성(실시간) | immediatemesh | 실시간 디버그 , 빠르게 변하는 도형 | 런타임에 가장 빠르게 메쉬 테이터 전송 및 업데이트 가능 |
| 대량 랜더링 | multimeshinstance3d | 풀, 나무, 수많은 반복 객체 | 최고의 랜더링 성능 |
ImmediateMesh

immediate mesh는 동적 지오메트리를 생성하는 편리한 도구입니다
매 프레임마다 업데이트해야 하는 간단한 메시에 사용하기 편리합니다
meshinstant3d 객체에 immediateMesh 객체를 넣어 사용합니다
_read()에서 한 번만 생성한 후 _proecess()에서 각 프레임마다 업데이트 합니다
ImmediateMesh 객체를 만들 때
그 것에 사용할 마테리얼도 할당합니다
ClearsurFaces()를 사용하여 immediateMesh로 만든 메쉬를 사라지게 하여 초기화 하고
SurfaceEnd()를 사용하여 새 표면에 만든 메시를 추가합니다
surfacebegin()를 사용하여 법선이나 UV와 같은 정점별 속성을 추가합니다
surfacebegine() 안에 들어가는 열거형 값은 아래와 같습니다
mesh.primitivetype.Lines


하나의 선을 긋는데 2개의 벡터 좌표가 필요하며
SurfaceAddVertex()에 start, end 로컬 벡터 좌표를 사용해
선 모형의 메시를 그리며
버텍스 수가 짝수에 맞지 않으면 컴파일 에러가 나오게 됩니다
godot 엔진의 인게임 내에 기즈모를 쉽게 구현하는데 사용할 수도 있습니다
Triangles


Line에서는 버텍스(정점)을 찍어 선을 그엇다면
트라이앵글에서는
1) 2D 텍스트 좌표인 UV와
2) 버텍스가 향하는 방향인 노멀을 추가한 뒤
3) 버텍스를 추가합니다
UV와 노멀은 입력하는 버텍스에 들어가는 속성이 되며
uv와 노멀의 코드 순서는 상관 없지만
버텍스의 위치는 그 마지막이 되어야 합니다
버텍스와 메쉬 표현 방향



[고도에서는 버텍스를 찍는 순서가 시계방향인 쪽이 앞쪽이 됩니다]
폴리곤 메쉬를 앞면과 뒷면을 모두 그리게 되면
메모리가 더 소모되기 때문에
기본적으로 앞면만 그리게 되지만
마테리얼에 있는 transparency에 있는 cull mode를 설정하여
앞면 혹은 뒷면
그리고 양면 모두를 그릴 수도 있습니다
UV


UV는 만든 메쉬에 텍스쳐를 입히기 위한 2D텍스쳐 좌표입니다
사용 텍스쳐는 마테리얼에 할당한 것이며
좌표는 이미지의 크기와 비율에 상관 없이
왼쪽 상단이 중심점으로 0,0 좌표이며
오른쪽은 x +=1
하단은 y +=1 을 가지게 됩니다


고도에서 UV 좌표를 설정하면
다음에 나오는 버텍스의 속성으로 들어가기 때문에
오른쪽 같은 코드를 사용하면
왼쪽의 결과가 나오게됩니다
normal



버택스 노멀은 버텍스가 바라보는 방향이 어디인지를 정하는 백터 방향입니다
버텍스 노멀을 사용하여 빛 반사와 스무 쉐이딩 계산입니다
고도엔진에서의 트라이앵글은 단일 페이스로 y으로 빛 반사를 할 것이기 때문에
vector3(0,1,0)으로 되어 있으며
여러 페이스가 모여 있다면 왼쪽의 블렌더 이미지 처럼
백터를 계산하여 적용해야 합니다
points, LineStrip, TriangleStrip

위에 설명한 기능들 외에도 3가지 가 더 있습니다
points

버텍스 좌표에 버텍스 한 점을 찍습니다
마테리얼이나 쉐이더를 이용하여 그 크기를 조절할 수 있습니다
LinesStrip


lines에서는 짝수의 버텍스 좌표를 이어 선을 그엇다면
strip은 버텍스 좌표들을 이어 선을 긋습니다
strip으로 lines와 같은 것을 긋는다면
그래픽에 보내는 버텍스 정보가 더 적어 메모리를 덜 먹게 됩니다
TriangleStrip


triangleStrip은 버텍스 3개를 이용하여 첫 삼각형을 만든 후
그 후는 만든 삼각형의 마지막 좌표2개에 새로운 좌표 1개를 넣어
삼각형을 만드는식으로 계속 추가하게 됩니다
예)
삼각형 1) v1, v2, v3
삼각형 2) v2, v3, v4
삼각형 3) v3, v4, v5
.....
이것도 보통의 삼각형 보다 버텍스 좌표를 덜 사용하기 때문에
메모리를 적게 사용하게 됩니다
끝