# 以 CCT 實作簡易版第一人稱開門 ###### tags: `Omniverse` ## 功能 1. 第一人稱視角移動 2. 碰撞偵測 3. Q鍵開門 4. R鍵關門 > 持續增添新功能中。 [name=megan ( Omniverse 菜雞仔 )] ## 實作步驟 ### 創建場景 1. 開啟環境 : `Omniverse > Create > LAUNCH` 2. 新增場景 * 創建物理場景 : `Create > Physics > Physics Scene` * 創建地面 : `Create > Physics > Ground Plane` 4. 新增第一人稱的控制角色 * 創建角色 : `Create > Shape > Capsule` * 套用 character controller 功能 : * `Window > Simulation > character controller` * `PhysX Character Controller > Activate` 5. 新增門與牆壁 * 創建門 : * `Asset Store(beta) > Search:door` * download 順眼的門 : Simple_Wood_Door (輸入 sketchfab 密碼) * 創建牆壁*3 : `Create > Shape > Cube` ### 碰撞偵測 1. 在需要有物理阻擋的物件(牆壁*3、門)上賦予碰撞功能 : `Property > Add > Physics > Collider` ### Keyboard 事件 1. Q鍵開門 2. R鍵關門 3. code : ```python= import carb.imgui import carb.windowing import carb.input import omni.appwindow import omni from pxr import UsdGeom, Gf #get 門的資訊 stage = omni.usd.get_context().get_stage() door_prim = stage.GetPrimAtPath("/World/Simple_Wood_Door") xform = UsdGeom.Xformable(door_prim) xform.ClearXformOpOrder() transform = xform.AddTransformOp() mat = Gf.Matrix4d() #print(mat) #宣告 keyboard 的 input 事件 appwindow = omni.appwindow.get_default_app_window() keyboard = appwindow.get_keyboard() def on_input(e): #open door if e.input == carb.input.KeyboardInput.Q: mat.SetTranslateOnly(Gf.Vec3d(41.1198,3.00001,-359.37469)) #改變rotation mat.SetRotateOnly(Gf.Rotation(Gf.Vec3d(0, 1, 0), 120)) transform.Set(mat) #close door if e.input == carb.input.KeyboardInput.R: mat.SetTranslateOnly(Gf.Vec3d(41.1198,3.00001,-359.37469)) #改變rotation mat.SetRotateOnly(Gf.Rotation(Gf.Vec3d(0, 1, 0), 0)) transform.Set(mat) return True input = carb.input.acquire_input_interface() keyboard_sub_id = input.subscribe_to_keyboard_events(keyboard, on_input) ``` 4. 參考來源 * Omniverse 範例 : Window > Simulation > Demo Scene : Arena、Lego Technic Buggy * [keyboard input API](https://docs.omniverse.nvidia.com/py/kit/docs/api/carb/carb.input.html) * [set translate](https://docs.omniverse.nvidia.com/prod_digital-twins/app_isaacsim/reference_python_snippets.html) ## 影片 demo 網址 : https://youtu.be/G5YJTTwbFJA