きゃべログ

プログラミングや電子工作などについての記事がほとんどです

Apple公式ドキュメントの「AR Human Interface Guidlines」を要約した

0 件のコメント

はじめに

Augmented Reality - Technologies - iOS Human Interface Guidelines
を一通り読み、日本語として要約しました。内容は厳密に1対1対応させていません。平易な表現で要点がわかりやすいように表現したつもりです。また、画像の転載は避けています。原文を読んで解釈が明らかにおかしいというのを見つけた方がいらっしゃればご指摘ください。異論は認めます。原文を読むのは結構骨が折れる作業だと私は感じたので、少しでも皆さんのお力になれれば幸いです。

概要

現実と仮想物体をシームレスに重ねて、没入感があり、魅力的な体験を実現するために、iOSアプリではAppleのARKitを使うことができる。
カメラはスクリーン上のビューに現実世界を表示するのに使用する。3次元の仮想物体はそのビューに重畳され、物体が本当に存在するように錯覚させる。もしその体験が正確であれば、ユーザはiOSデバイスの向きを変えて仮想物体を様々な角度から調べることや、ジェスチャや動きを使ったインタラクションが可能である。

魅力的な設計

人々を惹きつけるに画面全体を使うこと

現実世界を表示したり仮想物体を表示するために出来る限りスクリーンを大きく使うこと。また、没入体験を損なうのでスクリーン上をコントロールのパーツや情報で散らかさないこと。

物体を配置するときは説得力のある錯覚を生み出すようにすること

すべてのAR体験に現実に近い仮想物体が必要なわけではない。しかし配置される仮想物体はあたかも現実世界に存在するようにしなければならない。ベストプラクティスは本物そっくりのテクスチャが貼り付けられた詳細な3Dアセットを作成すること、またARKitが提供する現実世界の平面認識を使用して仮想物体の照明の当たり方に適用し、現実世界の画面に仮想物体の影をつけること、カメラの位置変化に仮想物体の位置を適応することである。

物理的な制約を考慮すること

ARがうまく動かない環境でも人々はアプリを使おうと試みることを心に留めておくこと。例えば、動き回ることが出来るほどのスペースがなかったり広い平らな部分がないような場所でも人々はアプリを開くかもしれない。難題を課せられるシナリオを想定して、明確に制約や例外を人々に率直に伝えるよう試みること。

ユーザが心地よくなるように心がけること

長期間に渡ってデバイスを特定の距離、あるいは角度に保つのは骨の折れる作業である。そのためユーザがアプリを使う際にどんなふうにデバイスを持つのかを考慮し、不快感を引き起こさない楽しい体験を目指すこと。例えば、仮想物体を近くに移動させてくる必要がないように、最初から仮想物体を配置することができる。

ユーザの動きを促進するなら、動きを徐々に紹介すること。

例えばゲームにおいてはARに入り込んですぐに仮想世界を見せないようにする。まずは体験に順応するための時間をユーザに与えること。そして、徐々に動きを促進していくこと。

ユーザの安全に配慮すること

近くに他の人や物体があったら、あちこち歩き回る行為は危険となり得る。アプリの操作が安全になるような方法をよく考えること。たとえば、ゲームにおいて大幅な動きや急な動きを避けるように仕向けることが挙げられる。

没入体験を促進するには聴覚と触覚フィードバックを使うこと

音声や衝突感は物理的表面や他の仮想物体に接触するようになったと確信を得るための重要な方法である。没入感のあるゲームでは、BGMはユーザが仮想世界に包み込まれるのを手助けする。

参考

可能な限りコンテキストヒントを提供すること

例えば、物体の3次元回転のインジゲータ(矢印など)を示すことはテキストベースの指示を配置するよりも更に直感的な方法である。しかし、ARKitが平面を検出する前やユーザがコンテキストヒントに反応していない場合はテキストヒントを表示する方が確実である。

説明テキストを表示しなければならない場合、親しみやすい専門用語を使うこと

ARは先進的な概念であるため、怖がる人がいるかもしれない。ARを親しみやすいものにするために、技術的な言葉やARKitWorld detection, trackingのような技術者向けの言葉を使用しないこと。代わりにほとんどの人たちが理解できる会話体の言葉を使うこと。

AR体験を不必要に妨げることを避けること

