Q100351: 시간 관련 값에 반응하기 위해 C++ Op 내부에서 시스템 그래프 상태 데이터를 쿼리하는 방법

요약

이 문서에서는 사용자 정의 Op에서 현재 프레임 시간이나 샘플 수와 같은 현재 그래프 상태의 시스템 인수에 어떻게 액세스할 수 있는지 설명합니다.

사용자 정의 Op를 작성하고 컴파일하는 방법에 대한 정보를 찾고 있다면 Q100326: 첫 번째 사용자 정의 Op를 작성하고 테스트하는 방법을 참조하세요 .

더 많은 정보

사용자 정의 Op를 구현할 때 흔히 겪는 난관은 현재 시간( shutterOpen 또는 shutterClose 값)이나 시간 샘플 수를 반환하는 cook 인터페이스 함수가 사용자 정의 Op가 속한 Op 체인의 노드가 올바르게 설정되지 않으면 올바른 결과를 반환하지 않을 수 있다는 것입니다.

예를 들어, 다음과 같은 통화에 해당합니다.

Foundry ::카타나::GetCurrentTime(인터페이스)
Foundry ::카타나::GetShutterOpen(인터페이스)
Foundry ::카타나::GetShutterClose(인터페이스)
Foundry ::카타나::GetNumSamples(인터페이스)

이러한 함수에서 예상 반환 값을 얻으려면 시스템 작업 인수를 추가해야 합니다. 일반적으로 이러한 인수는 노드(또는 interface.execOp 통한 호스팅 작업 )에서 제공해야 합니다.

Op가 GenericOp 노드를 통해 인스턴스화된 경우 addSystemOpArgs 매개변수를 Yes 로 설정해야 합니다.

Op가 사용자 지정 NodeTypeBuilder를 통해 등록된 경우, buildOpChain() 으로 전송된 인터페이스 객체 에는 Op 인수에 '시스템' GroupAttribute를 추가하는 addOpSystemArgs() 메서드 가 있습니다 . Op는 이 메서드를 검색하여 사용할 수 있습니다.

참고: 관련 NodeTypeBuilder 함수는 Katana 개발자 가이드에서 확인할 수 있습니다.

구현 예

첨부된 파일은 /root/world/geo/hello_worldhello world 유형의 단일 위치를 생성하고 , 해당 위치에서 HelloWorld Op를 실행하는 간단한 NodeTypeBuilder 기반 노드 유형의 예입니다 . (이 예에서는 /root 에 일부 속성을 설정합니다 .)

Op 소스를 사용하려면 먼저 컴파일해야 합니다. Katana 설치 디렉터리에 있는 $KATANA_ROOT/plugins/Src/README.md 파일의 지침을 따르세요.

더 자세한 지침은 Q100326: 첫 번째 사용자 정의 Op를 작성하고 테스트하는 방법을 참조하세요 .

C++ 소스가 .so 또는 .dll 파일로 컴파일되면 이 파일을 KATANA _RESOURCES 디렉토리의 Ops 하위 폴더에 넣어야 하고, NTB.py는 KATANA _RESOURCES 디렉토리의 Plugins 하위 폴더에 넣어야 합니다.

KATANA _RESOURCES 설정에 대한 자세한 내용은 Katana 설치 가이드를 참조하세요.

노드의 Op 체인에 Op를 추가할 때 '시스템' Op 인수를 추가하는 관련 코드는 다음과 같습니다.

opArgs = FnAttribute.GroupBuilder()
interface.addOpSystemArgs(opArgs)

interface.appendOp('HelloWorld', opArgs.build())

이는 다음을 수행하는 것과 같습니다.

graphState = interface.getGraphState()
opArgs = FnAttribute.GroupBuilder()
opArgs.set('system', graphState.getOpSystemArgs())
interface.appendOp('HelloWorld', opArgs.build())

'HelloWorld' Op는 여기에 접근하여 예를 들어 루트에 현재 시간을 속성으로 설정할 수 있습니다.

static void cook(Foundry::Katana::GeolibCookInterface& interface)
{
    if (interface.atRoot())
    {
        interface.setAttr("Hello", FnAttribute::StringAttribute("World!"));
        interface.setAttr("CurrentTime", FnAttribute::FloatAttribute(Foundry::Katana::GetCurrentTime(interface)));
    }
    interface.stopChildTraversal();
}

기술적 설명

GraphState::getOpSystemArgs() timeslice 그룹( currentTime , shutterOpen , shutterClose , numSamples )과 variables 그룹(그래프 상태 변수)을 포함하는 그룹을 반환합니다. 이 그룹은 '시스템' Op 인수로 설정해야 합니다. GetCurrentTimeGetGraphStateVariables 와 같은 CookInterface 호출은 getOpArg("system.[...]") 호출하는 편의 함수입니다.

추가 도움말

이 문서에 포함된 정보에 문제가 있는 경우 지원 티켓을 개설하여 발생한 문제와 지금까지 취한 문제 해결 단계를 알려주시기 바랍니다.

지원 티켓을 여는 방법에 대한 자세한 내용은 Q100064: 지원 티켓을 제기하는 방법을 참조하세요 .

첨부 파일

우리는 문제로 불편을 끼쳐 드려 죄송합니다

이유를 알려주세요