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


 

Posted by 도이(doi)
,