조아마시

쓸모 있는 상세페이지 만들기

3D

Node Geometry

joamashi 2025. 3. 17. 16:06
반응형

Node Geometry의 개념과 활용

"Node Geometry"는 그래픽, 3D 모델링, 데이터 구조 등 다양한 분야에서 사용됩니다. 여기서는 가장 많이 사용되는 주요 개념을 중심으로 설명하겠습니다.


1. 3D 그래픽 및 프로시저 모델링에서 Node Geometry

1.1. Geometry Nodes (Blender)

Blender의 Geometry Nodes는 노드 기반 시스템을 사용하여 모델을 생성, 변형, 조합할 수 있는 기능입니다.

주요 개념

  • 프로시저 모델링: 수동 조작 없이 매개변수를 변경하여 자동으로 기하학적 구조를 생성함.
  • 비파괴적 편집: 원본 지오메트리를 변경하지 않고 여러 개의 노드를 조합하여 새로운 모델을 생성함.
  • 재사용 가능성: 한 번 만든 노드 그래프를 여러 프로젝트에서 활용할 수 있음.

Geometry Nodes에서 사용되는 주요 노드

  • Primitive Nodes: 기본적인 형상(큐브, 스피어, 토러스 등)을 생성하는 노드.
  • Transform Nodes: 지오메트리를 이동, 회전, 스케일 변경하는 노드.
  • Attribute Nodes: 점, 엣지, 면과 같은 속성을 추가하거나 수정하는 노드.
  • Boolean Nodes: 두 개의 지오메트리를 합치거나 빼는 등의 연산을 수행하는 노드.

활용 사례

  • 절차적으로 복잡한 구조물(건물, 자연 요소 등) 생성
  • 랜덤한 오브젝트 배치(나무, 돌 등)
  • 애니메이션을 위한 동적 지오메트리 변형

1.2. Houdini의 Geometry Nodes

Houdini에서도 노드 기반의 Geometry Network를 사용하여 프로시저 방식으로 모델을 생성합니다.
Blender와 비교하여 더 강력한 시뮬레이션 및 VFX 기능을 제공합니다.

Geometry Nodes 예제 (Houdini)

  • Terrain 생성: 노드를 연결해 자동으로 산맥이나 지형을 생성
  • 파티클 시스템과 연동하여 복잡한 환경 시뮬레이션 구현
  • 인스턴싱을 이용해 수천 개의 오브젝트를 효율적으로 렌더링

2. 그래프 이론(Graph Theory)과 Node Geometry

"Node Geometry"는 그래프 이론에서도 중요한 개념으로 사용됩니다.

그래프 이론에서 노드와 지오메트리 관계

  • Node (Vertex): 점(노드)은 객체나 데이터를 나타냄.
  • Edge (간선): 노드 간의 연결을 나타내며, 방향성이 있을 수도 있음.
  • Weight (가중치): 엣지에 부여된 값으로 거리, 비용, 중요도를 나타냄.

예제

  1. 도로 네트워크: 도시의 교차점(노드)과 도로(엣지)로 구성됨.
  2. 소셜 네트워크 분석: 사람을 노드로, 관계를 엣지로 표현하여 네트워크 분석 수행.

3. Three.js에서 Node Geometry 사용

Three.js는 WebXR 및 웹기반 3D 그래픽을 렌더링하는 데 사용되는 라이브러리로, BufferGeometry를 활용하여 3D 객체를 생성합니다.

Three.js에서 Geometry Nodes 활용 예제

const geometry = new THREE.BoxGeometry(1, 1, 1);  // 1x1x1 크기의 정육면체 생성
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });  
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

위 코드에서는 BoxGeometry를 사용하여 큐브(정육면체)를 생성하고, 재질(Material)을 설정한 후 씬(scene)에 추가합니다.

Node 기반 시스템을 활용한 Scene Graph

  • Three.js에서는 씬 그래프(Scene Graph) 구조를 사용하여 객체를 계층적으로 배치함.
  • 부모-자식 관계를 설정하여 한 오브젝트가 변형되면 그 자식 오브젝트도 영향을 받음.
  • 예제: 계층 구조 설정
