튜토리얼 4: 일반적인 활용 사례를 통해 RED Core를 사용자화하는 방법

일반적인 활용 사례를 통해 RED Core를 사용자화하는 방법을 알아봅니다.

예제 스크립트 다운로드

예제 스크립트로 이동

동영상 캡션: 안녕하세요. VRED Core 튜토리얼에 오신 것을 환영합니다. 저는 크리스토퍼라고 하며, 오늘은 활용 사례 및 지난 동영상에서 시작한 VRED Core를 사용한 작업 자동화에 대해 계속해서 설명하겠습니다. 장면을 렌더링할 수 있는 파이프라인을 구축하고, 파일을 다른 형식으로 변환하고, 여러 파일을 한꺼번에 처리하는 간단한 자동화 스크립트를 사용하여 장면 그래프를 최적화하는 방법을 알려드리겠습니다.

VRED Core에 대한 자동화 스크립트를 작성하는 방법은 다양하며 이는 운영 체제, 활용 사례 및 기타 여러 요인에 따라 결정됩니다. 스크립트 작성에 정답은 없지만 바람직한 방법과 그렇지 않은 방법을 구분할 수는 있습니다.

이 튜토리얼에서는 Python 스크립트를 사용하여 VRED Core 파이프라인을 자동화하려고 하지만, Windows의 배치 스크립트, Linux의 공유 스크립트 또는 완전히 다른 접근 방식으로도 동일한 결과를 얻을 수 있습니다. 여기서는 수행할 수 있는 작업에 대한 개념을 소개하는 정도로 진행하려고 합니다.

저는 시스템에 설치된 Python 런타임과 함께 Visual Studio Code 환경을 사용하고 있습니다. 버튼을 누르면 스크립트를 실행하고 터미널에서 결과를 즉시 확인할 수 있습니다.

첫 번째 예제부터 시작하겠습니다. 한 디렉토리의 모든 파일을 다른 파일 형식으로 변환하려고 합니다. 지난 튜토리얼에서는 명령행에서 VRED를 시작할 때 코드를 실행하는 데 도움이 되는 -pre-post 명령행 옵션에 대해 살펴보았습니다. 이 매개변수를 사용하면 VRED에서 파일을 로드하도록 지정하고 파일 확장자를 변경해 다른 파일 형식으로 저장할 수 있습니다.

여기서는 한 단계 더 나아가 보겠습니다. 디렉토리의 모든 파일을 다른 파일 형식으로 자동으로 변환하고 싶습니다. 먼저 새 Python 파일로 시작하여 스크립트를 구성하는 변수를 정의합니다. VRED Core 실행 파일의 경로를 정의하고 소스 파일의 파일 확장자 및 해당 파일을 찾을 수 있는 디렉토리도 정의합니다. 또한 대상 파일의 파일 확장자와 해당 파일을 저장할 디렉토리를 정의합니다.

여기서 Windows 시작 경로를 사용하는 방법을 확인하고 r 키워드를 사용하여 여기서 정의된 것과 정확히 동일한 방식으로 문자열을 읽도록 지정해야 합니다. 그러지 않으면 백슬래시를 이스케이프해야 합니다. 대상 디렉토리가 없는 경우 생성해야 합니다.

그런 다음 소스 디렉토리의 모든 파일에서 반복할 수 있습니다. 올바른 확장자를 가진 파일만 처리하려고 하며, 확장자 없이 파일 이름을 추출해 변환된 파일을 저장할 파일 경로를 작성합니다. 그런 다음 소스 파일과 대상 파일의 파일 경로를 작성합니다. 변수 파일 이름에 전체 경로가 아닌 파일 이름만 포함되어 있기 때문에 이 작업을 수행해야 합니다.

VRED는 내부적으로 Linux 스타일 파일 경로만 사용하므로 주의해야 합니다. 그러나 Python 함수 join은 Windows 스타일 파일 경로를 반환합니다. 따라서 파일 경로를 사용하려면 먼저 모든 백슬래시를 슬래시로 대체해야 합니다.

마지막으로, 하위 프로세스 함수 call로 VRED Core를 시작하고 -pre Python 매개변수를 추가하여 파일을 변환합니다. 스크립트를 실행하면 소스 디렉토리의 모든 파일이 VRED에 로드되어 다른 파일 형식으로 대상 디렉토리에 저장됩니다.

이 방법이 VRED Core에서 작업을 자동화하는 가장 효율적인 방법이 아닐 수 있다는 의심이 들 수 있습니다. 모든 파일에 대해 스크립트가 VRED를 시작하고 파일을 처리하고 VRED를 다시 닫는 데 다소 시간이 걸리기 때문입니다.

