Houdini 절차적 프롭 생성 파이프라인에 AI 텍스트 프롬프트 파라미터 연동하기
Houdini HDA와 SOP 네트워크에 AI 텍스트 프롬프트를 연결하는 방법을 설명합니다. 자연어를 검증 가능한 JSON 파라미터로 변환해 절차적 프롭 생성, 재현성, 아티스트 승인 흐름까지 설계합니다.

핵심 요약
AI 텍스트 프롬프트를 Houdini SOP 네트워크에 직접 연결하지 말고 먼저 JSON Schema로 검증 가능한 구조화 데이터로 변환해야 합니다. 이후 JSON 필드를 HDA 파라미터에 매핑하면 자연어 의도를 유지하면서도 치수, 손상도, 반복 수, 시드 값을 재현 가능한 절차적 프롭 생성 입력으로 사용할 수 있습니다. 핵심은 AI를 지오메트리 생성기가 아니라 파라미터 추출기와 아티스트 인터페이스로 사용하는 것입니다.
Houdini 절차적 프롭 생성에 AI 프롬프트가 필요한 이유
절차적 프롭은 동일한 생성 규칙으로 상자, 나무 판자, 금속 패널, 파이프 같은 여러 에셋을 빠르게 변형할 수 있습니다. 하지만 기존 HDA는 아티스트가 슬라이더와 토글을 직접 조정해야 하므로 원하는 형태를 설명하는 데 시간이 걸립니다.
예를 들어 다음 두 입력은 같은 의도를 가리킬 수 있습니다.
- 낡은 나무 상자
- 모서리가 닳고 판자가 불규칙하며 금속 보강재가 있는 오래된 나무 크레이트
AI 텍스트 프롬프트를 사용하면 이런 자연어를 다음과 같은 파라미터 집합으로 바꿀 수 있습니다.
| 자연어 의도 | 구조화 파라미터 | Houdini에서의 사용 |
|---|---|---|
| 오래된 나무 | material = wood | 재질, 색상, 거칠기 선택 |
| 모서리가 닳음 | bevel = 0.035 | PolyBevel 폭 조절 |
| 판자가 불규칙함 | warp_amount = 0.18 | 노이즈 기반 변형 강도 |
| 금속 보강재 | hardware = true | 금속 파츠 생성 분기 |
| 작은 크레이트 | scale = 0.75 | 최종 크기 배율 |
문제는 자유형 텍스트가 Houdini 파라미터의 타입과 범위를 보장하지 않는다는 점입니다. damage_amount에 very old가 들어가거나 width에 large가 들어가면 SOP 네트워크가 안정적으로 작동하지 않습니다.
자유형 프롬프트를 Houdini 파라미터에 바로 연결하면 안 되는 이유는?
| 문제 | 발생 원인 | 대응 방법 |
|---|---|---|
| 값의 타입 오류 | 숫자 대신 형용사가 반환됨 | JSON Schema와 타입 변환 |
| 결과 재현성 부족 | 같은 문장도 AI 응답이 달라짐 | seed, 프롬프트 해시, 모델 버전 저장 |
| 파라미터 범위 초과 | 손상도가 1.0을 초과하거나 음수가 됨 | 최소·최대값 클램프 |
| 의도와 구현의 불일치 | 모호한 표현을 임의로 해석함 | enum과 기본값 정의 |
| SOP 쿠킹 불안정 | 네트워크 요청이 쿠킹 과정에 섞임 | 외부 요청과 지오메트리 생성을 분리 |
권장 구조는 다음과 같습니다.
- 아티스트가 자연어 프롬프트를 입력합니다.
- AI 계층이 정해진 스키마의 JSON을 반환합니다.
- 검증 계층이 타입, 범위, enum, 필수 필드를 검사합니다.
- 검증된 값을 Houdini HDA 파라미터에 전달합니다.
- HDA 내부의 SOP 네트워크가 지오메트리와 재질 속성을 생성합니다.
권장 아키텍처는 어떻게 구성할까?
Houdini 20.5 이상에서 사용하는 SOP/HDA, VEX, Python API를 기준으로 보면 AI 연동 계층은 HDA 내부의 지오메트리 로직과 분리하는 편이 안전합니다. AI 서비스 호출은 Python Panel, Shelf Tool, 외부 에디터 플러그인 또는 PDG 작업에서 처리하고 SOP는 이미 검증된 파라미터만 읽도록 구성합니다.
flowchart LR
A[아티스트 프롬프트] --> B[AI 파라미터 추출]
B --> C[JSON Schema 검증]
C --> D[HDA 파라미터 매핑]
D --> E[Houdini SOP 네트워크]
E --> F[FBX 또는 USD 출력]
C --> G[오류 수정 또는 재질의]
G --> B