const parent = new THREE.Object3D();
const child = new THREE.Mesh(new THREE.SphereGeometry(0.5), new THREE.MeshBasicMaterial({ color: 0xff0000 }));
parent.add(child);
scene.add(parent);

위 코드에서는 parent라는 오브젝트를 생성하고, child를 추가하여 계층적인 관계를 만듭니다.


4. Node Geometry의 실제 활용 사례

게임 및 실시간 렌더링

  • 노드 기반 시스템을 활용하여 씬을 최적화하고, 실시간으로 동적인 환경을 생성함.
  • 예: Unreal Engine, Unity에서 노드 그래프를 활용하여 씬과 VFX 생성

영화 및 애니메이션 VFX

  • Houdini, Blender, Maya에서 Geometry Nodes를 사용하여 특수 효과 생성
  • 파티클, 폭발 효과, 파괴 애니메이션 등을 프로시저 방식으로 생성

AI 및 데이터 분석

  • 소셜 네트워크 분석, 경로 최적화, 데이터 시각화 등에서 노드 기반 그래프 활용

결론

Node Geometry는 3D 그래픽, 그래프 이론, 게임 개발 등 다양한 분야에서 사용됩니다.

  • Blender, Houdini에서는 프로시저 모델링을 위한 시스템
  • 그래프 이론에서는 데이터 구조 및 네트워크 분석
  • Three.js에서는 웹 기반 3D 그래픽의 씬 구조를 관리하는 개념

 

Three.js Node Geometry 개념과 활용

Node Geometry는 Three.js에서 ShaderNode 기반의 모듈화된 지오메트리 시스템을 의미합니다. 이를 통해 기존의 BufferGeometry보다 더 효율적으로 GPU를 활용하고, 노드 기반으로 지오메트리를 생성할 수 있습니다.

Three.js의 노드 시스템 (Node Material System) 과 함께 활용되며, GLSL과 유사한 ShaderGraph 방식으로 구성됩니다.


1. Node Geometry의 핵심 개념

  • 모듈화된 노드 시스템: 개별 지오메트리 연산을 노드로 조합 가능
  • GPU 최적화: 쉐이더 코드 최적화 및 병렬 처리 활용
  • 유연한 파라미터 설정: 실시간으로 변화하는 데이터 적용 가능
  • 절차적 지오메트리 생성 가능: 예를 들어, noise, sin, cos 등을 활용하여 프랙탈, 패턴 등을 생성 가능

2. Node Geometry의 주요 클래스

Three.js에서 NodeGeometry를 활용하려면 three/examples/jsm/nodes 모듈을 활용해야 합니다.

클래스 설명

NodeGeometry Node 기반으로 지오메트리를 생성하는 기본 클래스
FloatNode 특정 값을 float 타입으로 저장하는 노드
Vector3Node Vector3 값을 저장하는 노드
PositionNode Vertex Position을 정의하는 노드
NormalNode 법선 벡터를 반환하는 노드
NoiseNode 노이즈 효과를 적용하는 노드
OperatorNode +, -, *, / 등의 연산을 수행하는 노드
FunctionNode GLSL 함수를 정의하는 노드
UVNode UV 좌표를 반환하는 노드

3. Node Geometry 예제 코드

예제 1: 기본적인 Node Geometry 생성

import * as THREE from 'three';
import { NodeGeometry } from 'three/examples/jsm/nodes/Nodes.js';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();

renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

const geometry = new NodeGeometry();
const material = new THREE.MeshStandardMaterial({ color: 0x44aa88 });
const mesh = new THREE.Mesh(geometry, material);

scene.add(mesh);
camera.position.z = 5;

function animate() {
    requestAnimationFrame(animate);
    mesh.rotation.x += 0.01;
    mesh.rotation.y += 0.01;
    renderer.render(scene, camera);
}

animate();

💡 설명:

  • NodeGeometry를 사용하여 기본적인 지오메트리를 생성합니다.
  • MeshStandardMaterial을 사용하여 조명을 반영하는 기본적인 머티리얼을 적용합니다.
  • animate 함수에서 회전 애니메이션을 추가합니다.

예제 2: 노드 기반의 지오메트리 변형