ユーザーがARを終了したり再開する度に、環境は解析されて平面が検出される。さらに端末とカメラの位置は変わるかもしれない。結果として、以前に配置された物体の配置場所が変わるおそれがある。物体はもはや実世界の平面上に配置されたままである保証もない。こういった体験の妨害を防ぐ方法の1つとして、ユーザに物体の位置や設定をAR体験を抜けずに変更出来るようにさせることが挙げられる。例えば、ユーザがリビングに置くための椅子の購入を検討しているとする。AR上で椅子を配置したとして、ユーザは他の生地の椅子を色々試すような機能が欲しいと思うかもしれない。

ARの世界に入りこむ

初期化が実行されていることを示し、ユーザを巻き込むこと

周囲の環境を評価する初期化処理はアプリがAR機能を開始するとき毎回実行される。この処理には数秒かかる。ユーザの混乱を減らして処理を早くするために、初期化の際にする行動を示すこと。例えば表面を見つけられるように周囲をあちこち映すように勧める。

仮想物体を配置する

ARKitが平面を見つけたタイミングや物体を置くタイミングをユーザがわかるように助けること

視覚的なインジゲータは平面検出がアクティブになっていることを伝えるのにとても有効な手段である。例えば、画面中央に台形と十字線を置くことで、ARKitが平面を探しているだろうということをユーザは推測できるだろう。ひと度平面が見つかれば、現在物体を置くことができるこを示すために見た目を変えるべきである。あなたが作るアプリに馴染むような視覚的なインジゲータをデザインすること。

ユーザが物体を配置したときには適切に反応すること

平面検出の精度は、かなり短い時間でしだいに良くなっていく。ユーザが物体を配置するために画面をタップすると、現在使える平面情報を用いて物体を即座に配置する。そして平面検出が完了すると、微妙に物体の位置を調整する。もし物体が検出された平面領域からはみ出て配置されていたら、ARKitは物体を平面上にそっと動かす。

検出された平面の端に整然と物体を並べようとしないこと

ARでは平面の境界線は近似的なもので、周囲環境の解析が更に進むと変わるかもしれないためである。

仮想物体に対するユーザインタラクション

スクリーン上に別のUIを設けるよりは直接操作することが好ましい

物体に働きかける際、画面上に別にボタンなどのコントローラを設けるよりは、ユーザがスクリーン上の物体にタッチして働きかけることができる方がより没入感があり、直観的である。

標準的で親しみやすいジェスチャーを使って物体に働きかけられるようにすること

例えば物体を動かす際に1本指のドラッグをサポートしたり、2本指の回転ジェスチャで物体を回転させるようにするなどが挙げられる。関連情報はジェスチャーの項目を参照。

一般に物体への作用はシンプルであること

AR体験は現実世界の3次元に関わっているが、タッチジェスチャはそもそも2次元である。
仮想物体に対するユーザの作用を簡易化するために次のようなアプローチを検討すること。

  • 移動する方向を物体が置かれている2次元平面上に制限する
  • 回転方向を一軸に制限する

物体近くへ作用する妥当なジェスチャにも反応すること

小さかったり、薄かったり、遠くにある物体上のある1点を正確にタッチするのは難しいかもしれない。あなたのアプリが作用できる物体に近い位置のジェスチャを検知したら、ユーザはその物体に働きかけたいのだと推定するのがふつうは最善である。

ユーザが配置したオブジェクトのスケーリング機能が必要かどうかよく考えること

おもちゃやゲームキャラクターのように物体が固有のサイズがなく、ユーザがそれを大きくしたり小さくしたりしたいと思う場合サイズのスケーリングは一般に適切である。しかし現実世界において固有のサイズを持つ家具のような物体を正確なサイズで配置しようとする場合には不適切である。スケーリングは物体の距離を調整する方法としては使えない。例えば物体が近くに見えるように物体を大きくしても、単に遠くにより大きい物体あるように見えるだけである。

ジェスチャの衝突には気をつけること

例えば2本指のピンチジェスチャは2本指の回転ジェスチャととても似ている。もしこのような2つのジェスチャを実装するならば、アプリはそれらを正確に解釈できるのかをテストして確かめること。

仮想物体の移動は滑らかであるか確認すること

ユーザが物体をリサイズしたり回転させたり新しい位置へ移動するとき、物体がジャンプしているように見えてはいけない。

より魅力的な物体への作用方法を探求すること

