HoloLens에서 실제 벽과 바닥에 반사하는 레이저를 쏴보세요 # 애셋 Adkale

11083 단어 HoloLensUnity
이 기사는 Unity Assets Advent Calendar 2016 20일째 기사가 됩니다.

오늘은 HoloLens의 공간 인식을 이용하여 현실의 벽이나 바닥이나 천장이나 책상 등에서 반사하는 레이저를 쏘아봅니다.

ArcReactor Rays Generator 1.8 (Dec 16, 2016)





반사하는 빔의 포인트가 되는 것은 Demo3_reflect 데모 장면에 포함된 LaserLauncher, PlasmaLauncher 게임 객체에 부착된 ArcReactor_Launcher.cs입니다. 이것의 Reflection Settings에서 반사시키고 싶은 Layer를 지정.

그리고, 반사하는 벽에 부착된 ArcReactorDemo3Mirror.cs가 실제의 반사를 실시하고 있는 것 같습니다.


그러므로 HoloToolkit-Unity에 포함된 공간인식 후에 좋게 Plane을 생성하여 배치해 주는 SpatialProcessing 데모 장면을 바탕으로 생성된 Plane에 대해 ArcReactorDemo3Mirror.cs도 첨부하도록 조금 커스터마이징합니다. .

SurfaceMeshesToPlanes.cs

// どっかに追加してインスペクター上で\ArcReactor\Demos\Prefabs\Particles\MirrorHitBubbles.prefabをアタッチする
public GameObject hitParticles;

// 265行目付近に追加
ArcReactor.Demo.ArcReactorDemo3Mirror mirror = destPlane.AddComponent<ArcReactor.Demo.ArcReactorDemo3Mirror>();
mirror.hitParticles = hitParticles;
Gradient g;
GradientColorKey[] gck;
GradientAlphaKey[] gak;
g = new Gradient();
gck = new GradientColorKey[2];
gck[0].color = Color.red;
gck[0].time = 0.0F;
gck[1].color = Color.blue;
gck[1].time = 1.0F;
gak = new GradientAlphaKey[2];
gak[0].alpha = 1.0F;
gak[0].time = 0.0F;
gak[1].alpha = 0.0F;
gak[1].time = 1.0F;
mirror.colorGrad = g;
mirror.rotationSpeed = new Vector3(0f, 0f, 0f);
destPlane.transform.parent = planesParent.transform;
SurfacePlane surfacePlane = destPlane.GetComponent<SurfacePlane>();

이것으로 SurfacePlane이 이렇게 된다.


레이저를 Air-Tap으로 배출



다음으로 Demo3_reflect 데모 장면에 있던 LaserLauncher 게임 오브젝트를 참고로 ArcReactor_Launcher.cs를 적당한 게임 오브젝트를 만들어 첨부하여 값을 설정.
Demo3_reflect 데모 장면의 LaserLauncher 게임 오브젝트를 조립식으로 가져와도 괜찮습니다.


Air-Tap에서 원하는 이벤트를 실행할 수 있는 범용 스크립트



아래 스크립트를 사용하여 Air-Tap에서 LaserLauncher.cs의 LaunchRay()가 실행되도록 설정합니다.


※Manager 객체라든지 부착하여 범용적으로 사용할 수 있다.

AirTapAction.cs
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.VR.WSA.Input;
using HoloToolkit.Unity;

[RequireComponent(typeof(GazeManager))]
public class AirTapAction : MonoBehaviour
{
    GestureRecognizer recognizer;

    public UnityEvent myEvent;

    void Start()
    {
        recognizer = new GestureRecognizer();
        recognizer.SetRecognizableGestures(GestureSettings.Tap);
        recognizer.TappedEvent += Recognizer_TappedEvent;
        recognizer.StartCapturingGestures();
    }

    void OnDestroy()
    {
        recognizer.StopCapturingGestures();
        recognizer.TappedEvent -= Recognizer_TappedEvent;
    }

    private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
    {
        OnTap();
    }

    void LateUpdate()
    {
#if UNITY_EDITOR
        if (Input.GetMouseButtonDown(0))
        {
            OnTap();
        }
#endif
    }
    private void OnTap()
    {
        if (myEvent != null)
            myEvent.Invoke();
    }
}

완성



좋은 웹페이지 즐겨찾기