이 방법은 소수의 파일에 적합하지만, 짧은 시간에 많은 파일을 처리하려는 경우에는 너무 많은 오버헤드가 발생합니다. 하지만 걱정하지 마십시오. 다음 예제에서 이 문제를 해결할 것입니다.

배치 렌더링, 좀 더 정확하게는 VRED Pro에서 자동 렌더링을 사용자화하는 방법을 살펴보겠습니다. 서로 다른 뷰포인트 및 변형 조합을 사용하여 많은 프레임을 렌더링해야 하는 문제가 종종 발생합니다. VRED Pro에서는 매우 쉽습니다. 렌더 설정을 사용하여 VRED에서 변형 세트 및 뷰포인트의 모든 조합을 순서대로 렌더링하도록 지정할 수 있기 때문입니다.

물론 VRED Core에서 Python 스크립트를 사용하여 동일한 결과를 얻을 수도 있습니다. 다시, 새로운 Python 파일로 시작하고, 뷰포인트 및 변형 세트의 모든 조합을 렌더링하는 코드를 추가합니다. 먼저 VRED 파일이 있는 위치, 사용할 변형 및 렌더링할 뷰포인트를 스크립트에 알리는 몇 가지 변수를 정의합니다. 또한 렌더링된 이미지를 정렬할 수 있는 새 파일 이름을 생성하는 데 사용되는 경로 템플릿을 정의합니다.

다음으로 load 함수를 사용하여 VRED 파일을 로드하고 모든 뷰포인트 및 변형 세트에서 반복을 시작합니다. 그러면 차례대로 장면에서 이 특정 상태를 선택한 다음 createSnapshot을 사용하여 이미지를 렌더링합니다.

여기서 뷰포인트 및 변형 이름을 사용하여 앞서 정의한 경로 템플릿을 따르고 렌더링 해상도도 설정합니다. 이 Python 스크립트가 모든 이미지를 렌더링하겠지만 스크립트를 VRED로 가져와야 합니다.

이전 예에서는 -pre Python 매개변수를 사용했으며 전체 스크립트가 일반적인 Python 파일처럼 로드됩니다. 텍스트 또는 파일을 base64로 인코딩하고 그 결과를 VRED의 매개변수로 가져올 수 있는 온라인 서비스가 있습니다.

이 문자열 문자와 숫자는 인코딩한 것과 동일한 코드이므로 VRED가 이를 이해하고 실제 Python 코드로 읽을 수 있습니다. -pre Python 매개변수의 base64 문자열을 복사하여 붙여넣을 수 있으며 전체 스크립트가 일반적인 Python 파일처럼 로드됩니다. 텍스트 또는 파일을 base64로 인코딩하고 그 결과를 VRED의 매개변수로 가져올 수 있는 온라인 서비스가 있습니다.

이 문자열 문자와 숫자는 인코딩한 것과 동일한 코드이므로 VRED가 이를 이해하고 실제 Python 코드로 읽을 수 있습니다. -pre Python 매개변수의 base64 문자열을 복사하여 붙여넣을 수 있지만 이 예제에서는 Python 스크립트에서 VRED 스크립트를 직접 인코딩하는 방법을 소개하겠습니다.

이렇게 하려면 Python 코드 블록을 삼중 따옴표로 둘러싸고 텍스트를 변수에 저장해야 합니다. 삼중 따옴표를 사용하면 코드 블록이 작성될 때 한 줄씩 정확히 해석되도록 할 수 있습니다. 스크립트는 유효한 Python 스크립트여야 하므로 공백과 모든 것이 정확해야 합니다. 그렇지 않으면 VRED가 이 스크립트를 실행하려고 시도할 때 오류가 발생합니다.

이제 변수를 사용하여 스크립트 내용을 이 base64 코드 행으로 인코딩할 수 있습니다. 마지막 행에서는 매개변수 -pre Python과 인코딩된 Python 스크립트를 입력으로 사용하여 VRED Core를 시작합니다. 일부 누락된 가져오기를 맨 위에 추가하기만 하면 모든 준비가 완료됩니다. 스크립트를 실행하는 데 시간이 걸리긴 하지만 장면의 9가지 이미지가 렌더링됩니다.

좋습니다. base64 인코딩을 사용하는 것은 전체 Python 스크립트를 VRED Core로 가져오기에 좋은 방법이지만 이 예제에서 수행한 방식에는 여전히 약간의 단점이 있습니다. 가장 큰 단점은 VRED Python 스크립트가 자동화 Python 스크립트와 동일한 파일에 있다는 것입니다.