ジェスチャだけがARにおいて仮想物体に働きかける唯一の方法ではない。アプリでは端末の動きや物体への接近などの他の要素を使うことができる。例えばゲームキャラクタにユーザが近づくと、ゲームキャラクタがユーザの方向を向くようにするなどである。

問題を解決する

AR体験がユーザの期待に沿っていない場合、ユーザ自身でリセットできるようにすること。

状態が改善するまで待たせたり、物体の配置に苦労させてはいけない。ユーザにもう一度やり直してより良い結果が得られるか確認できる方法を提供すること。

問題が起こったら改善方法を提示すること

暗かったり、平面が光を反射しなかったり、平面のディテールが十分でなかったり、カメラの動きが過剰すぎるなど様々な理由によってユーザの環境分析や平面検出は失敗することがある。アプリが平面のディテールが不十分だったりカメラの動きが過剰であると知っていたら、あるいは平面検出に時間がかかりすぎていれば、問題解決の方法を提案すること。

問題と改善案の例

  • 検出されるディテールが不十分→光をもっと照らし、端末を動かして周囲を映してください
  • 過剰な動きを検出→端末をもっとゆっくり動かしてください
  • 平面検出に時間がかかりすぎている→端末を動かして周囲を映してください。また、端末が十分ざらざらした平面を映しているかを確認してください。

ARの機能は使える端末だけに提供すること

もしあなたのアプリの主な目的がARであれば、ARKitをサポートしているデバイスのみでしかアプリを利用できないようにすること。また、もしあなたのアプリが製品の写真を含む家具のカタログのようなARを二次的な機能として使用し、いくつかの製品をARで見られるようにしている場合、ARをサポートしていないデバイスでその機能を使用しようと試みたときにエラーを表示しないようにすること。もしデバイスがARKitをサポートしていない場合、最初からオプションのAR機能を提示しないこと。開発者の手引として、ARKitキーについてはInformation Property List KeyUIRequiredDeviceCapabilitiesを参照のこと。また、ARConfigurationisSupported - ARConfiguration | Apple Developer Documentationも参照のこと。

ARのピクトグラム

アプリはAR体験を開始するボタンなどのコントロールにARピクトグラムを表示することができる。ARピクトグラムは
Resourceからダウンロードできる。

ARピクトグラムは本来意図されたとおりに使うこと

ARピクトグラムはARKitを用いたAR体験を開始する場合のみに限って使われるべきである。サイズや色を変更するなど以外の変更をピクトグラムを適用したり、他の用途に使用したり、ARKitで作られていないAR体験の開始に使用してはならない。

最小限の余白を保つこと

ピクトグラムの周りに最小限の余白として、ピクトグラムの高さの10%を確保しなければならない。他の要素でそのスペースを侵害したり、ピクトグラムを隠してはならない。

ARバッジ

製品やその他のアイテムのコレクションを含むアプリにおいて、ARKitを使ったARで見ることができる特定のアイテムを識別するために、ARバッジを使うことができる。例えば、デパートのアプリでは家具を購入前に自分の家でその見た目をプレビューできるようになるかもしれない。

ARバッジは本来意図された通りに使うこと

ARバッジはResourceからダウンロードできる。これらの画像はARKitを使ってARで製品やその他の物を見ることができることを識別するためにのみ使われるべきである。バッジを変更したり、色を変えたり、他の用途で使用したり、ARKitを使っていないAR体験と関連づけて使用したりしてはならない。
ARピクトグラムよりARバッジを使用することが望ましい。一般的に、ピクトグラムだけのバッジは画面のスペースが限られているときや、ARバッジを配置しきれない場合に使われるべきである。いずれのバッジもデフォルトサイズでうまく動作する。

ARバッジはARで見ることができるものとそうでないものが混ざっている場合にのみ使うこと

もしアプリの中のオブジェクトすべてがARで閲覧できるとすれば、そのときバッジは冗長で不要なものである。

バッジの位置は不変で明確に保つこと

バッジは物体の写真のある隅に表示されるのが最も良い。常に同じ角に配置し、バッジがはっきりみえるのに十分大きいことを確認すること。ただし大きすぎて大事な写真の詳細を覆ってしまうようではいけない。

最小限の余白を保つこと

ピクトグラムの周りに最小限の余白として、ピクトグラムの高さの10%を確保しなければならない。他の要素でそのスペースを侵害したり、ピクトグラムを隠してはならない。

