공부

Nvidia Omniverse)USD Composer에서 파이썬 코드 제어로 공 굴리기

복제고양이 2024. 8. 29. 14:45
300x250

 

 

 

 Nvidia Omniverse 를 한번 다루게 되는 기회가 생겼다. 

엔비디아에서 만든 일종의 협업 툴이라는데 하나의 usd파일이 유니티로 치면 일종의 씬 역할을 하는 듯 하다.

디자이너나 개발자가 하나의 usd 파일로 주고받아서 작업을 더 쉽게 만드려는 것 같다.

 

 

툴의 모양도 언리얼이나 유니티와 익숙해 보인다.

 

하지만 한가지 문제가 있었는데 이 툴을 사용하기가 어려웠다. 아니 그보다 무슨 툴을 사용해야하는지부터 알기 힘들었다.

다양한 툴을 제공하는데 단순히 파이썬 코드로 제어하는 것을 테스트하려면 무슨 프로그램을 설치하고 사용해야하는지 모호했다. 툴 디자인들도 다 비슷한데 묘하게 기능이 다르기도 하고..

엔비디아 문서도 보고 공식 유튜브를 따라해보려고 해도 뭔가 바뀌었는지 똑같이 따라할 수가 없었다.

예전 정보가 섞여있거나 흩어져있는 느낌이라고 해야하나..

 

 

 

다행히 누군가 유니티의 공굴리기 예제를 옴니버스에 옮겨서 구현하는 예제를 올려주었다.

덕분에 이해가 가지 않던 방법을 따라갈 수 있었다.

 

 

 

 

 

다만 영상을 보고도 난관에 부딪혔는데 우선 해당 영상과 다른 가이드 문서에서 보이는 CREATE라는 프로그램을 찾을 수 없었다.

런처의 거래소 탭에서 제공하는 프로그램들을 설치하면서 비교해본 결과 제일 유사한 프로그램이 USD Composer였다. 

 

Omniverse USD Composer Interface — Omniverse USD Composer latest documentation (nvidia.com)

 

Omniverse USD Composer Interface — Omniverse USD Composer latest documentation

Copyright © 2023-2024, NVIDIA Corporation. Last updated on Aug 28, 2024.

docs.omniverse.nvidia.com

 

인터페이스 개요 페이지의 이미지 상단의 창 이름이 CREATE beta인 것으로 보아 CREATE가 USD Composer가 맞는듯 하다.

 

 

영상을 따라 드래그 앤 드롭으로 Player 이름의 공과 다른 오브젝트들을 배치하고, 머티리얼과 물리를 적용해주고 

마지막에 Player 파이썬 코드를 따라 작성하던중 컴파일 에러가 발생했다.

 

에러가 나는 부분을 제거하고 내 PC에서 작동이 되도록 코드를 다시 수정했다.

 

import carb
import numpy as np
import omni.appwindow
from omni.kit.scripting import BehaviorScript
from carb.input import KeyboardEventType
# from carb.input import KeybaordInput

from omni.physx import get_physx_interface
from pxr import Gf, UsdGeom, Usd

class Player(BehaviorScript):
    def on_init(self):
        carb.log_info(f"Hello")
        self._force = [0,0,0]

    def on_destroy(self):
        carb.log_info(f"{type(self).__name__}.on_destroy()->{self.prim_path}")
        input = carb.input.acquire_input_interface()
        input.unsubscribe_to_keyboard_events(self._keyboard, self._keyboardSubId)
        input = None
        self._keyboard = None

    def on_play(self):
        appwindow = omni.appwindow.get_default_app_window()
        self._keyboard = appwindow.get_keyboard()
        input = carb.input.acquire_input_interface()
        self._keyboardSubId = input.subscribe_to_keyboard_events(self._keyboard, self._on_input_event)

    def _on_input_event(self, event):
        force_strength = 500000
        if event.type == KeyboardEventType.KEY_PRESS:
            if event.input == carb.input.KeyboardInput.D: self._force[0] = force_strength
            if event.input == carb.input.KeyboardInput.A: self._force[0] = -force_strength
            if event.input == carb.input.KeyboardInput.S: self._force[2] = force_strength
            if event.input == carb.input.KeyboardInput.W: self._force[2] = -force_strength
        elif event.type == KeyboardEventType.KEY_RELEASE:
            if event.input == carb.input.KeyboardInput.D: self._force[0] = 0
            if event.input == carb.input.KeyboardInput.A: self._force[0] = 0
            if event.input == carb.input.KeyboardInput.S: self._force[2] = 0
            if event.input == carb.input.KeyboardInput.W: self._force[2] = 0
        print(self._force)

   
 
    def on_stop(self):
        carb.log_info(f"{type(self).__name__}.on_stop()->{self.prim_path}")
        self.on_destroy()
        
    def on_update(self, current_time: float, delta_time: float):
        # Get Position
        xform = UsdGeom.Xformable(self.prim)
        world_transform = xform.ComputeLocalToWorldTransform(Usd.TimeCode.Default())
        position = world_transform.ExtractTranslation()
        position = carb.Float3(position)

        # Apply Force
        force = np.asarray([self._force[0], self._force[1], self._force[2]])
        force = carb.Float3(force)

        # Apply force at position
        get_physx_interface().apply_force_at_pos(str(self.prim_path), force, position)

 

---

 지금 여기에 정리하면서 코드를 다시 확인해보니 KeyboardInput 을 KeybaordInput 이라고 오타를 냈다는 것을 발견했다.

저걸 고치면 영상에서 나온 코드도 정상 동작을 할 것 같은 느낌이 들지만

이미 변경한 코드로 작동은 확인했으니 넘어가기로 했다.

--

 

이제 Player라는 이름의 공이 파이썬 코드에서 키보드 wasd입력을 감지하고 주어지는 힘과 위치를 바꿀 수 있다.

 

 

오브젝트와 머티리얼을 배치하는 것은 어떤 면에선 유니티보다 쉬웠다. 그러면서 그래픽은 언리얼 느낌이 난다.

잘 사용하면 괜찮아 보이는 프로그램이지만 아직 내가 완전히 이해하기에는 아직 어렵다.

메뉴얼이나 사용 가이드 동영상도 아직 정리되지 않은 느낌이었다.

좀 더 업데이트되고 사용하는 사람들이 더 늘어나면 그때는 좀 더 사용하기 쉽지 않을까 싶다.

 

 

 

 

반응형