보시다시피 VRED 스크립트를 따옴표로 묶으면 IDE에서는 일반적인 Python 구문 강조 표시를 보여 주지 않습니다. 이대로 스크립트를 읽고 유지 관리하는 것은 쉽지 않으므로 장면 형상의 최적화를 자동화하는 방법을 설명하는 다음 예제에서 좀 더 최적화해 보겠습니다.

이번에는 두 개의 Python 파일이 필요합니다. 하나는 VRED Python 스크립트를 포함하는 것이고 다른 하나는 이 스크립트를 입력으로 사용하여 VRED Core를 시작하는 것입니다. VRED 스크립트에서, 데이터 변환 예제에서처럼 시작하고 최적화되지 않은 파일을 포함하는 디렉토리 및 최적화된 파일에 대한 디렉토리에 대한 변수를 정의합니다.

디렉토리가 아직 없는 경우 생성해야 합니다. 최적화되지 않은 파일에 대해 반복하고, 소스 및 대상 파일 경로를 생성하고, 최적화되지 않은 파일을 로드하고, 최적화를 적용합니다. 이러한 최적화 방법은 VRED의 Python API 1에 있는 vrOptimize 모듈에 정의되어 있습니다. 온라인에서 설명서를 찾을 수 있습니다.

적용할 수 있는 최적화 방식이 상당히 많으며, 형상 및 활용 사례에 따라 최적화 방식이 달라집니다. 제가 선택한 두 옵션은 여기에 있는 예제입니다. 마지막으로, 대상 파일 경로에 파일을 저장해야 합니다. 모든 파일이 처리되면 VRED를 종료할 수 있습니다. 이 스크립트는 이전 예제와 같은 base64 인코딩 방법을 사용하여 VRED로 직접 가져옵니다. 그러나 이번에는 VRED를 다른 Python 스크립트에서 시작하여 별도로 유지합니다.

이제 두 번째 Python 파일에서 VRED Core에 대한 경로를 정의하고 두 파일이 저장된 디렉토리의 경로도 정의합니다. 이 작업은 이 스크립트가 실행될 때 정확히 이 스크립트에 대한 전체 경로를 포함하는 이 Python 스크립트의 파일 속성을 사용하여 수행할 수 있습니다. 그런 다음 동일한 디렉토리에 있는 방금 생성한 VRED 스크립트 파일을 열고 내용을 읽습니다. 그런 다음 이전 예제에서와 같이 파일 내용을 base64로 인코딩하고 VRED를 시작할 수 있습니다.

VRED 스크립트와 자동화 스크립트를 분리하면 다른 파이프라인에서 VRED 스크립트에서 재사용할 수 있고 구문 강조 표시 같은 기능을 사용해 Visual Studio 같은 IDE에서 개발을 진행할 수 있는 장점이 있습니다.

이 예제에서는 VRED를 시작한 다음 실행 중인 VRED 인스턴스 내에서 모든 파일을 처리할 수도 있습니다. 이는 최적화하려는 모든 파일에 대해 VRED를 시작하는 것보다 훨씬 효율적입니다.

VRED에서 렌더링 또는 데이터 준비 파이프라인을 자동화하고 스크립팅하는 다양한 방법이 있습니다. 이 작업은 Python을 통해 수행할 수 있지만 배치, 쉘 등의 다른 스크립팅 언어도 사용할 수 있습니다. 이는 작업, 활용 사례 및 사용하는 개발 환경에 따라 완전히 다릅니다. 하지만 기본 원리는 항상 비슷합니다. -pre-post Python 명령행 매개변수를 사용하여 Python 스크립트를 VRED에 삽입하면 자동으로 처리됩니다. 또한 이러한 Python 스크립트는 VRED의 Python API에 정의된 모든 함수를 사용할 수 있습니다.

오늘 배운 내용이 처음으로 자동화 VRED 파이프라인을 스크립팅하는 데 있어 좋은 시작점이 되었으면 합니다. 오늘은 이것으로 마치겠습니다. 스크립팅 튜토리얼이 도움이 되셨기를 바랍니다. 다음에 또 뵙겠습니다.


샘플 Python 코드

튜토리얼 4: 일반적인 활용 사례를 통해 VRED Core를 사용자화하는 방법 동영상과 함께 제공되는 예제 Python 스크립트입니다.

팁:

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

batch-data-conversion.py

import base64
import subprocess
import os

print("=[VRED Core Tutorial] Batch Data Conversion")

