---
# System prepended metadata

title: 以 CCT 實作簡易版第一人稱開門
tags: [Omniverse]

---

# 以 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