import * as THREE from 'three';
import { NodeGeometry, PositionNode, OperatorNode, FloatNode } from 'three/examples/jsm/nodes/Nodes.js';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();

renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 노드 기반 지오메트리 생성
const geometry = new NodeGeometry();

// Vertex Position 노드 생성
const positionNode = new PositionNode();

// Y축을 Sin으로 변형하여 파도 효과를 줌
const timeNode = new FloatNode(0);
const waveNode = new OperatorNode(positionNode.y, timeNode, OperatorNode.MUL);

geometry.addNode(waveNode);

const material = new THREE.MeshStandardMaterial({ color: 0x4488aa, wireframe: true });
const mesh = new THREE.Mesh(geometry, material);

scene.add(mesh);
camera.position.z = 5;

function animate() {
    requestAnimationFrame(animate);
    timeNode.value += 0.05;  // 시간에 따라 변화
    renderer.render(scene, camera);
}

animate();

💡 설명:

  • PositionNode를 사용하여 Vertex Position을 조작
  • OperatorNode를 활용해 sin(time * y)과 같은 파도 효과를 적용
  • 실시간으로 파형이 변형되는 애니메이션 구현

예제 3: 절차적 노이즈 적용

import * as THREE from 'three';
import { NodeGeometry, NoiseNode, PositionNode, OperatorNode } from 'three/examples/jsm/nodes/Nodes.js';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();

renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 노드 기반 지오메트리 생성
const geometry = new NodeGeometry();
const positionNode = new PositionNode();

// Perlin Noise 적용
const noiseNode = new NoiseNode(positionNode);

// Y축에 노이즈 적용
const displacementNode = new OperatorNode(positionNode.y, noiseNode, OperatorNode.ADD);
geometry.addNode(displacementNode);

const material = new THREE.MeshStandardMaterial({ color: 0x7777ff, wireframe: true });
const mesh = new THREE.Mesh(geometry, material);

scene.add(mesh);
camera.position.z = 5;

function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}

animate();

💡 설명:

  • NoiseNode를 사용하여 Perlin Noise 기반의 변형 적용
  • OperatorNode를 활용하여 position.y + noise의 효과 추가
  • 랜덤한 지형 효과를 만들 때 활용 가능

4. Node Geometry의 확장 활용

Node Geometry는 단순한 BufferGeometry보다 훨씬 동적이고 커스텀화된 효과를 줄 수 있습니다. 활용 예시는 다음과 같습니다.

응용 분야 활용 예시

절차적 모델링 노이즈를 활용한 산맥, 파도, 오브젝트 변형
애니메이션 효과 Vertex Position을 실시간으로 조작하여 물결, 탄력 있는 효과
쉐이더 최적화 GPU에서 직접 지오메트리를 계산하여 성능 향상
데이터 시각화 수치 데이터를 직접 Vertex Position에 매핑

5. Node Geometry vs. BufferGeometry 비교

NodeGeometry BufferGeometry

성능 GPU 최적화 CPU에서 데이터 생성 후 GPU로 전송
유연성 절차적 생성 가능 정적인 지오메트리
확장성 노드 조합 가능 커스텀 연산이 어렵고 코드량이 많음

6. 마무리

Node Geometry는 Three.js에서 절차적 지오메트리 및 GPU 최적화를 위한 강력한 기능입니다.
노드 기반으로 연산을 조합하여 복잡한 변형 및 애니메이션을 쉽게 구현할 수 있으며, ShaderNode 시스템과 결합하면 더욱 강력한 효과를 낼 수 있습니다.

✔️ 실제 프로젝트에서 적용할 때, 기존 BufferGeometry보다 성능 최적화가 필요한 경우 적극 활용하면 좋습니다. 🚀

 

Three.js Node Geometry - 예제 코드

Node Geometry는 Three.js에서 절차적 지오메트리를 생성하고 GPU 최적화된 형태로 처리할 수 있도록 돕는 강력한 기능입니다.
아래 10가지 예제를 통해 Node Geometry의 다양한 활용법을 살펴보겠습니다.


1. 기본적인 Node Geometry 생성

Node Geometry를 사용하여 기본 지오메트리를 생성하는 예제입니다.

