Help us understand the problem. What is going on with this article?

HoloLensでお絵かきする

More than 1 year has passed since last update.

経緯

AR_Fukuokaで行われたHoloLensアプリハンズオンの内容を、
まるで自分が手順を作った様に記事した。

AR_Fukuokaで講師をされた吉永様本家資料がSlideShareに公開されました。
HoloLensハンズオン
本記事よりも丁寧に説明されてあるので、
もっと細かな部分を知りたい方はぜひ本家資料を参照してください。

吉永様に感謝ですm(_ _)m

今回やる事

HoloLensでお絵かきアプリを作る。
ドラッグ中にお絵かきできる。
カッコいい。

環境

  • Windows 10
  • Unity 5.6.1
  • Visual Studio 2017

そのほかHoloLendsToolKitなどは適宜インストール。

まずはメッシュが手に追従するものを作る

扱うメッシュを追加

Unityを起動して,好きな3D Objectを追加する。

Name : Cube

デフォルトだと大きすぎるので、
サイズをすべて0.05へ変更する。

分かりやすいようにマテリアルを追加して色を付ける。

HoloLends固有設定

カメラ等をデフォルトの物からHoloLens様に入れ替える。

  • 追加
    • SpatialMapping
    • InputManager
  • 変更
    • Camera to HoloLendsCamera

HoloLendsCamera.ClippingNearを0.2へ変更。
(手元のCGを表示する為)

スクリプトを追加

ヒエラルキーで右クリックしてcreate empty。
作成されたGameObjectを選択し、InspectorからAdd Component ->new script。

using HoloToolkit.Unity.InputModule;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class Receiver : MonoBehaviour , ISourceStateHandler, IInputHandler
{
    IInputSource currentInputSource;
    private uint id;
    private bool isDrag = false;
    public GameObject obj;

    public void OnInputDown(InputEventData eventData)
    {
        if( !eventData.InputSource.SupportsInputInfo(eventData.SourceId, SupportedInputInfo.Position))
        {
            return;
        }

        currentInputSource = eventData.InputSource;
        id = eventData.SourceId;

        isDrag = true;
        Debug.Log("finger down");
    }

    public void OnInputUp(InputEventData eventData)
    {
        isDrag = false;
        Debug.Log("finger up");
    }

    public void OnSourceDetected(SourceStateEventData eventData)
    {
        Debug.Log("Detected");
    }

    public void OnSourceLost(SourceStateEventData eventData)
    {
        isDrag = false;
        Debug.Log("Lost");
    }

    // Use this for initialization
    void Start () {
        InputManager.Instance.PushFallbackInputHandler(gameObject);
    }

    // Update is called once per frame
    void Update () {
        if (isDrag)
        {
            Vector3 pos;
            currentInputSource.TryGetPosition(id, out pos);

            Debug.Log(pos);
            obj.transform.position = pos;
        }
    }
}

Unityに戻り、GameObjectのInspectorへ下記設定を行う。

  • objにcubeをDrag&Drop

ビルド用のVisualStudioプロジェクトを作成する

Edit menu -> Project Settings -> Player
Inspector.Product Nameを好きな名前へ。

Inspector.Icon.Short Name
Inspector.Other Settings.Virtual Reality Supported

File -> Build Settings
Add Open Scene
Choice Windows Store
Click Switch Platform

check settings
+ SDK Universal 10
+ Target device Hololends
+ UWP Build Type D3D

Buildボタンをクリックする。
Appディレクトリを作成し、フォルダを選択して出力する。

Visual Studioで開き、HoloLendsで動作確認する。

ビルド設定を変更

  • Debug/Release : Release
  • CPU : x86
  • Target : device

HoloLendsを接続してペアリングを行う。

Tool Menu -> デバッグ -> デバッグなしで開始

線を書けるようにする

線のロジックを追加する

cubeのInspectorからAdd Component->Trail Renderer

Trail Rendererの設定

  • Material
    • Element 0 : cubeのmaterial
  • Time : Infinity
  • Min Vertex Distance : 0.05
  • Width : 0.02

このままでは一本しか線が引けないので、
cubeオブジェクトの複製を行う事で複数の線を引けるようにする。

HieralchyのcubeをAssetsへD&Dする。
hierarlchyのcubeを削除する。

Receiverを編集して複製を行う。

using HoloToolkit.Unity.InputModule;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class Receiver : MonoBehaviour , ISourceStateHandler, IInputHandler
{
    IInputSource currentInputSource;
    private uint id;
    private bool isDrag = false;
    GameObject obj;
    public GameObject original;
    private List<GameObject> cubes = new List<GameObject>();

    public void OnInputDown(InputEventData eventData)
    {
        if( !eventData.InputSource.SupportsInputInfo(eventData.SourceId, SupportedInputInfo.Position))
        {
            return;
        }

        GameObject tmp = GameObject.Instantiate(original);
        obj = tmp;
        cubes.Add(tmp);

        currentInputSource = eventData.InputSource;
        id = eventData.SourceId;

        isDrag = true;
        Debug.Log("finger down");
    }

    public void OnInputUp(InputEventData eventData)
    {
        isDrag = false;
        Debug.Log("finger up");
    }

    public void OnSourceDetected(SourceStateEventData eventData)
    {
        Debug.Log("Detected");
    }

    public void OnSourceLost(SourceStateEventData eventData)
    {
        isDrag = false;
        Debug.Log("Lost");
    }

    // Use this for initialization
    void Start () {
        InputManager.Instance.PushFallbackInputHandler(gameObject);
    }

    // Update is called once per frame
    void Update () {
        if (isDrag)
        {
            Vector3 pos;
            currentInputSource.TryGetPosition(id, out pos);

            Debug.Log(pos);
            obj.transform.position = pos;
        }
    }


    public void ResetLines()
    {
        for(int i = 0; i < cubes.Count; i++)
        {
            Destroy(cubes[i]);
            cubes[i] = null;
        }
        cubes.Clear();

    }
}

GameObjectのInspector.OriginalへAssetsのcubeをD&D。

削除できるようにする。

InputManager.Inspector->Add Component->Keyword Managerを追加。
KeywordManager.sizeを1へ。

  • element 0.Key Word : reset
  • element 0.Key Code : R
  • Response() * +を押して追加
    • GameObjectを設定
    • Receiver->ResetLines
miyatama
とりあえずなんにでも手を出す。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした