첫번째 노드 만들기
Creating Your First Node — Omniverse Extensions documentation
Creating Your First Node As we now understand how to work with the graph using existing nodes, this section of the tutorials walks through how to create new nodes to augment the existing functionality. OmniGraph uses a framework we call OGN (OmniGraph Node
docs.omniverse.nvidia.com
이제 기존 노드를 사용하여 그래프를 사용하는 방법을 이해했으므로 자습서의 이 섹션에서는 새 노드를 생성하여 기존 기능을 확장하는 방법에 대해 설명합니다. OmniGraph는 노드 생성을 위해 OGN(OmniGraph Nodes)이라는 프레임워크를 사용합니다. OGN은 노드에 대한 높은 수준의 설명을 사용하고 노드에 필요한 대부분의 구현을 생성하는 강력한 프레임워크입니다. 이 튜토리얼에서는 파이썬 코드를 생성하지만 C++와 같은 다른 언어에서도 코드를 생성할 수 있습니다. 또한 노드에 대한 문서 및 테스트도 생성할 수 있습니다.
DubtractDouble 노드의 기능을 대체하기 위해 NegateDouble과 AddDouble이라는 두 개의 간단한 노드를 만들 것입니다.
노드 설명 편집기를 여십시오.
먼저 NegateDouble 노드를 생성합니다. 아래와 같이 노드 설명 편집기의 첫 번째 섹션을 입력하십시오.
※ 응용프로그램은 기본 값의 위치에서만 확장자를 검색하므로 확장 위치 필드를 기본값으로 유지하는 것이 좋습니다(정확한 목록 및 변경 방법에 대한 지침은 일반 Omniverse 문서를 참조하십시오.) 위의 기본 위치는 이러한 위치 중 하나여야 합니다. 다른 항목을 선택할 경우 확장명을 검색하도록 옴니버스가 설정된 위치인지 확인하십시오. 그렇지 않으면 노드가 로드되지 않습니다.
그런 다음 입력 및 출력 섹션을 아래에 표사된것 처럼 작성하십시오.
정보를 입력할 때 편집기에서 생성하는 원시 .ogn 파일이 표시됩니다.
여기서 중요한 것은 .ogn 파일입니다. 노드의 모양을 개괄적으로 설명하는 json 파일입니다. OGN 프레임워크에 의해 구문 분석된 소스 파일로 취급되며, 이 파일은 Python(또는 C++)에서 소스 파일뿐만 아니라 문서 및 테스트도 생성합니다. 이렇게 생성된 소스 파일은 데이터 액세스, 유효성 검사와 같은 기능을 제공하며 일반적으로 상용구 코드를 줄여 프로그래머가 시스템에서 작업할 수 있는 작업을 단순화합니다. 사용 중인 노드 설명 편집기 UI는 .ogn 파일 작성 작업을 단순화할 뿐이며, 이는 새 사용자가 해당 구문에 익숙하지 않을 수 있기 때문입니다.
정보를 입력한 후 "Populate Extension" 단추를 먼저 클릭하고 "Save Node"을 클릭한 다음 "Generate Blank Implementation"을 클릭합니다. 첫 번째 버튼을 누르면 새 확장이 설정됩니다. 두 번째 버튼은 확장자 내에 .ogn 파일을 생성합니다. 세 번째 버튼은 샘플 구현 파일을 생성합니다.
모든 것이 잘 해결되었다면, 새 노드를 시스템에 이미 배치할 수 있을 것입니다. 비록 지금은 기본 구현만 되어도 아직 아무런 도움이 되지 않습니다. NegateDouble 노드를 그래프에 배치하고 다음과 같이 연결합니다.
이제 생성된 확장 디렉토리로 이동하여 생성된 구현 파일을 살펴보겠습니다. 모든 항목이 기본값으로 유지되는 경우 이 디렉토리는 다음과 같습니다.
Documents/Kit/shared/exts/omni.new.extension/omni/new/extension/nodes
원본 디렉터리입니다. 또한 주목하십시오.
Documents/Kit/shared/exts/omni.new.extension/omni/new/extension/ogn
디렉토리입니다. 이것은 OGN 프레임워크에 의해 생성된 코드/문서입니다. 이 디렉터리는 원본이 아닌 빌드 디렉터리로 간주되므로 소스 코드 제어 시스템에 체크인하지 마십시오.
OgnNewNode.py 파일을 엽니다. 다음과 같이 표시되어야 합니다.
"""
This is the implementation of the OGN node defined in OgnNewNode.ogn
"""
# Array or tuple values are accessed as numpy arrays so you probably need this import
import numpy
class OgnNewNode:
"""
Takes a double as input and negates it
"""
@staticmethod
def compute(db) -> bool:
"""Compute the outputs from the current input"""
try:
# By putting the compute in a try block you can fail the compute by raising an exception
pass
except Exception as error:
# If anything causes your compute to fail report the error and return False
db.log_error(str(error))
return False
# Even if inputs were edge cases like empty arrays, correct outputs mean success
return True
※ 또는 노드 설명 편집기에서 노드 편집 버튼을 클릭하여 구현 파일 OgnNewNode.py을 열 수도 있습니다.
NegateDouble 노드를 완료하려면 한 줄 또는 두 줄만 변경하면 됩니다.
"""
This is the implementation of the OGN node defined in OgnNewNode.ogn
"""
# Array or tuple values are accessed as numpy arrays so you probably need this import
import numpy
class OgnNewNode:
"""
Takes a double as input and negates it
"""
@staticmethod
def compute(db) -> bool:
"""Compute the outputs from the current input"""
try:
# By putting the compute in a try block you can fail the compute by raising an exception
input_value = db.inputs.in_double
db.outputs.out_double = -1.0*input_value
except Exception as error:
# If anything causes your compute to fail report the error and return False
db.log_error(str(error))
return False
# Even if inputs were edge cases like empty arrays, correct outputs mean success
return True
물론 중복되고 불필요한 정보를 제거하는 것이 좋습니다. 이 정보는 Python 노드 구현이 얼마나 간소화될 수 있는지를 보여주는 서버이기도 합니다.
"""This is the implementation of the OGN node defined in OgnNewNode.ogn"""
class OgnNewNode:
"""Takes a double as input and negates it"""
@staticmethod
def compute(db) -> bool:
db.outputs.out_double = - db.inputs.in_double
return True
파일을 저장한 후 노드가 마법처럼 작동하기 시작합니다.
이는 파이썬 노드에 매우 편리한 "핫 리로드"의 개념을 보여주며 프로그래머들이 빠르게 반복할 수 있게 합니다.
※ 일부 버전의 키트에서는 씬(scene)의 기존 인스턴스가 있는 노드를 핫 재로드할 때 문제가 발생할 수 있습니다. 이 문제를 해결하려면 다시 로드된 확장에서 노드를 선택하고 CTL-X/CTL-Z를 사용하여 노드를 삭제하고 삭제를 실행 취소한 후 새 기능으로 복원하십시오.
이제 NegateDouble 노드가 작동하므로 다음 노드인 AddDouble로 이동하겠습니다. 노드 설명 편집기에서 파일 -> 새 노드를 클릭하여 새 노드에 대한 생성 프로세스를 시작하십시오.
다음과 같이 노드 세부 정보를 입력합니다.
확장이 이미 채워졌으므로 이번에는 "확장 번호 채우기"를 클릭할 필요가 없습니다. 대신 "Save Node"를 클릭하여 ogn 파일을 기본 디렉터리에 "OgnAddDouble.ogn"으로 저장한 다음 "Generate Blank Implementation"을 클릭합니다.
"Edit Node"를 클릭하여 구현 파일을 열고 AddDouble 노드의 구현을 다음과 같이 변경합니다.
"""
This is the implementation of the OGN node defined in OgnAddDouble.ogn
"""
class OgnAddDouble:
"""
Add two doubles
"""
@staticmethod
def compute(db) -> bool:
"""Compute the outputs from the current input"""
db.outputs.sum = db.inputs.input_a + db.inputs.input_b
return True
AddDouble 노드를 그래프에 배치하고 연결하며 입력 값을 다음과 같이 설정합니다.
연결을 마우스 오른쪽 버튼으로 클릭하여 ClampDouble 노드에서 SubtractDouble 노드를 분리합니다.
다음과 같이 AddDouble 노드를 ClampDouble 노드에 연결합니다.
구를 움직이면 그래프가 이전과 같이 작동합니다. 정리하기 위해 매달린 SubtractDouble 노드를 삭제하는 것이 좋습니다.
다음 세션에서 이러한 노드를 성공적으로 실행하려면 이제 다른 노드처럼 확장 관리자에서 새 확장(omni.new.extension)을 로드하여 사용하도록 설정해야 합니다. 편의를 위해 확장에서 자동 로드를 활성화할 수 있습니다.
다음 장에서는 더 복잡한 노드인 디포머를 만드는 방법에 대해 설명합니다.
'omniverse > graph' 카테고리의 다른 글
옴니 그래프 예제 4-2탄 (0) | 2022.06.04 |
---|---|
옴니 그래프 예제 4-1탄 (0) | 2022.05.20 |
옴니 그래프 예제 4탄 (0) | 2022.05.19 |
옴니 그래프 예제 3탄 (0) | 2022.05.18 |
옴니 그래프 예제 2탄 (0) | 2022.05.17 |