vredCorePath = r'D:\Programme\Autodesk\VREDCore-13.3\bin\WIN64\VREDCore.exe'

sourceExtension = 'vpb'
sourceDirectory = r'C:\VRED_Examples\vpb'

targetExtension = 'fbx'
targetDirectory = r'C:\VRED_Examples\fbx'

# Create target directory if it does not exist
if not os.path.exists(targetDirectory):
    os.makedirs(targetDirectory)

# Iterate over files in source directory and process each filename
for filename in os.listdir(sourceDirectory):
    # ... but only if the file extension matches
    if filename.endswith(sourceExtension): 
        # Extract the file name without the extension
        namePart = filename.split('.')[0]

        print("=[VRED Core Tutorial] Data Conversion: {} from {} to {}".format(namePart, sourceExtension, targetExtension))

        # Create paths for the source and the target file
        # Replace windows backslashes with linux style forward slashes
        sourcePath = os.path.join(sourceDirectory, filename).replace('\\','/')
        targetPath = os.path.join(targetDirectory, '{}.{}'.format(namePart, targetExtension)).replace('\\','/')

        # Start vred and process files
        subprocess.call([vredCorePath, '-prepython=load("{}"); save("{}"); terminateVred()'.format(sourcePath, targetPath)])

print("=[VRED Core Tutorial] Finished Batch Data Conversion...")

batch-data-optimization-runner.py

import os
import base64
import subprocess

vredCorePath = r'D:\Programme\Autodesk\VREDCore-13.3\bin\WIN64\VREDCore.exe'

directory = os.path.dirname(__file__)

with open(os.path.join(directory, 'batch-data-optimization.py'), 'r') as file:
    # Read file content
    scriptContent = file.read()

    # Convert python script to base64, in order to import it into VRED
    base64EncodedScript = base64.b64encode(scriptContent.encode('UTF-8')).decode('UTF-8')

    # Start VRED with prepython and the base64 encoded script as input
    subprocess.call([vredCorePath, '-prepython={}'.format(base64EncodedScript)])

batch-data-optimization.py

import os

print("=[VRED Core Tutorial] Batch Data Optimization")

sourceDirectory = 'C:/VRED_Examples/unoptimized'
targetDirectory = 'C:/VRED_Examples/optimzied'

# Create target directory if it does not exist
if not os.path.exists(targetDirectory):
    os.makedirs(targetDirectory)

# Iterate over files in source directory and process each filename
for filename in os.listdir(sourceDirectory):
    print("=[VRED Core Tutorial] Optimize file: {}".format(filename))

    # Create paths for the source and the target file
    # Replace windows backslashes with linux style forward slashes
    sourcePath = os.path.join(sourceDirectory, filename).replace('\\\\','/')
    targetPath = os.path.join(targetDirectory, filename).replace('\\\\','/')

    # Load file in VRED
    load(sourcePath)

    # Optimize Geometry
    removeTransformNodesWithNoChildren(findNode("Root"))
    optimizeIndices(findNode("Root"))

    # Save optimized file
    save(targetPath)

# Close VRED instance
terminateVred()

batch-rendering.py

import sys
import base64
import subprocess

vredCorePath = r'D:\Programme\Autodesk\VREDCore-13.3\bin\WIN64\VREDCore.exe'

batchRenderingScript = '''
vredSceneFile = r"C:/ProgramData/Autodesk/VREDPro-13.3/examples/Automotive_Genesis.vpb"
variants = ("Black Metallic", "Blue Fire Metallic", "Silver Dark Metallic")
viewpoints = ("Home", "Left-Back", "Viewpoint")
pathTemplate = r"C:/VRED_Examples/batch_rendering/variant_{viewpoint}_{variant}.png"

print("=[VRED Core Tutorial] Load Source file...")
load(vredSceneFile)

print("=[VRED Core Tutorial] Iterate viewpoints and variants...")
for viewpointName in viewpoints:
    vp = vrCameraService.getViewpoint(viewpointName)
    if not vp.isNull():
        vp.activate()
        for variantName in variants:
            print("=[VRED Core Tutorial] Rendering {}, {}".format(viewpointName, variantName))
            vrVariants.selectVariantSet(variantName)
            createSnapshot(pathTemplate.format(viewpoint=viewpointName, variant=variantName), 1920, 1080)

print("End")
'''

# Convert python script to base64, in order to import it into VRED
base64EncodedScript = base64.b64encode(batchRenderingScript.encode('UTF-8')).decode('UTF-8')

# Start VRED with prepython and the base64 encoded script as input
subprocess.call([vredCorePath, '-prepython={}'.format(base64EncodedScript)])