튜토리얼 8: 이전 V1과 새 V2 Python 인터페이스를 결합하는 방법 동영상에서는 이전 vrNodePtr 및 새 vrdNode 객체 간의 상호 운용성을 보여 주는 예시를 제공합니다.
동영상 캡션: 안녕하세요. VRED Pro를 위한 새로운 Python 튜토리얼에 오신 것을 환영합니다. 저는 크리스토퍼라고 합니다. 오늘은 Python API 버전 1과 버전 2의 다양한 데이터 유형 및 함수를 결합하는 방법에 대해 말씀드리겠습니다.
API 버전 2에서는 VRED의 데이터와 상호 작용하는 방식이 크게 변경되었습니다. 모듈을 사용하는 대신, 이제는 이른바 서비스로 결합됩니다. 예를 들어 vrCameraService 또는 vrNodeService에 전에는 vrCamera 및 vrNodePtr에서 사용할 수 있었던 모든 메서드가 포함됩니다. 이러한 서비스는 API 버전 1의 함수 대부분을 대체하지만 모든 함수를 대체하지는 않습니다. API 버전 1에서만 사용할 수 있는 몇 가지 기능이 여전히 남아 있습니다. 또한 이전 API를 사용하는 플러그인 및 스크립트가 있을 수 있으며, 이러한 인터페이스에는 API 버전 1과 호환되는 데이터가 필요합니다. 따라서 현재 개발 중인 새 스크립트에서 이전 스크립트와 플러그인이 제대로 작동하도록 두 API의 함수와 데이터 유형을 결합해야 하는 경우가 있을 것입니다.
가장 큰 차이점인 노드 처리부터 시작하겠습니다. 버전 1에서는 소위 노드 포인터를 사용하여 변환 노드, 그룹 노드, 형상 노드 등의 노드와 상호 작용했습니다. vrNodePointer를 반환하는 vrScenegraph 모듈 findNodes의 함수를 사용하여 장면에서 노드를 찾을 수 있습니다. 이 노드 포인터를 사용하여 설명서에서 볼 수 있는 vrNodePointer 클래스의 일부인 모든 함수를 호출할 수 있습니다. 예를 들어 모든 변환 연산, 재질 설정 또는 가져오기, 장면 그래프에 하위 추가 등이 있습니다.
API 버전 2의 도입과 함께 오토데스크는 작업에 도움이 되도록 이전 vrNodePointer를 일정 부분 대체하는 vrdNodeType 및 vrNodeService 클래스를 도입했습니다. vrNodeService에서 호출되면 findNode 연산은 vrdNode를 반환하며 vrNodeService.findNode를 사용하여 호출할 수 있습니다. 이렇게 하면 스크립트에서 이러한 유사한 함수를 혼동하지 않게 됩니다. 서비스에서 반환되는 vrdNode를 사용하여 이제 vrdNode 클래스에 정의된 모든 함수를 호출할 수 있습니다. vrdNode는 vrdTransformNode의 함수를 상속하기 때문에 여기서 모든 변환 연산을 호출할 수도 있습니다.
API 버전 1과 2에는 여전히 동일한 스크립트에서 사용되는 함수가 충분히 있으며 NodePtr 클래스를 매개변수 또는 새 vrdNode로 사용하게 됩니다. 일반적으로 이는 매우 혼란스러울 것입니다. 하지만 다행히 오토데스크 엔지니어가 두 API를 모두 변경하여 함수에서 두 유형의 노드를 모두 사용할 수 있도록 했습니다. 일반적으로 vrdNode를 기대하는 함수에 NodePtr를 사용하는 것이 가장 좋으며 그 반대의 경우도 마찬가지입니다. 이렇게 하면 올바른 노드가 있는지 걱정할 필요가 없습니다. 이 예에서는 새 노드를 만들고 해당 상위 노드를 지정할 수 있습니다. 오류를 표시하지 않고 두 유형의 노드를 매개변수로 사용할 수 있음을 알 수 있습니다.
물론 NodePtr을 vrdNode로 변환해도 문제가 되지 않습니다. 이 설명서에는 이를 수행하는 두 가지 함수가 명시되어 있지만 기억하기 쉬운 것은 아닙니다. 새 vrdNode에서 이전 NodePtr로 변환할 경우 객체 ID가 vrdNode인 toNode 함수를 매개변수로 사용합니다. 이렇게 하면 vrdNode가 NodePtr로 변환됩니다. 반대로, vrNodeService 클래스에서 getNodeFromId 함수를 호출합니다. 이 방법은 NodeId를 매개변수로 사용하여 수행됩니다. 하지만 이번에는 다른 함수로 ID를 가져옵니다. 이 변환이 필요한 경우 설명서를 살펴보십시오. 얼마든지 설명서를 참조하여 작업하실 수 있습니다.
API 버전 2에서는 소프트웨어 개발 시 도움이 되는 새로운 데이터 유형도 도입했습니다. 예를 들어 "변환 연산"은 이제 모두 "QT 벡터" 유형을 사용합니다. 이러한 유형을 사용하는 것은 그다지 어렵지 않습니다. 대부분의 경우 이 새 벡터 3D 유형의 예에서와 같이 별도로 사용하던 값을 새 데이터 유형에 추가하는 것입니다.
색상 유형에는 객체를 만드는 데 도움이 되고 RGB 또는 HSV와 같은 다른 색상 형식도 제공하는 정적 함수가 있습니다. 이러한 유형은 기본적으로 VRED 네임스페이스에 이미 추가되어 있으므로 가져올 필요가 없습니다. 새 데이터 유형에 대해 완전하게 다루는 튜토리얼이 있으니 해당 항목에 대한 자세한 내용을 찾아보십시오.
현재 vrNodePointer와 vrdNode 모두 스크립트에서 완벽하게 유효합니다. 두 가지를 같이 사용하는 경우가 있습니다. 그 방법이 더 편하거나 아니면 새 API가 아직 vrdNodePointer의 모든 기능을 대체할 준비가 되지 않았기 때문입니다.
좋은 예는 재질을 다룰 때입니다. vrNodePointer가 포함된 재질만 설정하고 가져올 수 있으며 vrdNode의 경우는 아닙니다. 하지만 향후 릴리즈에서는 vrMaterialService와 같은 것도 확인할 수 있을 것 같습니다. 시간이 지나면 중점 기능이 확실히 이전 API에서 새 API로 이동하므로 가능하면 API 버전 2를 사용해야 합니다.
오늘은 이것으로 이전 API 버전 1과 새 API 버전 2에 대한 설명을 마치겠습니다. 이제 두 API를 결합하여 효율적이고 미래 경쟁력이 높은 스크립트를 작성하는 방법을 잘 이해할 수 있을 것입니다. 시청해 주셔서 감사합니다. 다음에 뵙겠습니다.
다음은 튜토리얼 8: 이전 V1과 새 V2 Python 인터페이스를 결합하는 방법 동영상과 함께 제공되는 예제 Python 스크립트입니다.
이러한 파일을 압축하여 다운로드하려면 여기를 클릭하십시오.
# 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()
# 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")
# 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())