튜토리얼 12: vrFieldAccess를 사용한 낮은 수준의 필드 액세스

튜토리얼 12: vrFieldAccess를 사용한 낮은 수준의 필드 액세스 동영상에서는 다음 내용을 다룹니다.

예제 스크립트 다운로드

스크립트 예제로 이동

튜토리얼의 PDF 다운로드

동영상 캡션: 안녕하세요. VRED Pro를 위한 Python 스크립팅 튜토리얼의 마지막 동영상에 오신 것을 환영합니다. 저는 크리스토퍼라고 하며, 오늘은 vrFieldAccess API를 사용하여 VRED의 노드 편집기에서 필드를 읽고 조작하는 방법을 소개하겠습니다.

메뉴를 통해 VRED에서 노드 편집기를 열면 VRED에서 모든 유형의 노드에 사용하는 모든 내부 데이터에 액세스할 수 있습니다. 예를 들어 장면 그래프에 포함할 수 있는 모든 노드뿐만 아니라 재질 노드, 라이트 노드 또는 장면 플레이트 노드도 여기에 포함될 수 있습니다. 노드 편집기에서 장면 그래프 노드를 보면 변환, 회전 또는 배율 조정과 같은 모든 현재 변환 값을 볼 수 있습니다. 재질의 경우 노드 편집기에 분산 색상 또는 범프 맵과 같은 모든 색상 구성요소 데이터 및 텍스처가 표시됩니다.

일반적으로 VRED는 이미 일반 인터페이스를 통해 대부분의 데이터를 노출하므로 노드 편집기를 통해 이 정보에 액세스하지 않습니다. 또한 노드 편집기에서 임의 값을 편집하는 것은 안전하지 않으므로 카메라의 투시 매트릭스를 수동으로 변경하지 않는 것이 좋습니다.

그러나 경우에 따라 유용할 수도 있습니다. 예를 들어 Python을 사용하여 재질을 동적으로 만들려는 경우 유일한 방법은 필드 액세스 API를 사용하여 분산 색상 또는 기타 매개변수를 설정하는 것입니다. 또 다른 예로, 프로젝트의 경우 들어오는 비디오 스트림 해상도의 크기와 일치하는 화면표시 화면을 동적으로 생성해야 할 경우 유일한 방법은 필드 액세스 API를 통해 비디오 스트림의 해상도를 읽는 것입니다.

간단한 예를 들어 보겠습니다. 재질을 만들고 분산 색상을 밝은 빨간색으로 설정하겠습니다. 노드 편집기를 사용하여 다른 재질을 살펴보면 diffuseColor 필드가 이를 담당하는 것을 볼 수 있습니다. 마우스 커서를 값 오른쪽으로 이동하면 VRED에서 내부적으로 사용되는 데이터 유형도 볼 수 있습니다. 이 경우에는 3개의 구성요소가 있는 벡터입니다.

이를 위해 먼저 fields 메서드를 사용하여 노드의 필드에 액세스한 다음 set 메서드를 사용하여 값을 설정합니다. 이 경우 getVector3f 필드에 RGB 값을 쓸 수 있는 diffuseColor 메서드를 사용합니다. 스크립트를 실행하고 재질 편집기를 다시 로드하면 분산 색상이 밝은 빨간색으로 설정된 새 재질을 찾을 수 있습니다.

좋습니다. 좀 더 자세히 살펴보겠습니다. 노드 편집기에서 첫 번째 수준에 액세스하는 것은 쉬웠습니다. 그러나 필드 액세스 그래프에서 더 깊은 필드에 접근하려면 어떻게 해야 할까요? 재질의 범프 맵 텍스처에 대한 텍스처 해상도를 읽는다고 가정해 보겠습니다. 이렇게 하려면 먼저 원하는 필드가 포함된 각 필드 컨테이너에 액세스해야 합니다. 여기서는 "색상 구성요소 데이터", "범프 구성요소" 및 "이미지"입니다.

먼저 재질과 해당 필드에 액세스합니다. 그런 다음 실제로 데이터가 포함된 필드 컨테이너에 도달할 때까지 다음 필드 컨테이너로 계속 이동합니다. 이 작업은 getFieldContainer 메서드를 사용하고 vrFieldAccess 클래스 생성자에서 반환 값을 매개변수로 사용하여 수행합니다. 마지막 필드 컨테이너인 "범프 이미지 구성요소"에 도달하면 해상도 필드에 액세스할 수 있습니다. 이 경우 해상도는 1024 x 1024입니다.