0 件のコメント :

コメントを投稿

libpython2.7.so.1.0: cannot open shared object file

0 件のコメント

最近SonyからNeural Network LibrariesというDeep Learningのライブラリが公開されたので試してみようと環境構築していました。

環境構築当時Python2.7にしか対応していなかったのでpyenvで環境構築しました。
Installation on Linux — Neural Network Libraries 0.9.4 documentation

ぐぐってみたら、どうもシンボリックリンクを貼れば解決するようだ。
Python エラー対処:error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory - 長生村本郷Engineers'Blog

そもそもはいってないからリンクはれない、きれそう

[vagrant@localhost nnabla]$ ldd /home/vagrant/.pyenv/versions/2.7/bin/python
linux-vdso.so.1 => (0x00007ffdbe3a5000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f22cb0c2000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f22caebe000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f22cacba000)
libm.so.6 => /lib64/libm.so.6 (0x00007f22caa36000)
libc.so.6 => /lib64/libc.so.6 (0x00007f22ca6a2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f22cb2e7000)</module></module></string>

問題発生

pyenvでpython2.7系でnnablaをインストールしたときに、libpython2.7.so.1.0: cannot open shared object fileとなる問題が発生しました。

[vagrant@localhost nnabla]$ python -c "import nnabla"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/vagrant/.pyenv/versions/2.7/lib/python2.7/site-packages/nnabla/__init__.py", line 16, in <module>
import _init # Must be imported first
ImportError: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

解決方法

$ CONFIGURE_OPTS="--enable-shared" pyenv install 2.7.6

インストール時にオプションを設定する必要があるらしい。下記がソース

え?君せっかく Python のバージョン管理に pyenv 使ってるのに Vim の補完はシステムライブラリ参照してるの? - Λlisue's blog

まとめ

ひょっとしたらライブラリ側で解決されているかもしれませんが、同様の問題の解決の一助になれば幸いです。

0 件のコメント :

コメントを投稿

Amazon Kindleストアで一部の技術書が50%オフ中「夏のプログラミング特集」

0 件のコメント

久しぶりの投稿になりますが、どうしてもシェアしたいセールがあります。 その名もAmazon Kindleストア、夏のプログラミング特集。 2017年8月31日までなので買い忘れにご注意を。

Amazon.co.jp: 【50%OFF以上】夏のプログラミング特集 (8/31まで): Kindleストア

iOS開発入門書でSwift2時代の少し古い書籍があったりするので、 買うものは選ばないといけないですが、中にもベストセラー級の書籍があるので興奮しています。 いい本は高価なものが多いので今回のセールはかなりうれしいです。

このエントリではせっかくなので私が注目する書籍をピックアップしたいと思います。

Pythonの入門書です。機械学習やRaspberry Piのプロトタイピングなど最近活用の幅が広い言語なので、プログラミング初心者の方にはおすすめしたい1冊です。 ただし他の言語を習得済の方は公式チュートリアルを読んだほうが有意義かと思います。

ゲームアプリの数学 Unityで学ぶ基礎からシェーダーまで
SBクリエイティブ (2015-09-24)
売り上げランキング: 1,930

Unityについての本というよりは、しっかり数学の知識が書かれている印章です。 ぱらぱらめくって見ましたがUnity初学者には向かない本です。 さらに一歩すすんだスキルを身に着けたい方には良い本だと思いました。

実装の容易さからプログラミングはどんどん容易になってきているので、 こういったコンテンツのクオリティを高める書籍は是非今のうちに読んでおきたいと考えています。

これが今回1番の目玉商品ではないでしょうか。 Webアプリのセキュリティ本ではまずこれが出てくるという書籍です。 言語はPHPですが取り上げるセキュリティの問題は他の言語を使う人も知っておきたい内容じゃないかと思います。

以上4冊が今回のセール品全63冊からのピックアップ本です。 ひょっとしたらもっと良い本があるかもしれません。 もしイチオシの本があったら是非教えてください。 今年の夏はあんまりお金を使わないつもりだったけど、一気にお金が飛んでいきそうだ…。

0 件のコメント :

コメントを投稿

ToAtm:Python用Twitterのアクセストークンマネージャを作りました

0 件のコメント

credit: Pete Simon

アクセストークンの管理が面倒くさい

今更ながらPythonからTwitter APIを使ってみようと試みました。
複数のアカウントからAPIを叩こうとすると、どのアカウントがどのアクセストークンに対応づくかという管理が面倒でした。そこで今回はアクセストークンを管理するコードを書いてみました。

最初のうちはコンシューマーキーをコード内に直打ちして認証!みたいな力技をやってしまいがちなのですが、それはちょっとリスキーですね。GitHubなんかでソースを公開する場合であったり、あとはセキュリティの観点から1番理想的なのはデータベースに保存して管理することでしょう。

データベースがポピュラーな方法だと思いますが、今回は飽くまでプロトタイプレベルで簡単にコーディングするためにセットアップ不要の外部ファイルによる永続化という方法を取ってみました。本番環境に使えるかはあまり自信がないのでサポートツールだと思ってもらえれば幸いです。

まずいところがあるなーと思った方がいらっしゃればコメントお願いします!

機能

  • 複数アカウントのアクセストークンが簡単に管理できます。
  • アプリのAPIキーも同時に管理でき、簡単に呼び出せます。

注意点

出力されたデータベースファイル(keys.shelve)は外部に漏れないように取り扱ってください。セキュリティの観点からGitHubにPushするときにはkeys.shelveを.gitignoreに指定するなど対処が必要です。

入手

GitHubからクローンした上でご利用頂けます!
toatm.pyを開発したいpythonコードと同じところに入れましょう。そのディレクトリにアクセストークンが格納されるデータベースファイルが生成されます。
cabbage63/toatm: Twitter OAuth Access Token Manager for Python

使い方

Tweepyのインストール

このツールではその後にTweepyを使うことも想定してPythonのTwitter APIにアクセスするためのライブラリであるTweepyを使用しています。まずはTweepyを導入しましょう。

pip install tweepy

Gitからインストールしたい場合はこのような形でマニュアルインストールします。

git clone https://github.com/tweepy/tweepy.git
cd tweepy
python setup.py install

ToAtmを実行

本アプリ、ToAtmを実行します。

$ python toatm.py

使用するアプリのAPIキーを登録します

プロンプトが出るので指示に従って入力していってください。
これでアプリのAPIキーは登録完了です。

Please select mode.
        1 Update API keys
        2 Update Access tokens
        3 Show access tokens
        q Exit
>> 1
CONSUMER KEY: ************
CONSUMER SECRET: *************

アクセストークンを登録する

指示にしたがってブラウザから指定されたURLにアクセスし、そこで得られたVerifierをアプリで入力することでアクセストークンが登録されます。

Please select mode.
        1 Update API keys
        2 Update Access tokens
        3 Show access tokens
        q Exit

>> 2
Access: https://api.twitter.com/oauth/authorize?oauth_token=***************
Verifier: *******
Updated access token for @****** successfully.

Pythonアプリからアクセストークンを呼び出す

@hogeというユーザアカウントを想定して使用例を掲載します。

import shelve
# Open database file
d = shelve.open('keys.shelve')
print d["hoge"]

こちらのコードを実行するとd["hoge"]の内容として次のものが表示されます。

{'access_token': u'****', 'access_token_secret': u'****'}

アプリのコンシューマーキーも呼び出せます。

print d["consumer_key"]
print d["consumer_secret"]

str型で呼び出したい場合は次のように変換しましょう。

str(d["hoge"])

使用例: タイムラインの読み出し

あらかじめ@hogeというユーザのアクセストークンを登録していると想定します。

# -*- coding: utf-8 -*-

import shelve
import tweepy

# アクセストークンを登録したTwitter IDを入力(@hoge)
SCREEN_NAME = "hoge"

# データベースファイルを読み込み
d = shelve.open('keys.shelve')
consumer_key = d['consumer_key']
consumer_secret = d['consumer_secret']
access_token = d[SCREEN_NAME]['access_token']
access_token_secret = d[SCREEN_NAME]['access_token_secret']

# Tweepyをセットアップ
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

# メイン処理:タイムラインの読み出し
public_tweets = api.home_timeline()
for tweet in public_tweets:
    print tweet.text

まとめ

Python用のTwitter APIを利用した開発者向けのアクセストークンマネージャを作成・公開しました。
普段アクセストークンの管理に悩んでいる方はお試しください。

0 件のコメント :

コメントを投稿