Unity+Vive로 개발
유닛으로 바이브로 시운전해보세요.
어쨌든 초기초적인 VR 콘텐츠가 실현될 때까지 샘플 이동을 먼저 한다.
vive의 설치가 끝났을 예정입니다.
그럼 시작합시다.
1. SteamVR 플러그인 설치
Asset Store에서 StepVR을 다운로드합니다.
https://www.assetstore.unity3d.com/jp/#!/content/32647
(약 7MB인데 다운로드하는 데 시간이 많이 걸린다)
2. SteamVR 설정
AssetStore에서 시작한 DL+Import가 끝나면 VR 설정 윈도를 자동으로 엽니다.
단계 VR 설정에서 Windowga가 열리지 않거나 닫히지 않으면 Import의 Plugins 폴더와 SteamVR 폴더를 삭제하고 다시 Import를 진행합니다.
이는 유니티 프로젝트 설정을 VR 특화로 일괄 변경한다.
특별히 신경 쓰지 않으면 실행
Accept All
하세요.3. Example 장면 보기
Assets/SteamVR/Scenes에 example 장면이 준비되어 있습니다.보다
이런 장면이 열린다.
Unity에서 장면을 재현할 때
- ViveHMD 및 장면 카메라 동기화
-vive 컨트롤러 동기화
- 기지국 동기화
탭
Hierrarchy에 있음
- Main Camera (origin)
- [SteamVR]
객체 중 하나를 삭제하거나 InActive로 설정하면 Vive가 Unity에서 분리되어 호스트(This Real)로 돌아갑니다.
또 장면 재현에서 컨트롤러가 얼굴에 다가오면 컨트롤러가 보이지 않는다.
가정과 더랩에서는 컨트롤러에 가까이 있어도 사라지지 않기 때문에 유닛에서 바이브 콘텐츠를 만드는 데 시간이 좀 걸린다.
3. 준비된 Prefab 보기
샘플 장면에서 사용하는데 중요한 것 같아서 살짝 보고 싶어요.
Main Camera (origin)
Controller의 구성 요소를 관리하기 위한 것이지만 InActive 컨트롤러라도 움직일 수 있기 때문에 이 샘플에는 아무것도 하지 않은 것 같습니다.
그런데 이벤트의 문자열에 낙타와 뱀이 섞여 있으니 징그럽다.실수가 많은 건 맞아요.
SteamVR_Utils.Event.Listen("input_focus", OnInputFocus);
SteamVR_Utils.Event.Listen("device_connected", OnDeviceConnected);
SteamVR_Utils.Event.Listen("TrackedDeviceRoleChanged", OnTrackedDeviceRoleChanged);
Scene과 GameWinsow에 Gizmo 구성 요소를 쓰기 위해서라고 생각합니다.
PlayArea 어셈블리의 매개변수에는 Size 항목, 2m이 있습니다.× 1.5m와 4m×3m 등 프리셋을 준비했다.이 사이즈에 맞춰 기즈모를 그리기 위해서는 제작 무대에 참고가 될 것 같다.
MainCamera(origin) Add의 Mesh Renderer와 MeshFilder는 PlayArea 구성 요소에서 사용됩니다.
기지국에서 얻을 수 있는 실제 플레이 아레아 사이즈는 게임 실행 시 바이브에서 얻을 수 있다(가능)
Controller (left)
Main Camera(origin)의 하위 요소에는 컨트롤러가 있습니다.right용 게임Object도 있는데 어쨌든 Left만 볼게요.
SteamVR_TrackedObject 구성 요소는 Add입니다.이 구성 요소는 컨트롤러 전용 구성 요소가 아니며 HMD 및 기타 Device도 사용할 수 있습니다.
인덱스 매개 변수로 Hmd, Device 1~15을 선택할 수 있습니다.
Device 1∼15 모두 준비돼 있는데, 현재 기지국에서 읽을 수 있는 요소는 컨트롤러 2개와 Hmd 총 3개에 불과해 앞으로 늘어날 수 있다.송이경(신지현):어,이제 스토킹할 수 있는대상도 추가되나?
이 샘플에서 Left 컨트롤러는 Device 1, Right 컨트롤러 Device 2로 설정됩니다. (이것은 게임 재생 후 바로 설정됩니다. 게임 재생 전 Inspector에서 Index는 None으로 설정됩니다.)
아, 쓸 수 있는 컨트롤러가 4개 정도 돼서 다 같이 싸웠으면 좋겠어요
이 구성 요소는 Vive가 지정한 업데이트 시간에 따라 기지국에서 픽업한 좌표와 각도의 정보를 업데이트합니다.주의해야 할 것은 이 구성 요소가 Device 유형을 설정한 것이 아니라는 것이다.외부에서 SetDeviceIndex 함수로 불리며 "Left 컨트롤러는 Device1을 사용해야 합니다~"라는 느낌으로 사용된다고 생각합니다.
Vive 지정 업데이트 타이밍은
SteamVR_Utils.Event.Listen("new_poses", OnNewPoses);
에서 이벤트에 가입할 수 있습니다.컨트롤러 GameObject의 하위 요소에는 모델이 있지만 나는 이것이 아무것도 하지 않았다고 생각한다.삭제 후 수행해도 변경되지 않음
그냥 모델에는 SteamVR이 있어요.RenderModel 구성 요소는 Tracked Devices 객체 이하의 Device 1~15 객체와 바짝 붙어 있는 구성 요소와 같습니다.
컨트롤러의 하위 요소에 3D 모델을 덧붙이고 싶지만 변경되었으니 Tracked Device로 관리하는 게 좋을 것 같아서 삭제하는 것을 잊었겠지...완전 억측이다
컨트롤러의 실제 상태가 Tracked Devices 객체 아래의 각 Device 객체임을 잊지 마십시오.
그러나 이것은 단지 3D 모델을 표시하는 대상일 뿐이고 위치와 각도의 동기화는 Controller 대상의 SteamVR이다TrackedObject 구성 요소가 진행 중입니다!
(이 샘플에서 Device 1과 2는 컨트롤러의 모형이다)
이렇게 쓰고서야 눈치챘어요.
Tracked Devices 객체의 Device 1 및 Device 2에서 SteamVRTrackedObject 구성 요소 및 SteamVR렌더링 모듈 어셈블리가 표시됩니다.
컨트롤러의 실제 상태는 Controller(left) 대상이 아니라 Tracked Devices 대상의 Device 1과 Device 2라는 것이다.
Controller(left)도 위치와 각도를 대체적으로 동기화했습니다.
Controller(left)와 Device 1의 뜻이 겹쳐서 언뜻 보면 무의미하게 헷갈리기 쉽지만
바이브 씨는 "인덱스를 지정하면 언제 어디서든 추적 대상의 위치와 각도 등 정보를 얻을 수 있다"고 얻기 어려운 가르침을 받았다.
Main Camera(head)
Main Camera(origin)의 하위 요소실제로 카메라를 들고 있는 사람은 이 아이다.
SteamVR_GameView 구성 요소 및 인덱스에 HMD가 지정된 SteamVRTrackedObject 구성 요소가 있습니다.
SteamVR_GameView 구성 요소는 카메라가 장면을 완성한 후에 On PostRender 함수라고 불리며 GL을 만지작거린다.
유닛에서 개발하고 확인할 수 있는 게임윈도의 묘사를 하기 위해서일 수도 있다.
ViveHMD와 Unity 카메라를 연결하는 부품은 정말 불가사의하다
[SteamVR]
[SteamVR] 대상의 Step VR렌더링 어셈블리가 표시됩니다.
이는 유닛의 영상을 바이브HMD에 보여주기보다는 유닛의 주력 영상 중 어느 층에서
ViseHMD에서 재생할지 여부를 결정하는 구성 요소입니다.
왼쪽 눈과 오른쪽 눈에 각각 레이어마스크 (LayerMask) 를 붙일 수 있기 때문에 사용 방법에 따라 재미있는 대상이 생길 수 있다.
한 사람은 컴퓨터 화면을 보고, 다른 한 사람은 HMD를 쓴다.PC 화면으로만 이동할 대상자를 준비하고, PC 화면을 보는 사람과 HMD를 착용한 사람이 함께 하는 게임?
일단 첫 번째 VR.나는 TrackedObject 구성 요소가 가장 중요하다는 것을 발견했다.
3. 오리지널 콘텐츠 제작 시도
제작 내용은요.
- 컨트롤러의 트리거를 누르면 컨트롤러의 위치가 Cube를 생성합니다.
.
3-1 새 장면 만들기
새 장면을 생성합니다.
신제품이라 메인 카메라와 램프만 있어요.
일단 메인 카메라부터 삭제해.
3-2 전용 카메라 및 컨트롤러 추가
Assets/SteamVR/Prefabs에 [CameraRig]Prefab이 있기 때문에 장면에 추가합니다.
이렇게 게임을 하면 카메라와 컨트롤러가 동기화된다.
3-3 컨트롤러 줍기 이벤트
이런 느낌의 코드로 이벤트를 줍을 수 있습니다.
참조된 웹 사이트(https://framesynthesis.jp/tech/unity/htcvive/)
public SteamVR_TrackedObject trackedObject;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
var device = SteamVR_Controller.Input((int)trackedObject.index);
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
{
Debug.Log("トリガーを深く引いた");
}
}
게임이 재생된 지 얼마 되지 않아 몇 번IndexOutOfRangeException: Array index is out of range.
이 발생할 것이다. Device(컨트롤러)의 로그인·식별 전에 Device에 접근하려고 하기 때문이라고 생각한다.아무래도 다양한 상황에서 트리거를 얻을 수 있을 때의 이벤트가 시작됐다.
3-4Cube가 발생합니다.
트리거의 이벤트가 얻었기 때문에 나머지는 좌표만 알 뿐이다.
device.transform.pos
에서 알고 싶은 장치의 세계 좌표를 얻을 수 있습니다마지막 코드는 이렇습니다.
public GameObject cube;
public SteamVR_TrackedObject trackedObject;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
var device = SteamVR_Controller.Input ((int)trackedObject.index);
if (device.GetPressDown (SteamVR_Controller.ButtonMask.Trigger)) {
Debug.Log ("トリガーを深く引いた");
var newCube = Instantiate (cube, device.transform.pos, Quaternion.identity);
}
}
컨트롤러의 위치는 큐브만 일어났을 뿐이지만 3D의 세계에서 이 일을 하는 것도 즐겁다.향후 VR 콘텐츠 개발을 기대한다. :)
Reference
이 문제에 관하여(Unity+Vive로 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ShirakawaMaru/items/056a336ab817b60ed875텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)