대부분의 경우 이미 노드에 있는 필드만 읽고 조작할 수 있습니다. 그러나 임의의 데이터를 노드에 어느 정도 추가할 수도 있습니다. 이 기능은 데이터 준비를 위한 복잡한 플러그인을 개발할 때 유용할 수 있습니다. 그렇다면 어떻게 하면 될까요?

다음 스크립트는 연결 노드 "값 쌍"을 사용하여 문자열 데이터 목록을 작성하고 "키" 및 "값" 필드를 사용하여 데이터를 저장하는 방법을 보여 줍니다. 키 값 쌍을 두 개의 목록으로 분할하고 연결에 저장하면 나중에 검색할 수 있습니다.

여기서는 Python zip 함수를 사용하여 키 값 쌍의 원래 목록을 다시 구성합니다. 값 쌍 연결 시 데이터를 이미 저장하는 일부 노드가 있다는 점에 유의하십시오. 따라서 이 방법을 사용하는 경우 일부 측정을 구현하여 실수로 이 데이터를 변경하지 않도록 해야 합니다.

데이터 유형과 올바른 데이터 유형을 사용하고 있는지 확인할 수 있는 방법을 간단히 살펴봅니다. 정수가 8비트인지, 16비트인지, 부호 있는 정수인지 없는 정수인지 확실하지 않은 경우도 있습니다. 또한 C 또는 C++를 다뤄 본 적이 없으면 C 또는 C++로 뭘 해야 할지도 모를 수도 있습니다. 노드 편집기에서 값 필드 위에 마우스를 놓으면 언제든지 사용되는 실제 내부 데이터 유형을 볼 수 있습니다. 그러면 필드에서 값을 쓰거나 읽는 데 사용해야 하는 방법에 대한 힌트가 제공됩니다. 이번에는 문서에서 전체 텍스트 검색을 수행하고 노드 편집기에서 데이터 유형에 대해 일치하는 메서드를 찾아보겠습니다. 잘못된 메서드를 사용하는 경우 오류 메시지가 표시됩니다. 따라서 사용 중인 메서드를 테스트하면 됩니다.

오늘은 이것으로 마치겠습니다. 함께해 주셔서 감사합니다. 이번 동영상이 VRED Pro를 위한 Python 스크립팅 튜토리얼 시리즈의 마지막 동영상이었습니다. 하지만 새 VRED Core용 Python 튜토리얼도 있으니 관심이 있으신 분은 거기서 뵙겠습니다.


샘플 Python 코드

튜토리얼 12: vrFieldAccess를 사용한 낮은 수준의 필드 액세스 동영상과 함께 제공되는 예제 Python 스크립트입니다.

팁:

이러한 파일을 압축하여 다운로드하려면 여기를 클릭하십시오.

fieldAccess-examples.py

# Simple Field Access
material = createMaterial("UPhongMaterial")
material.setName("Python Material")
fields = material.fields()
fields.setVec3f("`diffuseColor`", 1, 0, 0)

# Complex Field Access
leatherMatFields = findMaterial("Leather red").fields()
colorComponentData = `vrFieldAccess`(leatherMatFields.`getFieldContainer`('colorComponentData'))
bumpComponent = `vrFieldAccess`(colorComponentData.`getFieldContainer`('bumpComponent'))
bumpImageComponent = `vrFieldAccess`(bumpComponent.`getFieldContainer`('image'))

width = bumpImageComponent.getInt32("width")
height = bumpImageComponent.getInt32("height")

print(width, height)

# Attaching arbitrary data to a node field
envNode = findNode("EnvironmentsTransform")
customAttachment = createAttachment("ValuePair")
`vrFieldAccess`(customAttachment).setMString('key', ['key1', 'key2', 'key3'])
`vrFieldAccess`(customAttachment).setMString('value', ['value1', 'value2', 'value3'])
envNode.addAttachment(customAttachment)

# Reading the values from the attachment
envNode = findNode("EnvironmentsTransform")
attachmentFieldAccess = `vrFieldAccess`(envNode.getAttachment("ValuePair"))
keys = attachmentFieldAccess.getMString('key')
values = attachmentFieldAccess.getMString('value')

keyValuePairs = list(zip(keys, values))
print(keyValuePairs)