이 구조에서 중요한 경계는 AI 응답 생성과 SOP 쿠킹 사이입니다. 네트워크가 끊기거나 AI 응답 형식이 바뀌어도 이미 저장된 JSON을 사용하면 동일한 에셋을 다시 생성할 수 있습니다.
프롬프트를 파라미터 스키마로 설계하는 방법
먼저 HDA가 실제로 제어할 수 있는 파라미터만 스키마에 포함합니다. AI가 추상적인 미술 용어를 반환하더라도 최종적으로는 Houdini 노드가 이해할 수 있는 숫자, 불리언, 문자열 enum으로 변환되어야 합니다.
예시 파라미터 스키마는 다음과 같습니다.
| 필드 | 타입 | 범위 또는 값 | 연결할 HDA 파라미터 | 역할 |
|---|---|---|---|---|
asset_type | string | crate, barrel, panel | asset_type | 프롭 종류 선택 |
material | string | wood, metal, stone | material | 재질 분기 |
width | number | 0.1~5.0 | width | 폭, 미터 단위 |
height | number | 0.1~5.0 | height | 높이, 미터 단위 |
depth | number | 0.1~5.0 | depth | 깊이, 미터 단위 |
bevel | number | 0.0~0.2 | bevel | 모서리 폭 |
damage_amount | number | 0.0~1.0 | damage_amount | 손상 및 마모 강도 |
plank_count | integer | 1~32 | plank_count | 판자 분할 수 |
hardware | boolean | true 또는 false | hardware | 금속 파츠 생성 여부 |
seed | integer | 양의 정수 | seed | 결과 재현성 |
자연어를 바로 수치로 추정하기보다 의미 등급을 먼저 정의하는 것도 유용합니다. 예를 들어 낡은을 damage_level = 0.65로 매핑하는 규칙을 프로젝트 설정 파일에 저장하면 모델이 바뀌어도 결과 편차를 줄일 수 있습니다.
AI 응답은 어떤 JSON 형태가 좋은가?
AI 계층에는 마크다운이나 설명문이 아니라 JSON 객체만 반환하도록 지시합니다. 아래는 크레이트 생성에 사용할 수 있는 최소 응답 예시입니다.
{
"schema_version": "1.0",
"asset_type": "crate",
"material": "wood",
"width": 1.2,
"height": 0.8,
"depth": 0.9,
"bevel": 0.035,
"damage_amount": 0.65,
"plank_count": 8,
"hardware": true,
"seed": 42,
"notes": "불규칙한 판자 간격과 중간 정도의 모서리 마모"
}
수치형 필드는 반드시 단위를 명시해야 합니다. 게임 에셋 파이프라인에서 Houdini 장면의 기본 단위를 미터로 정했다면 프롬프트 변환 계층도 모든 치수를 미터로 정규화해야 합니다.
수치 정규화는 다음 원칙으로 처리할 수 있습니다.
notes처럼 사람이 읽는 설명 필드는 검증 대상 파라미터와 분리합니다. SOP 노드가 notes를 읽어 임의의 지오메트리 결정을 내리게 하면 결과 재현성이 떨어집니다.
HDA 인터페이스는 어떻게 구성할까?
HDA에는 다음 그룹을 두는 방식이 관리하기 쉽습니다.
Prompt Metadata: 원본 프롬프트,schema_version, 프롬프트 해시Dimensions: 폭, 높이, 깊이Construction: 판자 수, 접합부, 보강재Surface: 베벨, 노이즈 변형, 손상도Variation: 시드와 변형 프로파일Output: FBX, USD, 머티리얼 속성 출력 옵션
원본 프롬프트는 결과를 직접 생성하는 입력이 아니라 기록과 재생성에 사용하는 메타데이터로 취급합니다. 실제 SOP 네트워크는 width, bevel, damage_amount, seed처럼 명확한 파라미터만 사용해야 합니다.

