LoginSignup
3
3

More than 5 years have passed since last update.

HoloLensで近づくと隠れるHeadsUpDirectionIndicator

Last updated at Posted at 2017-04-06

はじめに

3月初めよりインターンで株式会社ゆめみ(https://www.yumemi.co.jp/ja) にてHoloLensの研究開発をしている近大生のよっしーです。
国内でこの1月から提供を開始したMicroSoft製MRデバイスのHoloLensについての記事を書いていきます。

すること

HeadsUpDirectionIndicatorをアレンジする

名前 種類 説明
DirectionIndicator スクリプト 三次元的に表示(ルームオブジェクトの影響を受ける)。オブジェクトが視界から外れると消える。
HeadsUpDirectionIndicator プレハブ 視野角上の平面で表示。オブジェクトが視界から外れても消えない。

上のように動作するのですが、DirectionIndicatorはカーソルの動きについて回るので、平面が変わるたびにおっきくなったりちっさくなったりしてうざったいです。
逆にHeadsUpDirectionIndicatorは近づいても消えてくれないので、いつまでもついてきてうざったいです。

なのでHeadsUpDirectionIndicator側に、オブジェクトが視界から外れると消える機能をつけようという試みです。

実装例

HeadsUpDirectionIndicator

// Update the direction indicator's position and orientation every frame.
private void Update() {
    // No object to track?
    if (TargetObject == null || pointer == null) {
        // bail out early.
        return;
    } else {
        // 書き換え部分以下
        bool isDirectionIndicatorVisible = !IsTargetVisible();
        pointer.SetActive(isDirectionIndicatorVisible);

        if (isDirectionIndicatorVisible) {
            int currentFrameCount = UnityEngine.Time.frameCount;
            if (currentFrameCount != frustumLastUpdated) {
                // Collect the updated camera information for the current frame
                CacheCameraTransform(Camera.main);

                frustumLastUpdated = currentFrameCount;
            }

            UpdatePointerTransform(Camera.main, indicatorVolume, TargetObject.transform.position);
        }
    }
}

//書き加えた関数
private bool IsTargetVisible() {
    // This will return true if the target's mesh is within the Main Camera's view frustums.
    Vector3 targetViewportPosition = Camera.main.WorldToViewportPoint(TargetObject.transform.position);
    return (targetViewportPosition.x > VisibilitySafeFactor && targetViewportPosition.x < 1 - VisibilitySafeFactor &&
            targetViewportPosition.y > VisibilitySafeFactor && targetViewportPosition.y < 1 - VisibilitySafeFactor);
}

解説

  • IsTargetVisible:視界内にターゲットがあるかどうかを返している。
  • Update関数内書き換え部分:視界外なら、ポインタをアクティブに。視界内ならポイントを非アクティブにしている。

これで近づくとポインタが消えるHeadsUpDirectionIndicatorが動きます。

もし不明な点があるなら差分を実際に確認していただけるとよく分かると思います。

ついでに

自分の場合は以下のようなシングルトンクラスを実装し、ターゲットのオブジェクトを切り替えています。

DirectionIndicatorManager
using UnityEngine;
using HoloToolkit.Unity;

public class DirectionIndicatorManager : Singleton<DirectionIndicatorManager> {

    public void SetGameObjectToHeadsUpDirectionIndicatorTarget(GameObject gameObject) {
        GameObject indicatorObject = GameObject.Find("HeadsUpDirectionIndicator");
        HeadsUpDirectionIndicator indicator = indicatorObject.GetComponent<HeadsUpDirectionIndicator>();
        indicator.TargetObject = gameObject;
    }
}

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3