Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What is going on with this article?
@miyatama

HoloLensでお絵かきする

More than 3 years have 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
11
Help us understand the problem. What is going on with this article?
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
miyatama
とりあえずなんにでも手を出す。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
11
Help us understand the problem. What is going on with this article?