Houdini Python API로 JSON을 HDA에 매핑하는 방법
아래 코드는 이미 검증된 JSON 문자열을 HDA의 ai_payload 파라미터에서 읽고 주요 필드를 Houdini 파라미터에 전달하는 예시입니다. 실제 프로젝트에서는 JSON Schema 검증을 매핑 전에 수행해야 합니다.
import json
import hou
node = hou.node('/obj/prop_hda')
payload_text = node.parm('ai_payload').eval()
data = json.loads(payload_text)
mapping = {
'width': 'width',
'height': 'height',
'depth': 'depth',
'bevel': 'bevel',
'damage_amount': 'damage_amount',
'plank_count': 'plank_count',
'hardware': 'hardware',
'material': 'material'
}
for source_name, parm_name in mapping.items():
parm = node.parm(parm_name)
if parm is not None and source_name in data:
parm.set(data[source_name])
if node.parm('seed') is not None:
node.parm('seed').set(int(data.get('seed', 1)))
parm.set() 호출 전에는 반드시 파라미터 타입과 범위를 검사합니다. 예를 들어 damage_amount는 0.0과 1.0 사이로 제한하고 plank_count는 정수로 변환해야 합니다.
def clamp(value, low, high):
return max(low, min(float(value), high))
data['damage_amount'] = clamp(data.get('damage_amount', 0.0), 0.0, 1.0)
data['bevel'] = clamp(data.get('bevel', 0.02), 0.0, 0.2)
data['plank_count'] = max(1, min(int(data.get('plank_count', 4)), 32))
외부 AI API를 호출하는 코드는 SOP 노드의 쿠킹 함수 안에 넣지 않는 것이 좋습니다. 대신 요청 결과를 JSON 파일, 노드 파라미터, 작업 큐 데이터로 저장한 뒤 Houdini가 그 결과를 읽게 하면 네트워크 지연과 일시적 오류가 지오메트리 생성에 직접 영향을 주지 않습니다.
SOP 네트워크에서는 어떤 방식으로 프롭을 생성할까?
AI가 전달한 파라미터는 기존 절차적 모델링 규칙을 제어하는 값이어야 합니다. 예를 들어 크레이트 HDA는 다음과 같은 SOP 구성을 사용할 수 있습니다.
Box SOP또는 커스텀 기본 메시에width,height,depth를 적용합니다.Copy to Points로 판자 또는 금속 보강재를 반복 배치합니다.Transform Pieces또는Attribute Adjust로 판자마다 작은 회전과 위치 변이를 부여합니다.PolyBevel SOP의 폭을bevel파라미터에 연결합니다.Attribute Noise또는Mountain SOP로 표면 변형을 추가합니다.Boolean SOP또는 마스크 기반 변형으로 손상 영역을 만듭니다.Normal SOP, 머티리얼 속성, 출력 노드에서 최종 데이터를 정리합니다.
VEX에서는 시드와 위치를 함께 사용해 변형을 재현할 수 있습니다.
int seed = chi('seed');
float damage = clamp(chf('damage_amount'), 0.0, 1.0);
float n = noise(@P * 4.0 + float(seed));
@P.y += max(n - 0.65, 0.0) * damage * 0.03;
위 코드는 표면 위치를 직접 변형하는 단순 예시입니다. 실제 에셋에서는 프롭의 스케일에 따라 노이즈 주파수를 보정하고 파괴 영역을 저장한 damage_mask나 curvature 어트리뷰트를 재질과 후속 SOP에서 재사용하는 편이 좋습니다.
AI 프롬프트 연동을 단계별로 구현하기
1단계: HDA 파라미터와 범위를 먼저 고정한다
AI를 연결하기 전에 HDA가 수동 조작으로 원하는 결과를 낼 수 있어야 합니다. 각 파라미터의 타입, 기본값, 최소값, 최대값, 단위를 정하고 노드 내부에서 직접 검증합니다.
예를 들어 다음과 같이 정의할 수 있습니다.
width: float, 기본값 1.0, 단위 mdamage_amount: float, 기본값 0.2, 범위 0.0~1.0plank_count: integer, 기본값 4, 범위 1~32hardware: toggleseed: integer, 기본값 1
2단계: 자연어를 제한된 어휘로 변환한다
프롬프트 변환기는 wooden crate를 asset_type = crate, old를 damage_amount = 0.65처럼 프로젝트에서 정의한 어휘와 수치로 바꿉니다. metallic wood처럼 충돌하는 표현이 나오면 임의로 처리하지 말고 경고 상태로 반환해 아티스트가 확인하도록 합니다.
AI 요청에 사용할 지시문은 다음처럼 작성할 수 있습니다.
다음 프롬프트를 게임용 절차적 프롭 파라미터로 변환하라.
반드시 지정된 JSON 필드만 반환하고 마크다운과 설명문은 출력하지 마라.
치수 단위는 미터다.
asset_type은 crate, barrel, panel 중 하나다.
material은 wood, metal, stone 중 하나다.
damage_amount는 0.0부터 1.0 사이의 숫자다.
plank_count는 1부터 32 사이의 정수다.
알 수 없는 값은 기본값으로 대체하고 warnings 배열에 기록하라.
3단계: JSON Schema로 응답을 검증한다
검증 항목은 필수 필드, 자료형, enum, 숫자 범위, 추가 필드 허용 여부입니다. schema_version을 포함하면 HDA가 업데이트된 뒤에도 과거 결과를 구분할 수 있습니다.
검증에 실패하면 SOP를 실행하지 않고 다음 정보를 표시합니다.
- 실패한 필드명
- 기대한 타입 또는 범위
- 현재 반환된 값
- 수정 후 다시 요청할 수 있는 자연어 설명
4단계: HDA에 매핑하고 결과를 캐시한다
검증된 JSON을 HDA에 전달한 뒤 hou.Node.cook(force=True) 또는 사용자 인터페이스의 수동 재생성 버튼으로 결과를 갱신할 수 있습니다. 자동 쿠킹을 사용할 때는 슬라이더 이동마다 AI 요청이 발생하지 않도록 요청 단계와 미리보기 단계를 분리해야 합니다.
캐시 키에는 다음 값을 포함하는 것이 안전합니다.
| 캐시 정보 | 목적 |
|---|---|
prompt_hash | 원본 프롬프트 식별 |
schema_version | 파라미터 구조 구분 |
seed | 변형 결과 재현 |
hda_version | 생성 규칙 변경 추적 |
houdini_version | 실행 환경 기록 |
5단계: 아티스트 승인 후 엔진용 포맷으로 출력한다
생성 결과는 뷰포트에서 실루엣, 스케일, 베벨, 충돌 메시, UV, 머티리얼 슬롯을 확인한 뒤 확정합니다. 이후 프로젝트 요구에 따라 FBX 또는 USD로 출력하고 게임 엔진에서는 임포트 규칙에 맞춰 LOD와 콜리전 데이터를 점검합니다.
프롬프트보다 중요한 재현성 관리
AI 결과는 동일한 문장이라도 모델 버전이나 시스템 지시문이 바뀌면 달라질 수 있습니다. 따라서 최종 지오메트리를 재현하려면 다음 세 가지를 함께 저장해야 합니다.
- AI가 반환한 구조화 JSON
- Houdini HDA 정의와 버전
seed와 생성 환경 정보
프롬프트 원문만 저장하면 충분하지 않습니다. 프롬프트에서 JSON을 다시 추출하는 모델이 변경되면 파라미터가 달라질 수 있기 때문입니다. 승인된 JSON을 에셋의 생성 입력으로 보관하고 프롬프트는 원본 의도를 추적하는 메타데이터로 유지하는 것이 안정적입니다.
자주 묻는 질문 FAQ
자유형 프롬프트를 HDA에 그대로 넣어도 되나요?
권장하지 않습니다. 자유형 텍스트는 자료형과 범위를 보장하지 않으므로 AI 응답을 JSON Schema로 검증한 뒤 HDA 파라미터에 전달해야 합니다.
AI가 지오메트리를 직접 생성하게 하는 방식과 무엇이 다른가요?
이 방식은 AI가 최종 메시를 직접 생성하지 않고 HDA의 파라미터를 결정합니다. 따라서 기존 SOP 규칙, UV, 머티리얼 속성, 콜리전 생성 로직을 재사용할 수 있고 결과 재현성도 관리하기 쉽습니다.
Houdini에서 AI API를 직접 호출해도 되나요?
기술적으로는 가능하지만 SOP 쿠킹 중 네트워크 요청을 실행하면 지연과 실패가 지오메트리 생성에 영향을 줍니다. Python Panel, Shelf Tool, 외부 변환기 또는 PDG 단계에서 JSON을 먼저 생성하고 Houdini는 로컬 결과를 읽는 구조가 더 안전합니다.
정리
Houdini 절차적 프롭 파이프라인에 AI 텍스트 프롬프트를 연동할 때 가장 중요한 설계 원칙은 자연어와 지오메트리 사이에 검증 가능한 파라미터 계층을 두는 것입니다. JSON Schema, HDA 파라미터 매핑, VEX 기반 시드 제어, 생성 결과 캐시를 함께 사용하면 아티스트의 의도를 빠르게 반영하면서도 게임 에셋 제작에 필요한 품질과 재현성을 유지할 수 있습니다.



