以下、図面を参照して、本発明の実施形態を説明する。各図において同一の符号は、特に言及が無い限り同一又は相当部分を示すものとし、説明の便宜上、図面の縦横の縮尺を実際のものとは異なるように表す場合がある。また、説明の便宜上、必要以上に詳細な説明は省略する場合がある。例えば、既によく知られた事項の詳細説明や実質的に同一の構成についての重複説明を省略する場合がある。
本発明の一実施形態による電子装置10は、仮想空間に配置された仮想的なオブジェクトをユーザに提示し、ゲームを進行するゲームアプリケーションがインストールされている。本実施形態の電子装置10は、当該ゲームアプリケーションが実行されると、ユーザの操作に応じて、仮想空間内のユーザの操作対象の仮想的なオブジェクトである操作対象オブジェクトを制御するための仮想的なコントローラ(仮想コントローラ)を提供する。仮想空間は、当該ゲームアプリケーションにより定められるものであり、2次元空間であることもできるし、3次元空間であることもできる。例えば、仮想的なオブジェクトは、仮想空間に配置されたキャラクタ又はアイテムである。例えば、操作対象オブジェクトの制御とは、仮想空間に配置されたキャラクタ又はアイテムの動作の制御である。
説明の便宜上、本実施形態においては、電子装置10には上記のようなゲームアプリケーションがインストールされているものとするが、これに限定されない。電子装置10は、ユーザの操作に応じて、操作対象オブジェクトを制御することが可能なアプリケーションを実装していればよい。例えば、電子装置10には、ゲームアプリケーションの代わりに又はこれに追加して、ユーザの操作に応じて操作対象オブジェクトを動作させる入力支援アプリケーション又はシミュレーションアプリケーションが実装されてもよい。本実施形態の電子装置10が提供する仮想コントローラは、ユーザの入力として方向と大きさが必要な入力に用いることができる。以下の説明において、アプリケーションは、アプリケーションプログラム全般を意味するものであり、スマートフォンやタブレット端末にインストールされるアプリを意味することができる。
図1は本発明の一実施形態による電子装置10のハードウェア構成を示すブロック図である。電子装置10は、プロセッサ11、入力装置12、表示装置13、記憶装置14、及び通信装置15を備える。これらの各構成装置はバス16によって接続される。なお、バス16と各構成装置との間には必要に応じてインタフェースが介在しているものとする。本実施形態において、電子装置10はスマートフォンである。ただし、電子装置10は、上記の構成を備えるものであれば、タブレット型コンピュータ、タッチパッド等の接触型入力装置を備えるコンピュータなどの端末とすることができる。
プロセッサ11は、電子装置10全体の動作を制御する。例えばプロセッサ11は、CPUである。なお、プロセッサ11としては、MPU等の電子回路が用いられてもよい。プロセッサ11は、記憶装置14に格納されているプログラムやデータを読み込んで実行することにより、様々な処理を実行する。1つの例では、プロセッサ11は、複数のプロセッサから構成される。
入力装置12は、電子装置10に対するユーザからの入力を受け付けるユーザインタフェースであり、例えば、タッチパネル、タッチパッド、キーボード、又はマウスである。表示装置(ディスプレイ)13は、プロセッサ11の制御に従って、アプリケーション画面などを電子装置10のユーザに表示する。本実施形態においては、スマートフォンである電子装置10は入力装置12としてタッチパネル17を備え、タッチパネル17は表示装置13としても機能し、入力装置12と表示装置13は一体となった構造である。本実施形態のタッチパネル17は、投影型静電容量方式タッチパネルであるが、同等の機能を有するデバイスがあれば、それを用いてもよい。
記憶装置14は、揮発性メモリであるRAM及び不揮発性メモリであるROMを含む、一般的なスマートフォンが備える記憶装置である。記憶装置14は、外部メモリを含むこともできる。記憶装置14は、ゲームアプリケーションを含む各種プログラムを記憶する。例えば、記憶装置14は、オペレーティングシステム(OS)、ミドルウェア、アプリケーションプログラム、これらのプログラムの実行に伴って参照され得る各種データなどを格納する。
1つの例では、記憶装置14は、主記憶装置及び補助記憶装置を含む。主記憶装置は、情報の高速な読み書きが可能な揮発性の記憶媒体であり、プロセッサ11が情報を処理する際の記憶領域及び作業領域として用いられる。補助記憶装置は、様々なプログラムや、各プログラムの実行に際してプロセッサ11が使用するデータを格納する。補助記憶装置は、例えばハードディスク装置であるが、情報を格納できるものであればいかなる不揮発性ストレージ又は不揮発性メモリであってもよく、着脱可能なものであっても構わない。
通信装置15は、ネットワークを介してサーバなどの他のコンピュータとの間でデータの授受を行う。例えば通信装置15は、移動体通信や無線LAN等の無線通信を行い、ネットワークへ接続する。1つの例では、電子装置10は、通信装置15によってプログラムをサーバからダウンロードして、記憶装置14に格納する。ただし、通信装置15は既知の有線通信を行ってもよい。他のコンピュータとの間でデータの送受信を行わない場合、電子装置10は通信装置15を備えなくてもよい。
図2は本発明の一実施形態による電子装置10の機能ブロック図である。電子装置10は、入力部21、表示部22、及び制御部23を備える。制御部23は、角度決定部24、状態決定部25、及びアプリケーション部26を備える。本実施形態においては、プログラムがプロセッサ11により実行されることによりこれらの機能が実現される。例えば実行されるプログラムは、記憶装置14に記憶されている又は通信装置15を介して受信したプログラムである。このように、各種機能がプログラム読み込みにより実現されるため、1つのパート(機能)の一部又は全部を他のパートが有していてもよい。ただし、各機能の一部又は全部を実現するための電子回路等を構成することによりハードウェアによってもこれらの機能は実現してもよい。
入力部21は、入力装置12を用いて構成されるものであり、電子装置10に対するユーザからの入力を受け付ける。本実施形態では、入力部21は、タッチパネル17へのユーザのタッチ操作を受け付けてタッチイベントを発生するものであり、タッチパネル17を備えるスマートフォンが一般的に有しているタッチ検出機能を用いることができる。
表示部22は、ゲームアプリケーション画面を表示装置13に表示し、ユーザ操作に応じた画面を表示する。
制御部23は、仮想コントローラを実現するものである。本実施形態では、制御部23は3層構造のアーキテクチャを採用し、角度決定部24、状態決定部25、及びアプリケーション部26が各層に対応する。例えば制御部23は、各層に対応する各プログラムにより構成される一組のプログラムがプロセッサ11により実行されることにより実現される。
制御部23が実現する仮想コントローラにおける角度決定部24の役割は、物理的なコントローラにおけるコントローラ内部のセンサICチップに対応する。角度決定部24は、主として、タッチパネル17へのユーザのタッチ操作により発生したタッチイベントを用いてユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定し、状態決定部25へ送出する。
状態決定部25の役割は、物理的なコントローラにおける操作するコントローラ全体に対応する。状態決定部25は、主として、角度決定部24から送出された角度を用いて、タッチパネル17上のユーザのタッチ操作に対応するベクトル(角度及び大きさ)を決定し、アプリケーション部26へ送出する。
アプリケーション部26は、ゲーム内の動作等を実装する、具体的なゲームアプリケーションに対応する。ゲームアプリケーションは、一般的なゲームアプリケーションと同様にして、フレームレートが定められ、例えばフレームレートに対応する時間ごとに、メインプログラムのメインループを処理する。フレームレートは、一般的に30fps(フレーム毎秒)又は60fpsである。
角度決定部24は、ユーザが仮想空間内の操作対象オブジェクトを制御するために必要な角度を決定する。1つの好適な例では、角度決定部24は、リアルタイムに角度を計算する数学関数ライブラリであり、かつ短時間のタッチイベントの列からの角度計算を行う、統計処理アルゴリズムを実装する、ソフトウェアモジュールである。タッチイベントの列は、タッチパネル17上の指の動きに対応するものである。
記憶装置14は、データポイントバッファを含む。データポイントバッファは、角度決定部24がタッチイベントに基づいて取得される第1の軸の値及び第2の軸の値により示されるデータポイントを保持するためのバッファである。
角度決定部24は、タッチパネル17へのユーザの操作により発生したタッチイベントに基づいて取得される第1の軸の値及び第2の軸の値により示されるデータポイントをデータポイントバッファに保持する。ここで、タッチイベントは、ユーザがタッチパネル17へ指を接触したとき(touchstart)、ユーザがタッチパネル17に指を接触させたまま動かしたとき(touchmove)、ユーザがタッチパネル17から指を離したとき(touchend)などに発生する。角度決定部24は、タッチイベントが発生するときに、タッチイベントを取得する。角度決定部24は、タッチイベントを取得するとき、タッチパネル17上の静電容量が変化した位置に対応する、2つの変数からなる数値の組(x、y)を取得するとともに、(x、y)を取得した時間tを取得し、3つの変数からなる数値の組(x、y、t)をデータポイントバッファに格納する。当該2つの変数からなる数値の組のデータは、タッチイベントに付随して角度決定部24が取得するものであり、第1の軸の値及び第2の軸の値により示されるデータポイントに対応するものである。tは(x、y)を取得した時間であるデータポイント取得時間を表す値であり、上記のように(x、y)と対応付けられてデータポイントバッファに格納される。1つの例では、tは、OSから取得可能な、いわゆるUNIX(登録商標)時間と呼ばれる整数値であるか、又は”2017/07/14 15:48:43.444”のような文字列である。以下、特に言及が無い限り、角度決定部24がデータポイントを保持する(又は保持を終了する)ことは、該データポイントに対応付けられたデータポイント取得時間tを保持する(又は保持を終了する)ことを含む。
本実施形態では、説明の便宜上、第1の軸及び第2の軸を以下のとおり定める。図3は、本実施形態の第1の軸及び第2の軸からなる座標軸を示す図である。第1の軸は、タッチパネル17のセンサが配列される方向に実質的に平行な方向のうちの短手方向を示す軸であり、タッチパネル17の短辺と実質的に平行な横軸(x軸)である。第2の軸は、第1の軸に直交し、タッチパネル17のセンサが配列される方向に実質的に平行な方向のうちの長手方向を示す軸であり、タッチパネル17の長辺と実質的に平行な縦軸(y軸)である。このように、第1の軸及び第2の軸は、タッチパネル17のセンサが配列される方向に実質的に平行であり、タッチパネル17上の位置は、2つの軸により座標(x、y)として表される。したがって、本実施形態では、データポイントの座標(x、y)は、タッチパネル17上の位置に対応する。本実施形態では、角度決定部24は、当該座標(x、y)を、データポイントとしてデータポイントバッファに保持する。図3に示す座標設定は、一例であり、タッチパネル17のセンサ配列や電子装置10が実装するプログラムにより、上記例示と異なるように設定することができる。なお、センサは、例えば電極である。
図4は、図3に示すように座標軸が定められた場合の、角度決定部24が決定する角度と角度に対応する方向の一例を説明する図である。第一象限の角度31は方向32に対応し、第二象限の角度33は方向34に対応し、第四象限の角度35は方向36に対応する。ここで、方向34と方向36の傾きは同じであるが、方向の向きが逆であるため、角度33と角度35は180度異なることが確認できる。
角度決定部24は、データポイントバッファに保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了する。例えば、角度決定部24は、データポイントのデータの保持を終了する場合、該データを削除してもよいし、該データを無効化してもよいし、又は該データに保持を終了したことを示すフラグを関連付けて適宜削除するようにしてもよい。角度決定部24は、データポイントバッファに格納するデータポイントの寿命をミリ秒で指定する変数Dを定める。変数Dにより指定される時間が既定の保持時間に対応する。ただし、変数Dの値はミリ秒に限定されない。
例えば、角度決定部24は、1つのデータポイントをデータポイントバッファに格納すると、該データポイントの格納されてからの経過時間を監視し、継続的に変数Dと比較する。角度決定部24は、監視したデータポイントの経過時間が変数Dを超えたとき、該データポイントをデータポイントバッファの保持を終了する。このようにして、角度決定部24は、データポイントバッファが保持するすべてのデータポイントの各々の寿命を管理する。このとき、角度決定部24は、データポイント取得時間tを用いて、経過時間を算出することができる。なお、変数Dを超えたと判断したときは、変数D以上と判断したときを意味することができるものとする。また、角度決定部24が管理するデータポイントの経過時間の単位は、変数Dと同じであることが好ましい。
例えば、変数Dに165が設定されたとき、角度決定部24は、データポイントバッファに格納したデータポイントを165ミリ秒だけ保持し、165ミリ秒が経過すると、該データポイントをデータポイントバッファの保持を終了する。
角度決定部24は、定期的に角度を算出できるか否かを判定する。角度決定部24は、角度を算出可能な場合、データポイントバッファが保持するデータポイントを用いて、該データポイントの集合が示す角度を算出し、ユーザが仮想空間内の操作対象オブジェクトを制御するための角度として決定する。このように、角度決定部24は、データポイントの集合が示す角度を求めることにより、タッチパネル17に対してタッチ操作を行ったユーザが意図する方向の角度を求めることが可能となる。
角度決定部24は、決定した角度を状態決定部25へ出力する。角度決定部24は、決定した角度を状態決定部25へ出力するとき、例えばangleイベントを示す情報とともに出力する。角度決定部24は、状態決定部25へ直接出力せずに、状態決定部25が参照する記憶装置14内のメモリ領域に決定した角度やangleイベントを示す情報を格納してもよい。
角度決定部24は、取得したタッチイベントがtouchstartのとき、startイベントを状態決定部25へ出力し、角度を算出しない。角度決定部24は、取得したタッチイベントがtouchendのとき、stopイベントを状態決定部25へ出力し、角度を算出しない。
角度決定部24は、変数Bを定め、データポイントバッファが保持するデータポイントの個数が変数Bの数以上であった場合、該データポイントを用いて角度を算出し、決定する。角度決定部24は、データポイントバッファが保持するデータポイントの個数が変数Bの数未満であった場合、データポイントの集合が示す角度を一定の精度以上で算出することが不可能であるため、keepイベントを状態決定部25へ出力し、角度を算出しない。一般的には、回帰直線の傾きを求めるにあたっては3個以上のデータポイントが有ること好ましいため、変数Bは3以上に設定されるのが好ましい。本実施形態では、変数Bは3に設定される。
角度決定部24は、角度決定部24が角度を算出できるか否かを判定する時間の間隔をミリ秒で指定する変数Iを定める。タッチイベントが発生し続ける場合など、角度決定部24が角度を算出可能な場合が継続する場合、当該間隔は、角度決定部24が角度を算出する時間の間隔となる。ただし、変数Iの値はミリ秒に限定されない。
角度決定部24は、上記のように既定の処理時間ごとに角度算出可否について判定し、既定の処理時間ごとに角度を決定する。1つの好適な例では、既定の処理時間は、ゲームを実行するためのフレームレートに対応する時間である。フレームレートが30fps(30Hz)の場合、変数Iは33に設定される。変数Iに33が設定されたとき、角度決定部24は、33ミリ秒に1回角度を算出できるか判定し、角度を算出可能な場合は算出した角度を決定し、決定した角度をangleイベントとともに状態決定部25へ出力する。算出不可能な場合、角度決定部24は、startイベント、stopイベント、又はkeepイベントのいずれか1つを状態決定部25へ出力する。なお、angleイベントは角度を示す情報を含むことができ、この場合、角度決定部24は、角度を算出可能な場合、angleイベントを状態決定部25へ出力する。
データポイントバッファが保持するデータポイントの集合が示す角度を算出するにあたって、角度決定部24は、データポイントバッファに保持されているデータポイントに基づいて回帰直線の傾きを決定する。ここで、角度決定部24が参照するデータポイントの個数は、3以上である。角度決定部24は、回帰直線の傾きを決定するにあたって、データポイントバッファに保持されているデータポイントにおけるx軸の値の変位量及びy軸の値の変位量に基づいて、独立変数の軸としてx軸及びy軸のいずれか一方の軸を決定する。同時に、角度決定部24は、他方の軸を従属変数の軸として決定する。
本実施形態では、角度決定部24は、最小二乗法を用いて回帰直線の傾きを算出する。最小二乗法を用いて回帰直線の傾きを求める方法は既知であるが、当該方法は独立変数と従属変数の関係の強さを傾きとして求めるものである。最小二乗法は、x軸を独立変数の軸とし、y軸を従属変数の軸として適用するのが一般的であるが、x軸の値が固定されてy軸の値のみが変化する場合、従属変数が独立変数に一切の従属性を持たないことになる。また、y軸に沿った傾きを決定する場合、決定される傾きは、例えばy軸をまたいで大きなマイナスの値から大きなプラスの値となることがあり、安定して傾きを出すことが難しい。そのため、角度決定部24は、x軸の値とy軸の値のどちらが独立変数として適切であるかを判定し、決定された独立変数の軸及び従属変数の軸に基づいて最小二乗法を用いて回帰直線の傾きを決定する。
角度決定部24は、独立変数の軸をx軸とするとき、y=ax+bの回帰直線の傾きaを決定し、独立変数の軸をy軸とするとき、x=cy+dの回帰直線の傾きcを決定する。具体的には、角度決定部24は、以下の(a)〜(e)により回帰直線の傾きを求める。
(a)角度決定部24は、データポイントバッファに保持されているデータポイントにおける、独立変数の平均及び従属変数の平均を算出(決定)する。
(b)角度決定部24は、(a)で決定された平均を用いて、データポイントバッファに保持されているデータポイントにおける、独立変数の偏差及び従属変数の偏差を算出(決定)する。
(c)角度決定部24は、(b)で決定された独立変数の偏差を用いて、データポイントバッファに保持されているデータポイントにおける独立変数の分散を算出(決定)する。
(d)角度決定部24は、(b)で決定された独立変数の偏差及び従属変数の偏差を用いて、データポイントバッファに保持されているデータポイントにおける共分散を算出(決定)する。
(e)角度決定部24は、(d)で決定された共分散を(c)で決定された独立変数の分散で割ることにより回帰直線の傾きを算出(決定)する。
1つの例では、角度決定部24は、データポイントバッファに保持されているデータポイントにおけるx軸の値の最大値と最小値の差分値及びy軸の値の最大値と最小値の差分値に基づいて、独立変数の軸としてx軸及びy軸のいずれか一方の軸を決定し、他方の軸を従属変数の軸として決定する。好ましくは、角度決定部24は、データポイントバッファに保持されているデータポイントにおけるx軸の値の最大値と最小値の差分値に対して重み係数を用いて重み付けを行った値及びy軸の値の最大値と最小値の差分値に基づいて、独立変数の軸としてx軸及びy軸のいずれか一方の軸を決定し、他方の軸を従属変数の軸として決定する。
角度決定部24は、上記のように最小二乗法を用いて回帰直線の傾きを算出(決定)する。好ましくは、角度決定部24が回帰直線の傾きを算出することは、角度決定部24が回帰直線の傾きの角度を算出することを意味する。ここで、算出される回帰直線の傾きは正負の方向を持たないため、角度決定部24は、最小二乗法を用いて回帰直線の傾きを算出する際、例えば0度〜90度及び270度〜360度の範囲内で算出する。したがって、例えばデータポイントの集合が示す角度が、45度の場合であっても225度の場合であっても、回帰直線の傾きとして45度が算出される。そのため、角度決定部24は、回帰直線の傾きを決定した後、データポイントバッファに保持されているデータポイントの集合としての変位方向に基づいて、決定された回帰直線の傾きを回転させる回転量を決定する。具体的には、角度決定部24は、回帰直線の傾きを決定した後、ユーザが操作対象オブジェクトを制御するための角度を決定するにあたって、決定された回帰直線の傾き(の角度)に対して180度回転させるか否かを示す回転量を決定する。ここで、データポイントの集合としての変位方向は、データポイントが時間とともに変位する方向を示すものであり、例えばユーザがタッチパネル17上で指を動かす大まかな方向に対応するものである。
1つの例では、角度決定部24は、データポイントバッファに保持されているデータポイントにおいて時系列的に前後するデータポイントの変位方向に基づいて、回転量を決定する。好ましくは、角度決定部24は、データポイントバッファに保持されているデータポイントにおける時系列的に前後する、決定された独立変数の軸の値の差分値の正負の数量を比較することにより、回転量を決定する。決定される回転量は、決定された回帰直線の傾きに対して180度回転させるか否かを示す回転量である。
角度決定部24は、データポイントバッファが先に格納されたデータポイントから順番にデータポイントを保持するように、各データポイントを格納する。或いは、角度決定部24は、データポイントバッファにデータポイントを格納するとき、格納された順番が識別可能な識別情報を関連付けて格納する。このように、角度決定部24は、格納された順番が識別できるように、すなわち格納されたデータポイントの時系列順が識別できるように、データポイントバッファにデータポイントを保持している。このとき、角度決定部24は、データポイント取得時間tの値を用いることができる。
角度決定部24は、決定された回帰直線の傾き及び決定された回転量に基づいて、データポイントの集合が示す角度を算出し、ユーザが仮想空間内の操作対象オブジェクトを制御するための角度として決定する。
本実施形態では、上記の角度決定部24が行う、回帰直線の傾きの決定、回転量の決定、及び角度の決定について、式(1)に示す関数aop(x,y)を用いて実現する。関数aop(x,y)は、0〜360度の実数で角度を算出する。関数aop(x,y)が角度を算出するとき、データポイントバッファはn個のデータポイントP(x,y)を保持しているものとする。また、n個の各データポイントP
k(k=1〜n)のx座標の値及びy座標の値は、P
k(x
k,y
k)で表され、P
1(x
1,y
1)、P
2(x
2,y
2)、…、P
n(x
n,y
n)の順番に格納された時間が早いものとする。
(1)
関数aop(x,y)は、場合分けをするため、関数rotate(x,y)、関数left(x)、関数down(y)を使用する。最初に、関数aop(x,y)は、関数rotate(x,y)を用いて、xとyのいずれか一つを独立変数として決定する。
関数rotate(x,y)は、式(2)により定められる。
(2)
関数rotate(x,y)は、n個のデータポイントP(x,y)が主にy軸方向に変位しているか否かを判定し、例えば真偽値を返す。n個のデータポイントP(x,y)が主にy軸方向に変位している場合とは、例えばタッチパネル17上でユーザの指が主として上下方向に動いた場合である。このようにして、関数rotate(x,y)は、n個のデータポイントP(x,y)が主にx軸(左右)方向に変位しているか又は主にy軸(上下)方向に変位しているかを判定し、x軸の値とy軸の値のどちらが独立変数として適切であるかを判定する。
式(2)において、(max(x)―min(x))は、n個のデータポイントPのxの値(x1,x2,…xn)における最大値と最小値の差分の絶対値であり、n個のデータポイントPのx軸方向の変位量を示す。同様にして、(max(y)―min(y))は、n個のデータポイントPのyの値(y1,y2,…yn)における最大値と最小値の差分の絶対値であり、n個のデータポイントPのy軸方向の変位量を示す。変数wは、(max(x)―min(x))に対して重み付けを行う重み係数である。
関数rotate(x,y)は、(max(y)―min(y))が(max(x)―min(x))と変数wとの積の値よりも大きいときに不等号を満たし、関数aop(x,y)は、座標変換を行う。この場合、関数aop(x,y)は、y軸を独立変数の軸とし、x軸を従属変数の軸とし、更に関数down(y)を用いて、回転量を決定する。一方、関数rotate(x,y)は、(max(y)―min(y))が(max(x)―min(x))と変数wとの積の値以下のときに不等号を満たさず、関数aop(x,y)は、座標変換を行わない。この場合、関数aop(x,y)は、x軸を独立変数の軸とし、y軸を従属変数の軸とすし、更に関数left(x)を用いて、回転量を決定する。
関数rotate(x,y)が変数wにより重み付けされない場合、y軸方向の変位量がx軸方向の変位量よりもわずかに大きいと、関数aop(x,y)は座標変換を行うこととなる。変数wを用いて重み付けすることにより、関数aop(x,y)は、n個のデータポイントP(x,y)がよりy軸に沿った傾きの場合に座標変換を行うようにすることが可能となる。
例えばスマートフォンは縦持ちで使用されることが多いため、図3に示すタッチパネル17のy軸は重力方向と実質的に平行となることが多い。タッチパネル17のy軸方向の寸法はx軸方向の寸法より大きいことを考慮すると、変数wは1より大きい値とすることが好ましい。例えば、変数wは2とすることが好ましい。他の例では、スマートフォンが横持ちされ、かつゲームアプリが備えるゲームエンジンが縦横の座標の変換をしない場合、角度決定部24はwを0.5などの1より小さい値に決定する。
関数left(x)は、式(3)により表される。
(3)
関数left(x)は、関数rotate(x,y)が不等号を満たさない場合、n個のデータポイントP(x,y)の変位方向が−x軸方向(左方向)か否かを判定し、例えば真偽値を返す。具体的には、関数left(x)は、n個のデータポイントPのxの値(x
1,x
2,…x
n)における時系列的に前後する値の差分値(x
2−x
1,x
3−x
2,…x
n−x
n-1)を算出する。関数left(x)は、差分値がマイナスとなる個数が、差分値がプラスとなる個数より多いか否かを判定することにより、n個のデータポイントP(x,y)の変位方向が−x軸方向(左方向)か否かを判定する。このようにして、関数left(x)は、n個のデータポイントP(x,y)の変位方向が−x軸方向(左方向)か+x軸方向(右方向)であるかを判定し、決定された回帰直線の傾きに対して180度回転させるか否かを示す回転量を決定する。例えば、関数left(x)が真である場合、関数aop(x,y)は回転量を180度と決定し、関数left(x)が偽である場合、関数aop(x,y)は回転量を0度と決定する。
関数down(y)は、式(4)により表される。
(4)
関数down(y)は、関数rotate(x,y)が不等号を満たす場合、n個のデータポイントP(x,y)の変位方向が−y軸方向(下方向)か否かを判定し、例えば真偽値を返す。具体的には、関数down(y)は、n個のデータポイントPのyの値(y
1,y
2,…y
n)における時系列的に前後する値の差分値(y
2−y
1,y
3−y
2,…y
n−y
n-1)を算出する。関数down(y)は、差分値がマイナスとなる個数が、差分値がプラスとなる個数より多いか否かを判定することにより、n個のデータポイントP(x,y)の変位方向が−y軸方向(下方向)か否かを判定する。このようにして、関数down(y)は、n個のデータポイントP(x,y)の変位方向が−y軸方向(下方向)か+y軸方向(上方向)であるかを判定し、決定された回帰直線の傾きに対して180度回転させるか否かを示す回転量を決定する。例えば、関数down(y)が真である場合、関数aop(x,y)は回転量を180度と決定し、関数down(y)が偽である場合、関数aop(x,y)は回転量を0度と決定する。
関数aop(x,y)は、上記のように、独立変数(独立変数の軸)及び回転量を決定した後、最小二乗法を用いて傾きを算出する。関数aop(x,y)は、xを独立変数とし、yを従属変数とする場合、y=ax+bの回帰直線の傾きaは、式(5)により算出している。
(5)
ここで、
は、x(独立変数)の平均であり、
は、y(従属変数)の平均であり、
は、x(独立変数)とy(従属変数)の共分散であり、
は、x(独立変数)の分散である。
なお、関数aop(x,y)は、yを独立変数とし、xを従属変数とする場合、x=cx+dの回帰直線の傾きcは、式(6)により算出している。
(6)
ここで、
は、x(従属変数)の平均であり、
は、y(独立変数)の平均であり、
は、x(従属変数)とy(独立変数)の共分散であり、
は、y(独立変数)の分散である。
角度決定部24は、変数Vを定め、独立変数の分散がV以上であった場合、関数aop(x,y)を用いて角度を算出し、決定する。角度決定部24は、独立変数の分散がV未満である場合、keepイベントを状態決定部25へ出力し、角度を算出しない。独立変数の分散がV未満である場合とは、n個のデータポイントP(x,y)が、局所的に集中していることを意味する。したがって、角度決定部24が変数Vを定めることにより、微細すぎる指の動きを無視し、安定した角度の算出を行うことが可能となる。変数Vは、好ましくは0.7に設定される。
関数aop(x,y)は、関数rotate(x,y)が偽であり、関数left(x)が偽である場合、回帰直線の傾きから得られる角度をそのまま算出する。関数aop(x,y)は、関数rotate(x,y)が偽であり、関数left(x)が真である場合、回帰直線の傾きから得られる角度に180度プラスした角度を算出する。関数aop(x,y)は、関数rotate(x,y)が真であり、関数down(y)が偽である場合、回帰直線の傾きから得られる角度を90度から引くことにより角度を算出する。関数aop(x,y)は、関数rotate(x,y)が真であり、関数down(y)が真である場合、回帰直線の傾きから得られる角度を90度から引くことにより算出した角度に180度プラスした角度を算出する。
状態決定部25は、角度決定部24により既定の処理時間ごとに決定される角度に基づいて、既定の処理時間ごとに角度及び大きさを決定する。状態決定部25は、決定した角度及び大きさをアプリケーション部26へ出力する。状態決定部25は、アプリケーション部26へ直接出力せずに、アプリケーション部26が参照するメモリ領域に決定した角度及び大きさを示す情報を格納してもよい。1つの好適な例では、状態決定部25は、連続的に算出される角度の列をコントローラの機能に変換するソフトウェアモジュールである。本モジュールは、タッチ座標は一切用いず、角度と時間を使った状態管理モデル(ステートマシン)として実装される。
状態決定部25は、既定の処理時間ごとに角度決定部24が出力する情報を受け取ると、受け取ったイベントに応じて、既定の処理時間ごとに仮想コントローラの傾きの状態を出力する。仮想コントローラは、物理的なアナログコントローラをソフトウェアで実現するものであるが、仮想コントローラの傾きとは、物理的なコントローラのジョイスティックやレバーの傾きに対応するものである。状態決定部25は、仮想コントローラの傾きの状態を、ベクトルすなわち方向(角度)及び大きさとして出力する。大きさは、加速度情報とすることもできるし、速度情報とすることもできる。仮想コントローラの傾きの状態は、物理的なアナログコントローラの入力量に対応するものである。
このように、状態決定部25は、発生したタッチイベントの意味を解釈するための状態遷移モデルを提供するものと考えることができる。状態決定部25は、仮想のコントローラの傾きを状態として管理し、既定の処理時間ごとに角度決定部24が出力する情報を受け取ると、既定の処理時間ごとに状態遷移させるものである。
1つの例では、状態決定部25は、角度決定部24から出力される角度の情報を蓄積し、時間に応じて、アプリケーション部26への出力を算出する。例えば、角度決定部24が165ms継続して33msごとに45度を出力する場合、状態決定部25は、45度の方向に165ms分の加速度情報を決定する。例えば、角度決定部24が同じ角度の出力が連続した場合、状態決定部25は該角度の方向へ加速する情報を出力し、続けて角度決定部24が該角度と180度反対の角度を入力した場合、状態決定部25は、減速する情報を出力する。このような構成とすることにより、実際のタッチ座標をそのまま用いずに、コントローラの入力量を、状態遷移回数に対応する時間として求めることが可能となる。
1つの例では、状態決定部25は、角度決定部24が出力する情報を受け取ると、受け取ったイベントに応じて、仮想コントローラの傾きの状態を設定し、ゲームアプリケーションへ移動イベント又は加速イベントを角度及び大きさを示す情報とともに出力する。具体的には、状態決定部25は、所定のプログラム言語を用いて、物理的なアナログコントローラを模した加速度処理を実装することができる。
1つの好適な例では、状態決定部25は、仮想コントローラの傾きの状態をベクトルとして保持し、既定の処理時間ごとに、保持したベクトルを出力する。状態決定部25は、角度決定部24からstartイベントを受け取ると、状態管理を開始する。状態決定部25は、最初に角度決定部24からangleイベントを受け取ると、受け取った角度及び状態遷移1回分の大きさのベクトルの保持を開始し、該ベクトルを出力する。状態決定部25は、更に角度決定部24からangleイベントを受け取ると、内部で保持するベクトルに、受け取った角度及び状態遷移1回分の大きさのベクトルを加算して、該ベクトルを保持するとともに出力する。状態決定部25は、出力するベクトルの長さが1.0を超えた場合、1.0に正規化する。
例えば、状態決定部25は、角度決定部24から45度の角度情報を1回受け取ると、45度の角度及び0.2の大きさのベクトルを出力するとともに、該ベクトルを保持する。状態決定部25は、角度決定部24から45度の角度情報を更に4回受け取ると、45度の角度及び1.0の大きさのベクトルを保持するとともに出力する。状態決定部25は、更に角度決定部24から45度の角度情報を受け取った場合も、45度の角度及び1.0の大きさのベクトルを保持するとともに出力する。状態決定部25は、30度の角度情報を受け取った場合、30度の角度及び0.2の大きさのベクトルと、45度の角度及び1.0の大きさのベクトルとを加算したベクトルの角度及び1.0の大きさのベクトルを保持するとともに出力する。この場合も、ベクトルの大きさが1.0を超えるため、状態決定部25は、1.0に正規化して出力する。
状態決定部25は、角度決定部24からkeepイベントを受け取ると、内部で保持するベクトルの保持を継続し、該ベクトルを出力する。状態決定部25は、角度決定部24からstopイベントを受け取ると、内部で保持するベクトルの保持を解除し、ゼロベクトルを出力するか、又はstopイベントを出力する。
このような構成とすることにより、物理的なアナログコントローラと同様の操作をスマートフォン上で実現することが可能となる。
アプリケーション部26は、電子装置10上で起動されたアプリの機能を有し、当該アプリによるサービスの提供を行う。1つの好適な例では、アプリケーション部26は、状態決定部25から出力されたベクトルを、具体的な仮想キャラクタのモーションなどに変換するものであり、一般的なゲームアプリに実装されている機能である。アプリがWebアプリである場合、電子装置10と通信するサーバがアプリケーション部26の一部又は全部を有し、アプリは、当該サーバとデータの送受信を行う。
角度決定部24による、式(1)に示す関数aop(x,y)を用いた角度算出の実施例を以下に説明する。以下の例示において、変数wは2であり、独立変数の分散はV以上であるものとし、時間t1〜t4は、角度決定部24が角度を算出する任意の1つの時間を示すものとする。
図5は、時間t1におけるデータポイントバッファが保持するデータポイントの一例を示す図である。データポイントバッファが保持するデータポイントの集合40は、6個のデータポイントP41〜46からなる。また、P41〜46のx座標の値及びy座標の値(x,y)は、各々P41(x41,y41)、P42(x42,y42)…P46(x46,y46)であり、データポイントバッファは、P41、P42、…、P46の順番でデータポイントを格納したものとする。
最初に、関数aop(x,y)は、関数rotate(x,y)を用いて、abs(max(x)―min(x))とabs(max(y)―min(y))を比較する。図6より、P46とP41のx座標の値の差分値x46−x41(=Δx)がabs(max(x)―min(x))に対応し、P45とP41のy座標の値の差分値y45−y41(=Δy)がabs(max(y)―min(y))に対応することが確認できる。図5より、Δx>Δyである。したがって、関数rotate(x,y)は、不等号を満たさないため、偽の値を返す。
続いて、関数aop(x,y)は、関数left(x)を用いて、時系列的に前後する値の差分値(x42−x41,x43−x42,…x46−x45)を算出する。図5より、差分値はすべてプラスとなる。したがって、関数left(x)は不等号を満たさないため、偽の値を返す。
上記実施例においては、関数rotate(x,y)が偽であり、関数left(x)が偽である。したがって関数aop(x,y)は、データポイントの集合40から図7に示す回帰直線81を求め、図8に示すように回帰直線81の傾きから角度91を算出する。
図9は、時間t2におけるデータポイントバッファが保持するデータポイントの一例を示す図である。データポイントバッファが保持するデータポイントの集合60は、6個のデータポイントP61〜66からなる。P61、P62、…P66のx座標の値及びy座標の値は、各々P46、P45、…、P41のx座標の値及びy座標の値と同じであり、P61、P62、…、P66の順番でデータポイントを格納したものとする。
関数rotate(x,y)は、図5の実施例の場合と同様にして、不等号を満たさないため、偽の値を返す。続いて、関数aop(x,y)は、関数left(x)を用いて、時系列的に前後する値の差分値を算出する。図9より、差分値はすべてマイナスとなる。したがって、関数left(x)は不等号を満たし、真の値を返す。
上記実施例においては、関数rotate(x,y)が偽であり、関数left(x)が真である。したがって関数aop(x,y)は、データポイントの集合60から図9に示す回帰直線82を求め、図10に示すように回帰直線82の傾きから算出される角度92aに180度プラスした角度92bを算出する。ここで、回帰直線82の傾きは回帰直線81と同じであり、角度91は角度92aと同じであるが、データポイントバッファがデータポイントを格納した順番が逆であるため、関数aop(x,y)が算出する角度は180度異なることが確認できる。
図11は、時間t3におけるデータポイントバッファが保持するデータポイントの一例を示す図である。データポイントバッファが保持するデータポイントの集合70は、6個のデータポイントP71〜76からなる。また、P71〜76のx座標の値及びy座標の値は、各々P71(x71,y71)、P72(x72,y72)…P46(x76,y76)であり、データポイントバッファは、P71、P72、…、P76の順番でデータポイントを格納したものとする。
図12より、P75とP71のx座標の値の差分値x75−x71(=Δx)がabs(max(x)―min(x))に対応し、P76とP71のy座標の値の差分値y76−y71(=Δy)がabs(max(y)―min(y))に対応することが確認できる。図11より、2×Δx<Δyである。したがって、関数rotate(x,y)は、不等号を満たすため、真の値を返す。
続いて、関数aop(x,y)は、関数down(y)を用いて、時系列的に前後する値の差分値(y72−y71,y73−y72,…y76−y75)を算出する。図11より、差分値はすべてプラスとなる。したがって、関数down(y)は不等号を満たさないため、偽の値を返す。
上記実施例においては、関数rotate(x,y)が真であり、関数down(y)が偽である。したがって関数aop(x,y)は、データポイントの集合70から図13に示す回帰直線83を求め、図13に示すように回帰直線83の傾きから算出される角度93aを、90度から引くことにより角度93bを算出する。ここで、図13に示す角度93aは、yを独立変数としてxを従属変数とした場合の回帰直線83の傾きから算出される角度を、xを独立変数としてyを従属変数とした座標に戻した場合の位置に対応させて示している。
図14は、時間t4におけるデータポイントバッファが保持するデータポイントの一例を示す図である。時間t4は、時間t1から時間Δtが経過した時間である。データポイントバッファが保持するデータポイントの集合40’は、8個のデータポイントP45〜52からなる。また、P45〜52のx座標の値及びy座標の値は、各々P45(x45,y46)、P46(x46,y46)…P52(x52,y52)であり、データポイントバッファは、P45、P46、…、P52の順番でデータポイントを格納したものとする。
図15より、P52とP45のx座標の値の差分値x52−x45(=Δx)がabs(max(x)―min(x))に対応し、P46とP52のy座標の値の差分値y46−y52(=Δy)がabs(max(y)―min(y))に対応することが確認できる。図14より、2×Δx<Δyである。したがって、関数rotate(x,y)は、不等号を満たすため、真の値を返す。
続いて、関数aop(x,y)は、関数down(y)を用いて、時系列的に前後する値の差分値(y46−y45,y47−y46,…y52−y51)を算出する。図11より、y46−y45以外の差分値はマイナスとなる。したがって、関数down(y)は不等号を満たすため、真の値を返す。
上記実施例においては、関数rotate(x,y)が真であり、関数down(y)が真である。したがって関数aop(x,y)は、データポイントの集合40’から図16に示す回帰直線84を求め、図17に示すように回帰直線83の傾きから算出される角度94aを、90度から引くことにより算出した角度94bに180度プラスした角度94cを算出する。
図18は、本発明の一実施形態による電子装置10がデータポイントの集合120から仮想キャラクタ121を制御する様子を示す図である。図18は、タッチパネル17へのユーザの操作により発生したタッチイベントに対応するデータポイントを可視化したデータポイントの集合120を示す。電子装置10は、データポイントの集合120が示す角度122に基づいて、操作対象オブジェクトである仮想キャラクタ121のモーション、例えば歩く、走る、方向転換などを制御する。
図19は、本発明の一実施形態による角度決定部24の情報処理のフローチャートを示す図である。本フローチャートは、タッチイベントが発生し、角度決定部24が該タッチイベントからデータポイントを取得したときに開始する。
ステップ101で、角度決定部24は、取得したデータポイントをデータポイントバッファに格納する。このとき、角度決定部24は、格納するデータポイントに、格納後の経過時間をミリ秒で示すTと、データポイントバッファに格納できる時間(保持寿命)をミリ秒で示す変数Dを関連付ける。
続いてステップ102で、角度決定部24は、startイベントを状態決定部25へ出力する。
続いてステップ103で、角度決定部24は、タッチイベントが発生したか否かを判定する。ステップ103は、本フローチャート開始時からIms後に実行される。タッチイベントが発生した場合、本フローチャートはステップ104へ進み、タッチイベントが発生しなかった場合、本フローチャートはステップ106へ進む。
ステップ104で、角度決定部24は、発生したタッチイベントがtouchendであるか否かを判定する。取得したタッチイベントがtouchendであった場合、本フローチャートは終了する。取得したタッチイベントがtouchendでなかった場合、本フローチャートはステップ105へ進む。
ステップ105で、角度決定部24は、発生したタッチイベントからデータポイントを取得し、データポイントバッファに格納する。このとき、角度決定部24は、格納するデータポイントに、格納後の経過時間をミリ秒で示すTと、データポイントバッファに格納できる時間をミリ秒で示す変数Dを関連付ける。
続いてステップ106で、角度決定部24は、データポイントバッファに保持されているデータポイントのうち、経過時間Tが変数D以上であるデータポイントの保持を終了する。角度決定部24は、データポイントバッファに格納する各データポイントについて、経過時間Tと変数Dを比較し、経過時間Tが変数D以上である場合、当該データポイントの保持を終了する。
続いてステップ107で、角度決定部24は、データポイントバッファが保持するデータポイントの個数nが変数Bの数以上であるか否かを判定する。個数nが変数B以上である場合、本フローチャートはステップ108へ進み、個数nが変数B未満であった場合、本フローチャートはステップ113へ進む。
ステップ108で、角度決定部24は、データポイントバッファに保持されているデータポイントにおけるx軸の値の変位量及びy軸の値の変位量に基づいて、独立変数の軸としてx軸及びy軸のいずれか一方の軸を決定する。角度決定部24は、同時に他方の軸を従属変数の軸として決定する。
続いてステップ109で、角度決定部24は、ステップ108でx軸が独立変数の軸として決定された場合、式(5)を用いて傾きの角度を算出することにより、回帰直線の傾きの角度を決定する。1つの例では、角度決定部24は、式(5)を用いて傾きの角度を算出する際、0度〜90度及び270度〜360度の範囲内で算出する。角度決定部24は、ステップ108でy軸が独立変数の軸として決定された場合、式(6)を用いて傾きの角度を算出し、算出した角度を90度から引くことにより、回帰直線の傾きの角度を決定する。1つの例では、角度決定部24は、式(6)を用いて傾きの角度を算出する際、0度〜90度及び270度〜360度の範囲内で算出する。
続いて、ステップ110で、角度決定部24は、データポイントバッファに保持されているデータポイントの集合としての変位方向に基づいて、決定された回帰直線の傾きに対して180度回転させるか否かを示す回転量を決定する。1つの例では、角度決定部24は、ステップ108でx軸が独立変数の軸として決定された場合、時系列的に前後するx軸の値の差分値を各々算出する。角度決定部24は、算出した差分値がマイナスとなる個数がプラスとなる個数よりも多いとき、回転量を180度に決定し、少ないとき、回転量を0度に決定する。1つの例では、角度決定部24は、ステップ108でy軸が独立変数の軸として決定された場合、時系列的に前後するy軸の値の差分値を各々算出する。角度決定部24は、算出した差分値がマイナスとなる個数がプラスとなる個数よりも多いとき、回転量を180度に決定し、少ないとき、回転量を0度に決定する。
続いて、ステップ111で、角度決定部24は、決定された回帰直線の傾き及び決定された回転量に基づいて、角度を決定する。具体的には、角度決定部24は、決定された回帰直線の傾きに対応する角度に決定された回転量を加算することにより、角度を決定する。例えば回転量が0度の場合、角度決定部24が決定する角度は、決定された回帰直線の傾きに対応する角度となる。角度決定部24は、angleイベントを決定された角度とともに状態決定部25へ出力し、ステップ112へ進む。
ステップ107で個数nが変数B未満であった場合、ステップ113で、角度決定部24は、keepイベントを状態決定部25へ出力し、ステップ112へ進む。
ステップ112で、本フローチャートは、例えばゲームアプリケーションが終了するなどにより終了しない限り、ステップ103へ戻る。角度決定部24は、ステップ103〜ステップ112の処理を、Imsごとに実行する。
本フローチャートが終了すると、角度決定部24は、データポイントバッファに保持するデータポイントをすべて削除する。
次に、本発明の実施形態による電子装置10の主な作用効果について説明する。本実施形態では、タッチパネル17上で指をスワイプさせたとき、例えば100msなどの極めて短い時間に6回以上のタッチイベントが発生するという投影型静電容量方式タッチパネルの特徴を利用している。電子装置10が実装するソフトウェアのシステムアーキテクチャは、角度決定部24、状態決定部25、アプリケーション部26が第1層、第2層、第3層に各々対応する3層構造をとり、第3層は、ゲームアプリケーションに対応する。第1層は、発生する複数のタッチイベントの集合(データポイントの集合)を対象として、スワイプ方向を360度のリニアな角度で算出する。第1層は、極めて短い時間に発生するタッチイベントを用いることができるため、高速に角度を算出し続けることが可能となる。また第1層は、データポイントバッファが極めて短い既定の保持時間(例えば165ms)だけ保持するデータポイントの集合が示す角度を求めることにより、基準点を用いずにタッチパネル17に対してタッチ操作を行ったユーザが意図する方向の角度を求めることが可能となる。
なお、本実施形態の電子装置10は、スワイプ等のユーザの操作が複雑であっても、100msなどの極めて短い時間では、等速直線運動としてモデル化できるため、等速度運動の角度を連続的に算出することにより、任意の非線形関数(≒人間の操作)を予測・近似させることができるというコンセプトに基づいて設計されたものである。
第1層は、変数Iの値が比較的大きく設定された場合、比較的低い頻度で角度を算出する。この場合、第1層は、タッチイベントが発生し始めた直後においても、例えばユーザが操作を開始した直後においても、データポイントバッファに比較的多くのデータポイントが保持されている状態で、角度を算出することになる。このように、変数Iの値を比較的大きく設定することにより、ユーザの操作を比較的緩やかに反映した角度を算出することが可能となる。一方、第1層は、変数Iの値が比較的小さく設定された場合、比較的高い頻度で角度を算出する。この場合、第1層は、タッチイベントが発生し始めた直後では、例えばユーザが操作を開始した直後では、データポイントバッファに比較的少数のデータポイントが保持されている状態で、角度を算出することになる。このように、変数Iの値を比較的小さく設定することにより、ユーザの操作を比較的即座に反映した角度を算出することが可能となる。
第1層は、データポイントの集合が示す角度を算出するにあたって、最小二乗法を用いて回帰直線の傾きを算出する。xを独立変数及びyを従属変数として固定した場合、y軸に沿った傾きの場合等は傾きを算出することが難しいため、第1層は、データポイントの変位量から独立変数及び従属変数を決定した後で、回帰直線の傾きを算出する。このような構成とすることにより、第1層は、安定的に回帰直線の傾きを算出することが可能となる。
第1層は、データポイントの集合が示す角度を算出するにあたって、ユーザがタッチパネル17上で指を動かす大まかな方向に対応するデータポイントの集合としての変位方向に基づいて、決定された回帰直線の傾きに対して180度回転させるか否かを示す回転量を決定する。このように、最小二乗法を用いて算出された回帰直線の傾きからは把握できない回転量を決定することにより、タッチパネル17に対してタッチ操作を行ったユーザが意図する方向の角度を求めることが可能となる。
第1層は、既定の処理時間ごとに、例えば既定の処理時間としてゲームアプリケーションにおけるフレームレートに対応する時間ごとに、データポイントの集合を対象として、スワイプ方向に対応する角度を算出する。第2層は、継続的に出力される角度情報を用いて、既定の処理時間ごとに、仮想コントローラの傾きの状態を示すベクトル量(角度及び大きさ)を決定し、ゲームアプリケーションへ出力する。このような構成とすることにより、本実施形態では、ゲームアプリケーションに対して、既定の処理時間ごとに算出された角度に基づいた入力を行うことが可能となる。また、このような構成とすることにより、いずれの層も、過去のタッチ座標を基準点として用いずに、第1層が算出するフレームレートごとの高頻度で正確な移動角度に基づいた入力を行うことが可能となる。このように、本実施形態では、電子装置10は、従来技術における仮想コントローラで使用されていた、開始点(開始座標)や終了点(終了座標)といった点という空間的な概念を使用せずに角度を算出する。
また本実施形態では、従来技術における仮想コントローラ、すなわち基準座標と現在の指示座標との間の位置関係によって得られるベクトルを用いた仮想コントローラとは異なり、基準座標の概念がないため、基準座標を定める仮想コントローラよりも高い応答性を提供することが可能である。特に仮想キャラクタ等の方向転換操作においては、方向転換前とは大きく異なる方向にユーザがタッチパネル上の操作を行ったとしても、現在の指示座標が基準座標に近づくという概念そのものがないため、ユーザの意図した操作内容に素早く応答して方向転換することができ、優位性が顕著である。また上記のように構成されることにより、スマートフォンで操作するユーザに対して片手での操作を可能とすることができる。これにより、ユーザが従来技術における仮想ジョイスティックの操作を行うにあたって、常に基準座標を意識する必要があり、片手での操作が難しい場合があるという問題点を解消することができる。このように、本実施形態では、より高速で直感的な操作を可能とする仮想コントローラを実現している。
また本実施形態では、電子装置10は、従来技術における仮想コントローラと異なり、基準座標からの指の移動距離に応じた入力ではないため、指の移動量がより少ない操作により、ユーザが意図する操作を実現することが可能となる。したがって、従来技術と比較して、より小さい実装面積で実現することが可能となる。例えば、タッチパネル17の大きさに関わらず、同一の操作性を実現することが可能となる。
また、本実施形態の電子装置10が提供する仮想コントローラの技術は、スワイプ操作からの角度の認識を数理的にモデル化しているため、360度の方向移動、加速・減速、格闘ゲームのようなコマンド入力等の幅広いジャンルに適用可能である。
上記の作用効果は、特に言及が無い限り、他の実施形態や他の実施例においても同様である。
本発明の他の実施形態では、上記で説明した本発明の実施形態の機能やフローチャートに示す情報処理を実現するプログラムや該プログラムを格納したコンピュータ読み取り可能な記憶媒体とすることもできる。また他の実施形態では、上記で説明した本発明の実施形態の機能やフローチャートに示す情報処理を実現する方法とすることもできる。また他の実施形態では、上記で説明した本発明の実施形態の機能やフローチャートに示す情報処理を実現するプログラムをコンピュータに供給することができるサーバとすることもできる。また他の実施形態では、上記で説明した本発明の実施形態の機能やフローチャートに示す情報処理を実現する仮想マシンとすることもできる。
以下に本発明の実施形態の変形例について説明する。以下で述べる変形例は、矛盾が生じない限りにおいて、適宜組み合わせて本発明の任意の実施形態に適用することができる。
1つの変形例では、電子装置10は、仮想空間上に仮想的なオブジェクトを配置し、該仮想空間内に配置される仮想カメラによって撮影したゲーム画像をユーザに提示し、ゲームを進行するゲームアプリケーションがインストールされている。電子装置10は、当該ゲームアプリケーションが実行されると、仮想空間内に配置される仮想的なオブジェクトなどを、仮想空間内に配置される仮想カメラによって撮影したゲーム画像をタッチパネル17に表示し、ユーザの操作に応じて仮想カメラを制御する。このように、電子装置10は、当該ゲームアプリケーションが実行されると、ユーザの操作に応じて、操作対象オブジェクトである仮想カメラを制御するための仮想コントローラを提供する。仮想カメラの制御とは、仮想空間に配置された仮想カメラの動き又は視野領域の制御である。
図20は、本発明の一実施形態による電子装置10が表示する画像を撮影する仮想空間内に配置された仮想カメラ131を示す図である。図20は、仮想カメラ131の位置と、仮想カメラ131の視線方向132を示す。視線方向132は仮想カメラ131の位置を視点とする3次元ベクトルで定められる。仮想カメラ131から視線方向132に一定の視野角において視野領域が定められ、当該視野領域に視線方向132と垂直な面である2次元スクリーン133が定められる。2次元スクリーン133に対して、仮想空間内の仮想的なオブジェクトが投影され、2次元画像が形成される。
1つの変形例では、入力装置12と表示装置13は、別の位置に配置される別個の形態である。この場合、入力装置12は、タッチパネル又は投影型静電容量方式タッチパネルと同等の機能を有するデバイスである。表示装置13は、プロセッサ11の制御に従って、アプリケーション画面などを電子装置10のユーザに表示するものであればよく、例えば液晶ディスプレイ、有機ELを用いたディスプレイやプラズマディスプレイなどである。
1つの変形例では、角度決定部24は、最小二乗法以外の既知の方法を用いて、回帰直線の傾きを算出する。この場合、角度決定部24は、決定された回帰直線の傾きに対して180度回転させるか否かを示す回転量を決定せず、これに伴い、独立変数の軸及び従属変数の軸を決定しない。例えば、カルマンフィルタ又はパーティクルフィルタなどのアルゴリズムを用いることができる。
1つの変形例では、角度決定部24は、変数Dを定めず、データポイントバッファに保持されているデータポイントのうち既定の保持時間を超えたと判断されたデータポイントの保持を終了しない。この場合、角度決定部24は、変数Iで定める時間ごとに、変数Iで定める時間ずつずらした特定の時間帯に格納されたデータポイントを参照することにより角度を決定する。
1つの変形例では、角度決定部24は、変数Vを定めない。この場合、角度決定部24は、独立変数の分散の値に関わらず、関数aop(x,y)を用いて角度を算出し、決定する。
1つの変形例では、電子装置10は重力方向を判定することが可能な加速度センサを備える。角度決定部24は、加速度センサから取得された情報を用いて重み係数を決定する。例えば、スマートフォンが縦持ちされてタッチパネル17のy軸が重力方向となる場合、角度決定部24はwを2に決定する。一方、スマートフォンが横持ちされてタッチパネル17のx軸が重力方向となり、かつゲームアプリケーションが備えるゲームエンジンが縦横の座標の変換をしない場合、角度決定部24はwを0.5などの1より小さい値に決定する。
1つの変形例では、角度決定部24は、タッチイベントを取得するとき、2つの変数からなる数値の組(x、y)を取得し、データポイント取得時間tを対応付けずに、2つの変数からなる数値の組(x、y)をデータポイントバッファに格納する。例えば、角度決定部24は、データポイント取得時間tに対応する情報をデータポイントバッファ以外の記憶装置14内のメモリ領域などに記憶し、データポイントバッファに格納するデータに対応付けて管理することができる。
以上に説明した処理又は動作において、あるステップにおいて、そのステップではまだ利用することができないはずのデータを利用しているなどの処理又は動作上の矛盾が生じない限りにおいて、処理又は動作を自由に変更することができる。また以上に説明してきた各実施例は、本発明を説明するための例示であり、本発明はこれらの実施例に限定されるものではない。本発明は、その要旨を逸脱しない限り、種々の形態で実施することができる。