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