[blender node] 03. Texture Coordinate node (1)
Texture Coordinate
블렌더의 texture coordinate 노드에 대해 알아보겠습니다.
이 texture coordinate 노드는 3d 오브젝트에 이미지를 표현할 때 아주 중요한 역할을 해줍니다.
아래 벽돌 텍스처를 3d 상의 오브젝트에 표현해 보겠습니다.
Texture Coordinate는 아래 그림처럼 이미지 오브젝트 앞에 붙어서 작동합니다. 3d 오브젝트에 이미지를 표현할 때, 3d 오브젝트에 이미지를 입힐 좌표를 만들어 줍니다.
이게 처음에는 직관적으로 보이지 않을 수도 있습니다.
아래 그림처럼 '이미지를 불러오고, 그 이미지 위치를 오른쪽으로 1m 움직이겠다. 그러면 3d 상에서도 이미지가 오른쪽으로 1m 이동하지 않을까?' 이렇게 생각하는 게 더 맞아 보이기도 하고요.
하지만 블렌더에는 이미지를 움직일 수 있는 노드가 없습니다.
아래 그림처럼 오브젝트에 좌표를 만들어 놓고 그 좌표에 이미지를 입히는 방식입니다.
그래서 아래처럼 연결해 줘야 올바로 작동합니다. Texture Coordinate는 좌표를 생성하는 기준을 의미합니다. Texture Coordinate는 3d 오브젝트에 좌표를 만들어 줍니다. 그렇게 만들어진 좌표를 기준으로 이미지를 입혀주는 것이죠.
또한 이 좌표를 조절해 주는 게 mapping 노드입니다. mapping 노드에서 x축으로 1m 움직이면 3d 오브젝트의 좌표가 x축으로 1m 움직입니다. 그러면 거기에 맞춰 이미지를 입혀줍니다.
그래서 texture coordinate 뒤에 mapping 노드를 함께 연결해서 사용합니다. texture coordinate가 좌표를 만들어 주고, 이렇게 생성된 좌표를 mapping 노드가 움직여주는 겁니다.
그런데 이미지 텍스처 노드에서 Repeat 명령으로 이미지가 반복되도록 설정해 놓았기 때문에, mapping 노드의 location 수치를 바꾸면 이미지가 이동하는 것처럼 보이는 겁니다.
이미지를 움직인 게 아니라 이미지를 표현해 주는 좌표를 움직인 게 이미지를 움직여 주는 것처럼 보이는 거죠. 발상의 전환이랄까요. 마치 아래 그림에 빨간색으로 표시한 별을 보여주다 파란색 표시한 곳으로 좌표를 옮겨갔는데, 뷰포트 상에서는 이미지가 왼쪽으로 움직이는 걸로 보이는 것처럼요.
그리고 Texture coordinate 노드에 연결되지 않은 상태에서는 좌표를 UV에 맞춰 자동으로 만들어 줍니다. Texture coordinate 없이 이미지 노드만 가져다 써도 잘 표현되었던 이유입니다.
texture coordinate의 좌푯값을 하나씩 알아보도록 하겠습니다.
Texture Coordinate 소켓
Generated
Generated는 오브젝트의 크기를 기준으로 0~1 사이의 좌표를 만들어 줍니다.
오브젝트의 크기란 아래 그림과 같이 오브젝트 전체 크기를 감싸는 박스를 의미합니다. 이 박스를 기준으로 좌표를 만들어 주는 겁니다.
점 하나를 복사해서 멀리 두면, 그 점까지 바운딩 박스 범위로 들어갑니다.
아래 그림처럼 좌표대로 이미지를 매핑해 줍니다.
이미지 역시 (0,0) ~ (1,1)로 표현되는 2d 좌표를 가집니다. 이 좌표를 기준으로 3d 좌표에 이미지를 표현해 주는 겁니다.
따라서 아래 그림처럼 오브젝트를 X축으로 길게 늘여주면, 늘어난 오브젝트를 기준으로 이미지도 쭉 늘어난 것처럼 보이게 됩니다.
또 하나 살펴볼 것은 이미지의 projection 방식입니다. 이미지를 3d 오브젝트에 입힐 때 어떻게 투영할 것인지를 결정해 줍니다.
flat 방식은 말 그대로 한 면에 평평하게 투영해서 이미지를 오브젝트에 표현해 줍니다. 그래서 이미지의 x, y 좌표가 3d 오브젝트의 x, y 좌표에만 표현되죠. 하지만 3d 오브젝트는 x, y 좌표만 가지는 게 아닙니다. z축도 가지죠. 그래서 이미지도 3d 좌표로 투영시켜 줄 필요가 있습니다. 박스 좌표는 이미지의 x, y 좌표를 3d 오브젝트의 x, y 좌표, x, z 좌표, y, z 좌표 각각에 이미지의 x, y 좌표를 옮기는 것처럼 투영해 줍니다.
이렇게 x, y, z 3개 축에 별도의 텍스처 매핑을 하는 기술을 tri-planar 매핑이라고 합니다.
그래서 Generate로 3d 오브젝트에 좌표를 만들어 줄 때, 이미지의 투영 방식을 flat으로 설정하면, y, z 축으로는 이미지가 투영되지 않아 이상하게 표현될 수 있습니다.
아래처럼 구에 이미지를 매핑해 보겠습니다.
오브젝트는 구이지만, 아래 그림처럼 바운딩 박스를 기준으로 좌표를 만들어 매핑됩니다. 그러다 보니 3면이 만나는 곳에서 이미지가 겹치는 곳이 발생합니다. 이곳이 매우 부자연스러워 보이죠.
아래 그림처럼 blend 옵션으로 각각의 면이 맵핑될 때, 블렌딩 되는 정도를 조절해 이미지를 섞어 줍니다. 이미지의 자연스러운 전환을 만들어 주는 기능입니다.
각 축의 이미지를 섞어서 자연스러워 보이게 만들어 줍니다.
보통은 그런데... 위 그림처럼 벽돌이 딱딱 들어맞아야 하는 이미지는 오히려 이상하게 보이네요.
그래도 좌우로는 알게 모르게 부드럽게 섞였습니다.
Object
object는 3d 오브젝트 자체의 로컬 좌표를 사용합니다. 오브젝트의 기준은 오리진이죠. 이 오리진을 (0,0,0)으로 하는 좌표를 만들어 줍니다.
아래 그림처럼 표현되죠.
generate는 오브젝트의 크기에 맞춰 좌표도 0~1로 조정되었죠. 하지만 object는 오브젝트의 로컬 좌표계를 사용하므로, 오브젝트가 커져도 좌표 크기가 바뀌지는 않습니다.
이미지 노드에서 repeat을 clip으로 바꿔보면, 이미지가 반복되지 않고 끊어집니다. 이미지 좌표에서 0~1 범위를 넘어가면 더 이상 표현해 주지 않는 겁니다. 좌표가 음수이거나 1을 넘어가는 곳에서는 이미지를 맵핑해 주지 않은 걸 볼 수 있습니다. generate에서는 이미지가 늘어지기는 해도, 표현되지 않는 곳은 없었습니다.
아래 그림처럼 오브젝트 좌표에 맞춰 이미지를 표현해 줍니다.
이미지를 repeat 옵션으로 반복시켜 놓으니, 맵핑이 오브젝트 전체에 다 된 것처럼 보이는 것뿐입니다.
아래 그림처럼 오브젝트를 한 방향으로만 확대했을 때, generated는 이미지가 한쪽으로 늘어나는 경향이 있습니다. object는 이미지가 늘어나지는 않지만, 같은 모양이 반복되게 됩니다.
그래서 generated에서 이미지가 너무 늘어지면, 아래 그림처럼 mapping 노드를 통해 좌표 scale을 좀 수정해 주어야 합니다.
또한 Generated는 아래 그림처럼 오브젝트에 변형이 발생했을 때, 이미지가 오브젝트를 따라 함께 변형합니다. 좌표 자체가 오브젝트를 따라 변형되니까요. 그런데 Object 좌표에서는 이미지가 오브젝트를 따라 함께 변형하지 않습니다. generated와 달리 object의 좌표는 고정되어 있습니다. 고정된 좌표에서 오브젝트가 움직이면 좌푯값이 달라지고, 달라진 좌표에 해당하는 이미지를 매핑해 줍니다. 오브젝트가 변화하는 씬에서는 이게 아주 부자연스러워 보입니다. 손등에 점이 있는데, 손이 움직여도 점이 따라오지 않는 것과 같습니다.
UV
UV가 아마도 3d 오브젝트에 이미지를 입히는 가장 보편적인 방법일 겁니다. 직관적이고 사용자의 입맛대로 다루기도 좋습니다.
UV는 아래 그림처럼 오브젝트의 UV를 기준으로 좌표를 만들어 줍니다.
그런데 uv 좌표에서는 Box 매핑이 되지 않습니다.
아래 그림처럼 Flat으로 설정해 줘야 제대로 맵핑이 됩니다.
아래 그림처럼 SpreadSheet로 들어가면 이 오브젝트를 구성하는 성분들을 볼 수 있습니다.
하나의 오브젝트는 12개의 vertex, 20개의 Edge, 10개의 Face로 이루어져 있습니다. 점과 점이 모여 선과 면을 이루고, 이 면으로 하나의 물체, 즉 오브젝트를 표현하게 됩니다. 이 덩어리를 메쉬라고 하는데, 이 메쉬를 가져다 3d 상에 물체를 표현해 나가는 것이죠.
그런데, 밑에 보면 Face Corner라고 40개나 되는 데이터가 또 있습니다.
눌러보면 아래처럼 속성값에 UVMap이라는 값을 볼 수 있습니다. 이게 오브젝트의 UV 좌표를 표현해 줍니다.
3d 상에서는 하나의 점이지만, uv 상에서는 이 점이 3개로 표현됩니다. 각각의 면을 2차원에 표현하다 보니 3개로 표현돼야 하죠.
vertex는 (x, y, z) 3개의 차원을 가지지만, uv에서는 (x, y) 2개의 차원만 가지다 보니 UVMap에서 더 많은 점이 필요합니다.
뭐, 아무튼 아래 Flat은 (x, y) 두 개의 차원으로 표현될 수 있습니다. 이걸 UVMap (u, v) 좌표에 맞게 이미지를 매핑해 주는 겁니다.
반면, Box는 (x, y, z)인데 UVMap (u, v) 좌표에서 z를 표현해 줄 수 있는 차원이 부족하죠. 그래서 z는 0으로 표현됩니다.
사실 이런저런 이야기를 복잡하게 했지만... 아래 그림처럼 이미지가 이상하게 표현될 때는 이유가 있습니다.
오브젝트에 이미지를 매핑할 좌표를 3차원으로 표현해 놓고, 2차원 매핑 방식을 사용한다거나...
uv처럼 2차원 좌표로 표현해 놓고, 3차원 매핑 방식을 사용한다거나... 해서 그렇죠.
이미지가 이상하게 나오면 projection 방식이 Box 인지, Flat 인지 확인해서 맞춰 주시면 됩니다.
[blender node] 03. Texture Coordinate node (1)
[blender node] 03. Texture Coordinate node (1) - 연결된 글입니다.
03. Texture Coordinate node (1)
03. Texture Coordinate node (2)
03. Texture Coordinate node (3)
03. Texture Coordinate node (4)
03. Texture Coordinate node (5)
03. Texture Coordinate node (6)
'블렌더 > 쉐이더' 카테고리의 다른 글
[blender node] 03. Texture Coordinate node (3) (1) | 2024.01.04 |
---|---|
[blender node] 03. Texture Coordinate node (2) (1) | 2024.01.03 |
[blender node] 02. Mix Color (7) - 마스크를 이용한 이미지 합성 (1) | 2023.12.27 |
[blender node] 02. Mix Color (6) - RGB 3채널 (2) | 2023.12.26 |
[blender node] 02. Mix Color (5) (0) | 2023.12.25 |