htc Vive와 kinect를 네트워크를 통해서 연결시켜보자.
- microsoft사에서 제공하는 kinect 유니티 패키지 사용
- steamVR plugin 사용
- photonNetwork 사용
우선, 2대의 컴퓨터에 각각 kinect와 htcVive를 설치한다. (설치 방법은 생략)
구조
1. SceneSetting
2. htcVive용 Kinect용 분리시키기(다른 타입의 player 생성)
3. htcVive pc Setting & Kinect pc Setting
4. tiltBrush 동기화 시키기
1. SceneSetting
2. htcVive용 Kinect용 분리시키기
mode선택 enum을 사용하는 스크립트 작성하기.
kinect용 pc와 htcVive용 pc에 각각 적합한 모드를 선택해줄 것.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 |
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum PlayerType
{
none = -1,
HTCvive = 0,
Kinect = 1
}
public class Mode : MonoBehaviour {
public PlayerType playerType = PlayerType.none;
public static Mode instance = null;
private void Awake()
{
if (instance == null)
{
instance = this;
}
else if (instance != this)
{
Destroy(this.gameObject);
}
DontDestroyOnLoad(this);
}
}
|
cs |
mode스크립트는 모드에 따라서 네트워크 연결시 각각 다른 player를 instantiate한다.
위의 환경 세팅에 만들어 둔 Resources폴더에
미리, VivePlayer와 KinectPlayer를 만들어 두었던 것을 불러온다.
3. htcVive & Kinect 네트워크 작업 구조도
4. tiltBrush 동기화 시키기
htcVive 컨트롤러 tiltBrush 동기화 시키기 (CtrlNet스크립트)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 |
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using Valve.VR;
public class cntrlNet : MonoBehaviourPunCallbacks, IPunObservable {
private Transform tr;
private GameObject tiltBrush;
public SteamVR_Input_Sources any = SteamVR_Input_Sources.Any;
public SteamVR_Action_Boolean triggerAction;
private bool isTriggerDown = false;
void Awake()
{
SteamVR_Behaviour_Pose steamctrl=gameObject.GetComponent<SteamVR_Behaviour_Pose>();
if (photonView.IsMine == false)
{
steamctrl.enabled = false;
}
}
void Start()
{
tr = GetComponent<Transform>();
tiltBrush = GameObject.Find("tiltBrush");
tiltBrush.SetActive(false);
if (SteamVR_Input.initialized == false)
{
Debug.Log("cntrl is not detected");
return;
}
}
void Update () {
//controlled locally일 경우 이동(자기 자신의 캐릭터일 때)
if (photonView.IsMine)
{
if (triggerAction.GetState(SteamVR_Input_Sources.Any))
{
isTriggerDown = true;
}
else
{
isTriggerDown = false;
}
if (SteamVR_Input._default.inActions.InteractUI.GetStateDown(SteamVR_Input_Sources.Any))
{
tiltBrush.SetActive(true);
}
else if (SteamVR_Input._default.inActions.InteractUI.GetStateUp(SteamVR_Input_Sources.Any))
{
tiltBrush.SetActive(false);
}
}
else
{
//끊어진 시간이 너무 길 경우(텔레포트)
if ((tr.position - currPos).sqrMagnitude >= 10.0f * 10.0f)
{
tr.position = currPos;
tr.rotation = currRot;
}
//끊어진 시간이 짧을 경우(자연스럽게 연결 - 데드레커닝)
else
{
tr.position = Vector3.Lerp(tr.position, currPos, Time.deltaTime * 10.0f);
tr.rotation = Quaternion.Slerp(tr.rotation, currRot, Time.deltaTime * 10.0f);
}
tiltBrush.SetActive(currTrigger);
}
}
//클론이 통신을 받는 변수 설정
private Vector3 currPos;
private Quaternion currRot;
private bool currTrigger;
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
//통신을 보내는
if (stream.IsWriting)
{
stream.SendNext(tr.position);
stream.SendNext(tr.rotation);
stream.SendNext(isTriggerDown);
}
//클론이 통신을 받는
else
{
currPos = (Vector3)stream.ReceiveNext();
currRot = (Quaternion)stream.ReceiveNext();
currTrigger = (bool)stream.ReceiveNext();
}
}
}
|
cs |
'Project > Galapagos' 카테고리의 다른 글
Flocking Day2(2d flocking코드 분석) (0) | 2019.01.11 |
---|---|
네트워크 Day5 (포톤네트워크 PUN2 - 동기화 분석) (0) | 2018.12.25 |
유체역학 이론 Day01(구간 반복 시키기 - Bound Movement) (0) | 2018.12.14 |
네트워크 Day3 (포톤네트워크 PUN2 - 동기화) (2) | 2018.12.13 |
네트워크 Day2 (포톤네트워크 PUN2 - 네트워크 개념, 포톤네트워크 사용) (1) | 2018.12.12 |