튜토리얼 9: V2에서 새 데이터 유형을 사용하는 방법 동영상에서는 QMatrix4x4 및 QVector3D를 사용한 수학 연산의 예를 다룹니다.
동영상 캡션: 안녕하세요. VRED Pro를 위한 Python 튜토리얼에 오신 것을 환영합니다. 저는 크리스토퍼라고 하며, 오늘은 API 버전 2의 새로운 데이터 유형을 소개하려고 합니다. 이 유형의 배경을 설명하고 작업 방법을 알아보겠습니다.
Python API 버전 1에서는 작업할 데이터 유형이 없습니다. 모든 매개변수는 단일 값으로 전달되거나 벡터나 색상 구성요소와 같은 목록으로 전달됩니다. 또한 대부분의 경우 함수는 단일 값, 튜플 또는 목록을 반환합니다.
Python의 관점에서 보면 괜찮습니다. 이를 Pythonic이라고 하며 Python에서 수행되는 방식입니다. 하지만 이러한 작업 방식에는 단점이 있습니다. 예를 들면 벡터 작업 시 수학적 연산을 수행하기 위해 항상 Pythonic한 표현을 보다 편리한 표현으로 변환해야 합니다.
따라서 Python API 버전 2에는 기존의 문제를 해결하는 새로운 데이터 유형이 도입되었습니다. 객체 지향 데이터 작업 방식의 도입입니다. 즉, 벡터의 구성요소와 같은 값은 개별적으로 처리되는 대신 단일 객체로 결합됩니다. 예를 들어 벡터를 처리하는 형상 함수에 대한 입력 매개변수 및 반환 값에 이제 새 데이터 유형이 사용됩니다. 이러한 데이터 유형은 VRED에서 내부적으로 사용하는 Qt 프레임워크에서 차용되었으며 각 데이터 유형에는 우리가 기대하는 정확한 함수가 포함되어 있습니다. 3D 그래픽 프로그래밍의 경우 "Q-Vector-2D", "3D" 및 "4D" 유형이 새로 추가되었으며 매트릭스 데이터 유형도 있습니다. 16진수 값, RGB 또는 기타 색상 형식으로 색상을 만들 수 있는 새로운 색상 유형이 있습니다. 또한 QIcon, QSize 또는 QImage와 같이 그래픽 사용자 인터페이스를 구성하는 데 도움이 되는 몇 가지 유형이 있습니다.
이러한 유형으로 작업하려면 수동으로 가져올 필요가 없습니다. VRED에 이미 추가되었으므로 스크립트 편집기에서 "대문자 Q"를 입력하고 Ctrl 키를 누른 채 "스페이스바"를 누르면 사용할 수 있는 모든 새 데이터 유형 목록을 확인할 수 있습니다. 따라서 새로운 데이터 유형으로 수행할 수 있는 몇 가지 작업에 대해 살펴보겠습니다. 첫 번째 예에서는 새 주석을 작성하고 색상을 설정합니다. 이를 위해 새로운 "Q Color" 유형을 사용할 수 있습니다. 이 유형을 사용하면 RGB 값뿐만 아니라 HSV 또는 다른 색상 공간에서 색상을 생성할 수 있습니다. 다음 단계에서는 주석을 약간 더 위로 이동하여 자동차 후드에 배치할 수 있습니다. 이렇게 하려면 새 3D 벡터를 만들고 이를 주석의 "set position" 메서드에 삽입하면 됩니다.
다음 예에서는 현재 카메라에서 오른쪽을 가리키는 벡터를 계산하려고 합니다. 실제로 카메라 뷰 방향과 위쪽 벡터의 외적(cross-product)으로 설명되는 벡터가 필요합니다. 외적(cross-product) 또는 내적(dot product) 계산은 3D 프로그래밍을 수행할 때의 기본 연산이지만, 새로운 데이터 유형을 사용할 경우 이 연산을 수행하기가 매우 쉽습니다.
스크립트에서 먼저 "위쪽 방향(up)", "카메라 방향(from)" 및 "카메라가 바라보는 방향(at)"을 나타내는 값을 가져옵니다. 이러한 값을 사용하여 카메라에서 대상 및 위쪽 벡터까지의 벡터를 계산함으로써 기본적으로 한 줄로 외적을 계산할 수 있습니다. 마지막 세트에서 결과를 정규화하면 완료됩니다. 이것이 새로운 데이터 유형의 이점입니다. 외부 모듈을 가져오거나 자체 유형을 구현할 필요 없이 모든 기능을 사용할 수 있습니다.
또 다른 예로, 카메라에서 원점까지의 거리와 좌표계의 Z축까지의 거리를 계산하려고 합니다. 벡터 클래스는 이미 이러한 메서드를 제공하므로 이 방법도 매우 간단합니다. 이 경우 이것이 여기에서 사용하는 선까지의 거리 및 점까지의 거리에 대한 메서드입니다. 따라서 외부 라이브러리를 사용하거나 자체 벡터 구현을 작성할 필요가 없습니다. 데이터 유형에는 3D 프로그래밍을 수행할 때 필요한 대부분의 함수가 포함되어야 합니다.
시간을 측정하는 "Q Time" 데이터 유형이나 영역을 나타내는 "Q Size"와 같이 굉장히 유용한 데이터 유형이 있지만 벡터 유형은 분명히 가장 유용한 데이터 유형입니다. 다른 모든 유형에 대해 알아보려면 공식 Qt 설명서를 적극 권장합니다. 여기에 몇 가지 좋은 예가 있습니다. "Ctrl" 키와 "스페이스바"로 스크립트 편집기의 자동 완성 기능을 사용하여 사용 가능한 함수 및 유형을 표시하고 온라인 검색을 사용하여 Qt 유형에 대한 설명서를 찾을 수 있습니다.
좋습니다. 오늘은 이것으로 VRED의 모든 새 데이터 유형에 대한 설명을 마치겠습니다. 즐거운 시간이 되셨기를 바랍니다. 참여해 주셔서 감사하며 다음에 뵙겠습니다!
다음은 튜토리얼 9: V2에서 새 데이터 유형을 사용하는 방법 동영상과 함께 제공되는 예제 Python 스크립트입니다.
이러한 파일을 압축하여 다운로드하려면 여기를 클릭하십시오.
# Calculating with QtVectors
camera = vrCameraService.getActiveCamera()
cameraTranslation = camera.getTranslation()
print("Distance to origin: ", cameraTranslation.length())
print("Distance to origin (point): ", cameraTranslation.distanceToPoint(QVector3D(0,0,0)))
distanceToZAxis = cameraTranslation.distanceToLine(QVector3D(0,0,0), QVector3D(0,0,1))
print("Distance to z-axis", distanceToZAxis)
# Example 2.0
# Using vrMathService
boxPtr = vrNodeUtils.createBox(1000, 1000, 1000, 1, 1, 1, 1, 1, 1)
boxPtr.setName("Box")
boxPtr.setTranslation(100, 200, 300)
boxPtr.setRotation(23, 34, 45)
boxPtr.setScale(1.2, 1.3, 1.3)
box = vrNodeService.findNode("Box")
transform = box.getWorldTransform()
translation = vrMathService.getTranslation(transform)
rotation = vrMathService.getRotation(transform)
scale = vrMathService.getScaleFactor(transform)
scaleOrientation = vrMathService.getScaleOrientation(transform)
print("Translation", translation)
print("Rotation", rotation.toEulerAngles())
print("Scale", scale)
print("Scale Orientation", scaleOrientation.toEulerAngles())
# Example 1
# QColor:
colorRed = QColor(255, 0, 0)
colorBlue = QColor(0, 255, 0)
colorGreen = QColor(0, 0, 255)
fontcolor = QColor.fromRgb(127, 24, 78)
backgroundColor = QColor.fromHsv(180, 255, 255)
annotation = vrAnnotationService.createAnnotation("New Annotation")
annotation.setFontColor(fontcolor)
annotation.setBackgroundColor(backgroundColor)
annotation.setText("I like it!")
x = 0
y = 0
z = 300
position = QVector3D(x, y, z)
matAnnotation = vrAnnotationService.findAnnotation("MaterialAnnotation")
matAnnotation.setPosition(position)
# Example 2:
# QVector4D, QVector3D, QVector2D
# QVector4D
camera = vrCameraService.getActiveCamera()
viewFrustum = camera.getFrustum()
print("Frustum as QVector4D:", viewFrustum)
# QVector3D
camera = vrCameraService.getActiveCamera()
fromAtUp = vrCameraService.getActiveCamera().getFromAtUp()
fromVector = fromAtUp.getFrom()
atVector = fromAtUp.getAt()
upVector = fromAtUp.getUp()
print("From Vector:", fromVector)
print("At Vector:", atVector)
print("Up Vector:", upVector)
cameraTangent = QVector3D.crossProduct((atVector - fromVector), upVector)
cameraTangent.normalize()
print("Cross product", cameraTangent)
x = 0
y = 0
z = -300
position = QVector3D(x, y, z)
matAnnotation = vrAnnotationService.findAnnotation("MaterialAnnotation")
matAnnotation.setPosition(position)
# QVector2D
camera = vrCameraService.getActiveCamera()
camera.setSensorSize(QVector2D(10, 10))
camera.updateFromPerspectiveMatch()
#Example 3:
# QMatrix4x4
camera = vrCameraService.getActiveCamera()
projectionMat = camera.getCustomProjectionMatrix()
print(projectionMat)
# Example:
# Math operations
# Example 1
# Color
blue = 127
red = 255
green = 127
vrRenderSettings.setRenderBackgroundColor(blue, red, green)
renderBackground = vrRenderSettings.getRenderBackgroundColor()
print(type(renderBackground), renderBackground.x(), renderBackground.y(), renderBackground.z())
# Example 2
# Vectors
camera = vrCamera.getActiveCameraNode()
cameraPosition = camera.getTranslation()
print(type(cameraPosition), cameraPosition)
# Example 3
# Math operations on vectors
v1 = vr