튜토리얼 8: 이전 V1과 새 V2 Python 인터페이스를 결합하는 방법

튜토리얼 8: 이전 V1과 새 V2 Python 인터페이스를 결합하는 방법 동영상에서는 이전 vrNodePtr 및 새 vrdNode 객체 간의 상호 운용성을 보여 주는 예시를 제공합니다.

예제 스크립트 다운로드

스크립트 예제로 이동

튜토리얼의 PDF 다운로드

동영상 캡션: 안녕하세요. VRED Pro를 위한 새로운 Python 튜토리얼에 오신 것을 환영합니다. 저는 크리스토퍼라고 합니다. 오늘은 Python API 버전 1과 버전 2의 다양한 데이터 유형 및 함수를 결합하는 방법에 대해 말씀드리겠습니다.

API 버전 2에서는 VRED의 데이터와 상호 작용하는 방식이 크게 변경되었습니다. 모듈을 사용하는 대신, 이제는 이른바 서비스로 결합됩니다. 예를 들어 vrCameraService 또는 vrNodeService에 전에는 vrCameravrNodePtr에서 사용할 수 있었던 모든 메서드가 포함됩니다. 이러한 서비스는 API 버전 1의 함수 대부분을 대체하지만 모든 함수를 대체하지는 않습니다. API 버전 1에서만 사용할 수 있는 몇 가지 기능이 여전히 남아 있습니다. 또한 이전 API를 사용하는 플러그인 및 스크립트가 있을 수 있으며, 이러한 인터페이스에는 API 버전 1과 호환되는 데이터가 필요합니다. 따라서 현재 개발 중인 새 스크립트에서 이전 스크립트와 플러그인이 제대로 작동하도록 두 API의 함수와 데이터 유형을 결합해야 하는 경우가 있을 것입니다.

가장 큰 차이점인 노드 처리부터 시작하겠습니다. 버전 1에서는 소위 노드 포인터를 사용하여 변환 노드, 그룹 노드, 형상 노드 등의 노드와 상호 작용했습니다. vrNodePointer를 반환하는 vrScenegraph 모듈 findNodes의 함수를 사용하여 장면에서 노드를 찾을 수 있습니다. 이 노드 포인터를 사용하여 설명서에서 볼 수 있는 vrNodePointer 클래스의 일부인 모든 함수를 호출할 수 있습니다. 예를 들어 모든 변환 연산, 재질 설정 또는 가져오기, 장면 그래프에 하위 추가 등이 있습니다.

API 버전 2의 도입과 함께 오토데스크는 작업에 도움이 되도록 이전 vrNodePointer를 일정 부분 대체하는 vrdNodeTypevrNodeService 클래스를 도입했습니다. vrNodeService에서 호출되면 findNode 연산은 vrdNode를 반환하며 vrNodeService.findNode를 사용하여 호출할 수 있습니다. 이렇게 하면 스크립트에서 이러한 유사한 함수를 혼동하지 않게 됩니다. 서비스에서 반환되는 vrdNode를 사용하여 이제 vrdNode 클래스에 정의된 모든 함수를 호출할 수 있습니다. vrdNodevrdTransformNode의 함수를 상속하기 때문에 여기서 모든 변환 연산을 호출할 수도 있습니다.

API 버전 1과 2에는 여전히 동일한 스크립트에서 사용되는 함수가 충분히 있으며 NodePtr 클래스를 매개변수 또는 새 vrdNode로 사용하게 됩니다. 일반적으로 이는 매우 혼란스러울 것입니다. 하지만 다행히 오토데스크 엔지니어가 두 API를 모두 변경하여 함수에서 두 유형의 노드를 모두 사용할 수 있도록 했습니다. 일반적으로 vrdNode를 기대하는 함수에 NodePtr를 사용하는 것이 가장 좋으며 그 반대의 경우도 마찬가지입니다. 이렇게 하면 올바른 노드가 있는지 걱정할 필요가 없습니다. 이 예에서는 새 노드를 만들고 해당 상위 노드를 지정할 수 있습니다. 오류를 표시하지 않고 두 유형의 노드를 매개변수로 사용할 수 있음을 알 수 있습니다.

물론 NodePtrvrdNode로 변환해도 문제가 되지 않습니다. 이 설명서에는 이를 수행하는 두 가지 함수가 명시되어 있지만 기억하기 쉬운 것은 아닙니다. 새 vrdNode에서 이전 NodePtr로 변환할 경우 객체 ID가 vrdNodetoNode 함수를 매개변수로 사용합니다. 이렇게 하면 vrdNodeNodePtr로 변환됩니다. 반대로, vrNodeService 클래스에서 getNodeFromId 함수를 호출합니다. 이 방법은 NodeId를 매개변수로 사용하여 수행됩니다. 하지만 이번에는 다른 함수로 ID를 가져옵니다. 이 변환이 필요한 경우 설명서를 살펴보십시오. 얼마든지 설명서를 참조하여 작업하실 수 있습니다.