import * as THREE from 'three';
import { NodeGeometry } from 'three/examples/jsm/nodes/Nodes.js';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 기본 노드 지오메트리 생성
const geometry = new NodeGeometry();
const material = new THREE.MeshStandardMaterial({ color: 0x44aa88 });
const mesh = new THREE.Mesh(geometry, material);

scene.add(mesh);
camera.position.z = 5;

function animate() {
    requestAnimationFrame(animate);
    mesh.rotation.x += 0.01;
    mesh.rotation.y += 0.01;
    renderer.render(scene, camera);
}

animate();

2. Sine 곡선을 활용한 Vertex 변형

Sin 함수를 사용하여 Vertex 위치를 조정하는 예제입니다.

import { NodeGeometry, PositionNode, OperatorNode, FloatNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const positionNode = new PositionNode();

// Sin을 사용한 변형
const timeNode = new FloatNode(0);
const waveNode = new OperatorNode(positionNode.y, timeNode, OperatorNode.MUL);
geometry.addNode(waveNode);

3. Perlin Noise를 활용한 랜덤 지형 생성

import { NodeGeometry, NoiseNode, PositionNode, OperatorNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const positionNode = new PositionNode();
const noiseNode = new NoiseNode(positionNode);
const displacementNode = new OperatorNode(positionNode.y, noiseNode, OperatorNode.ADD);
geometry.addNode(displacementNode);

4. UV 좌표를 이용한 그리드 패턴 적용

import { NodeGeometry, UVNode, OperatorNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const uvNode = new UVNode();
const gridNode = new OperatorNode(uvNode.x, uvNode.y, OperatorNode.MUL);
geometry.addNode(gridNode);

5. 원형으로 변형된 Vertex 좌표

import { NodeGeometry, PositionNode, MathNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const positionNode = new PositionNode();
const circularNode = new MathNode(positionNode.x, MathNode.SIN);
geometry.addNode(circularNode);

6. 시간에 따라 변화하는 Vertex 변형

import { NodeGeometry, FloatNode, OperatorNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const timeNode = new FloatNode(0);
const waveNode = new OperatorNode(timeNode, timeNode, OperatorNode.MUL);
geometry.addNode(waveNode);

function animate() {
    requestAnimationFrame(animate);
    timeNode.value += 0.05;
}
animate();

7. 삼각함수를 사용한 진동 효과

import { NodeGeometry, PositionNode, OperatorNode, MathNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const positionNode = new PositionNode();
const sineNode = new MathNode(positionNode.y, MathNode.SIN);
const scaleNode = new OperatorNode(sineNode, new FloatNode(2), OperatorNode.MUL);
geometry.addNode(scaleNode);

8. Vertex Normal을 이용한 입체감 추가

import { NodeGeometry, NormalNode, OperatorNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const normalNode = new NormalNode();
const depthNode = new OperatorNode(normalNode.z, new FloatNode(0.5), OperatorNode.ADD);
geometry.addNode(depthNode);

9. 스크롤 이벤트를 반영한 변형

import { NodeGeometry, FloatNode, OperatorNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const scrollNode = new FloatNode(window.scrollY);
const dynamicNode = new OperatorNode(scrollNode, new FloatNode(0.1), OperatorNode.MUL);
geometry.addNode(dynamicNode);

window.addEventListener("scroll", () => {
    scrollNode.value = window.scrollY * 0.01;
});

10. 점진적으로 확대되는 Vertex 변형

import { NodeGeometry, FloatNode, OperatorNode } from 'three/examples/jsm/nodes/Nodes.js';

const geometry = new NodeGeometry();
const scaleNode = new FloatNode(1);
const growNode = new OperatorNode(scaleNode, new FloatNode(0.01), OperatorNode.ADD);
geometry.addNode(growNode);

function animate() {
    requestAnimationFrame(animate);
    scaleNode.value += 0.01;
}
animate();

예제는 Node Geometry를 활용하여 다양한 지오메트리 변형과 효과를 추가하는 방법을 보여줍니다.
Three.js의 노드 시스템을 활용하면 더욱 효율적으로 GPU에서 지오메트리를 처리할 수 있으며, 절차적으로 복잡한 형상을 만들 수 있습니다. 🚀

728x90
반응형