API 버전 2에서는 소프트웨어 개발 시 도움이 되는 새로운 데이터 유형도 도입했습니다. 예를 들어 "변환 연산"은 이제 모두 "QT 벡터" 유형을 사용합니다. 이러한 유형을 사용하는 것은 그다지 어렵지 않습니다. 대부분의 경우 이 새 벡터 3D 유형의 예에서와 같이 별도로 사용하던 값을 새 데이터 유형에 추가하는 것입니다.

색상 유형에는 객체를 만드는 데 도움이 되고 RGB 또는 HSV와 같은 다른 색상 형식도 제공하는 정적 함수가 있습니다. 이러한 유형은 기본적으로 VRED 네임스페이스에 이미 추가되어 있으므로 가져올 필요가 없습니다. 새 데이터 유형에 대해 완전하게 다루는 튜토리얼이 있으니 해당 항목에 대한 자세한 내용을 찾아보십시오.

현재 vrNodePointervrdNode 모두 스크립트에서 완벽하게 유효합니다. 두 가지를 같이 사용하는 경우가 있습니다. 그 방법이 더 편하거나 아니면 새 API가 아직 vrdNodePointer의 모든 기능을 대체할 준비가 되지 않았기 때문입니다.

좋은 예는 재질을 다룰 때입니다. vrNodePointer가 포함된 재질만 설정하고 가져올 수 있으며 vrdNode의 경우는 아닙니다. 하지만 향후 릴리즈에서는 vrMaterialService와 같은 것도 확인할 수 있을 것 같습니다. 시간이 지나면 중점 기능이 확실히 이전 API에서 새 API로 이동하므로 가능하면 API 버전 2를 사용해야 합니다.

오늘은 이것으로 이전 API 버전 1과 새 API 버전 2에 대한 설명을 마치겠습니다. 이제 두 API를 결합하여 효율적이고 미래 경쟁력이 높은 스크립트를 작성하는 방법을 잘 이해할 수 있을 것입니다. 시청해 주셔서 감사합니다. 다음에 뵙겠습니다.


샘플 Python 코드

다음은 튜토리얼 8: 이전 V1과 새 V2 Python 인터페이스를 결합하는 방법 동영상과 함께 제공되는 예제 Python 스크립트입니다.

팁:

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

deprecated_examples.py

# Deprecated API v1 functions

# vrCamera
addViewPoint("New Viewpoint")

vrCameraService.createViewpoint('New Viewpoint')

# vrOSGWidget
createBackplate('filePath')
setBackplate('filePath')
deleteBackplate()

vrSceneplateService.createNode()  # TODO Parameter prüfen

# vrRenerSettings
setRaytracingAAThreshold()

difference_nodes_v1_v2.py

# Node pointers with API v1

# Find node "EXT" with API v1
extNodePtr = findNode("EXT")

# set translation
extNodePtr.setTranslation(0,0,38)

# get translation
translation = extNodePtr.getTranslation()
print("Translation:", translation)

# set name
extNodePtr.setName("Another EXT")



# Node pointers with API v2

# Find node "EXT" with API v2
ext`VrdNode` = `vrNodeService.findNode`("EXT")

# set translation
translationVector = QVector3D(0,0,38)
ext`VrdNode`.setTranslation(translationVector)

# get translation
translation = ext`VrdNode`.getTranslation()
print("Translation:", translation)

# set name
ext`VrdNode`.setName("Another EXT")

node_examples.py

# Example 1.0
# Finding Nodes

# Finding nodes with API v1 and v2
study_NodePtr = findNode('Study_Transform')
study_`vrdNode` = `vrNodeService.findNode`('Study_Transform')

# Example 2.0
# Using API v1 functions with `vrdNode`s
createNode("Group", "Interieur_nodePtr", study_NodePtr)
print("Created new group with nodePtr")

createNode("Group", "Interieur_`vrdNode`", study_`vrdNode`)
print("Created new group with `vrdNode`")

updateScenegraph(True)


# Using API v2 functions with `vrNodePtr`s
interieur_NodePtr = findNode('Interieur_nodePtr')

childIndex = study_`vrdNode`.getChildIndex(interieur_NodePtr)

print("Interieur Node is at index:", childIndex)


# Example 3.0
# Convert from nodePtr to `vrdNode`
targetNodePtr = findNode("Target")
targetNode = `vrNodeService`.`getNodeFromId`(targetNodePtr.getID())

# Convert from `vrdNode` to nodePtr
targetNodePtr = toNode(targetNode.getObjectId())