(57)【要約】      （修正有）【課題】仮想空間内の操作対象オブジェクトを制御するにあたって、より操作性を高くすることが可能なプログラムを提供する。【解決手段】電子装置１０において実行されるプログラムであって、該電子装置に、タッチパネルへのユーザの操作により発生したタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントを保持するステップと、保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了するステップと、保持されているデータポイントに基づいて回帰直線の傾きを決定するステップと、保持されているデータポイントの集合としての変位方向に基づいて決定された回帰直線の傾きを回転させる回転量を決定するステップと、決定された回帰直線の傾き及び決定された回転量に基づいて、ユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定するステップと、を実行させる。【選択図】図２
2019200765.tif 000002
【特許請求の範囲】
【請求項１】
タッチパネルを備える電子装置において実行されるプログラムであって、該電子装置に、
前記タッチパネルへのユーザの操作により発生したタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントを保持するステップと、  前記保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了するステップと、
前記保持されているデータポイントに基づいて回帰直線の傾きを決定するステップと、  前記保持されているデータポイントの集合としての変位方向に基づいて前記決定された回帰直線の傾きを回転させる回転量を決定するステップと、
前記決定された回帰直線の傾き及び前記決定された回転量に基づいて、前記ユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定するステップと、
を実行させるプログラム。
【請求項２】
前記回転量を決定するステップは、
前記保持されているデータポイントにおける時系列的に前後するデータポイントの変位方向に基づいて、前記操作対象オブジェクトを制御するための角度を決定するにあたって、前記決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量を決定する、請求項１に記載のプログラム。
【請求項３】
前記プログラムは、前記電子装置に、
前記保持されているデータポイントにおける前記第１の軸の値の変位量及び前記第２の軸の値の変位量に基づいて、独立変数の軸として該第１の軸及び該第２の軸のいずれか一方の軸を決定するステップと、他方の軸を従属変数の軸として決定するステップと、を更に実行させ、
前記回帰直線の傾きを決定するステップは、
前記決定された独立変数の軸及び従属変数の軸に更に基づいて、回帰直線の傾きを決定する、請求項１又は２に記載のプログラム。
【請求項４】
前記いずれか一方の軸を決定するステップは、
前記保持されているデータポイントにおける、前記第１の軸の最大値と最小値の差分値及び前記第２の軸の最大値と最小値の差分値に基づいて、独立変数の軸として前記いずれか一方の軸を決定する、請求項３に記載のプログラム。
【請求項５】
前記いずれか一方の軸を決定するステップは、
前記保持されているデータポイントにおける、前記第１の軸の最大値と最小値の差分値に対して重み付けを行った値及び前記第２の軸の最大値と最小値の差分値の大きさを比較することにより、独立変数の軸として前記いずれか一方の軸を決定する、請求項３又は４に記載のプログラム。
【請求項６】
前記回転量を決定するステップは、
前記保持されているデータポイントにおける時系列的に前後する、前記決定された独立変数の軸の値の差分値の正負の数量を比較することにより、前記操作対象オブジェクトを制御するための角度を決定するにあたって、前記決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量を決定する、請求項３から５のいずれか１項に記載のプログラム。
【請求項７】
前記回帰直線の傾きを決定するステップは、
前記保持されているデータポイントにおける、独立変数の平均及び従属変数の平均を決定するステップと、
前記決定された平均を用いて、前記保持されているデータポイントにおける、独立変数の偏差及び従属変数の偏差を決定するステップと、
前記決定された独立変数の偏差を用いて、前記保持されているデータポイントにおける独立変数の分散を決定するステップと、
前記決定された独立変数の偏差及び従属変数の偏差を用いて、前記保持されているデータポイントにおける共分散を決定するステップと、
前記決定された共分散を前記決定された独立変数の分散で割ることにより回帰直線の傾きを決定するステップと、
を含む請求項３から６のいずれか１項に記載のプログラム。
【請求項８】
前記第１の軸は、前記タッチパネルのセンサが配列される方向の短手方向を示すＸ軸であり、
前記第２の軸は、前記タッチパネルのセンサが配列される方向の長手方向を示し、前記第１の軸に直交するＹ軸であり、
前記回帰直線の傾きを決定するステップは、
前記決定された独立変数の軸が前記第２の軸である場合、前記決定された共分散を前記決定された独立変数の分散で割ることにより決定された回帰直線の傾きに対応する角度を、９０度から引くことにより回帰直線の傾きを決定する、請求項７に記載のプログラム。
【請求項９】
前記第１の軸は、前記タッチパネルのセンサが配列される方向の短手方向を示すＸ軸であり、前記第２の軸は、前記タッチパネルのセンサが配列される方向の長手方向を示し、前記第１の軸に直交するＹ軸である、請求項１から８のいずれか１項に記載のプログラム。
【請求項１０】
前記角度を決定するステップは、
既定の処理時間ごとに角度を決定する、請求項１から９のいずれか１項に記載のプログラム。
【請求項１１】
請求項１０に記載のプログラムを含む、前記タッチパネルを備える前記電子装置において実行されるゲームのための一組のプログラムであって、
前記既定の処理時間は、ゲームを実行するためのフレームレートに対応する時間であり、
前記既定の処理時間ごとに決定される角度に基づいて、前記既定の処理時間ごとに角度及び大きさを決定するステップと、
前記既定の処理時間ごとに決定される角度及び大きさに基づいて、前記タッチパネルに表示される前記操作対象オブジェクトを制御するステップと、
を実行させる一組のプログラム。
【請求項１２】
請求項１０に記載のプログラムを含む、前記タッチパネルを備える前記電子装置において実行されるゲームのための一組のプログラムであって、
前記既定の処理時間は、ゲームを実行するためのフレームレートに対応する時間であり、
前記既定の処理時間ごとに決定される角度に基づいて、前記既定の処理時間ごとに角度及び大きさを決定するステップと、
前記既定の処理時間ごとに決定される角度及び大きさに基づいて、前記タッチパネルに表示されるゲーム画像を撮影するための前記操作対象オブジェクトである仮想カメラを制御するステップと、
を実行させる一組のプログラム。
【請求項１３】
タッチパネルを備える電子装置であって、
前記タッチパネルへのユーザの操作により発生したタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントを保持し、
前記保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了し、
前記保持されているデータポイントに基づいて回帰直線の傾きを決定し、
前記保持されているデータポイントの集合としての変位方向に基づいて前記決定された回帰直線の傾きを回転させる回転量を決定し、
前記決定された回帰直線の傾き及び前記決定された回転量に基づいて、前記ユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定する、
電子装置。
【請求項１４】
タッチパネルを備える電子装置において実行される方法であって、
前記タッチパネルへのユーザの操作により発生したタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントを保持するステップと、  前記保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了するステップと、
前記保持されているデータポイントに基づいて回帰直線の傾きを決定するステップと、  前記保持されているデータポイントの集合としての変位方向に基づいて前記決定された回帰直線の傾きを回転させる回転量を決定するステップと、
前記決定された回帰直線の傾き及び前記決定された回転量に基づいて、前記ユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定するステップと、
を有する方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム等に関するものであり、特にタッチパネルを備える電子装置において実行されるプログラム等に関する。
【背景技術】
【０００２】
近年のタッチパネル技術の向上に伴い、タッチパネル上のユーザインタフェースを介してユーザ入力を行う電子装置が広く普及してきた。そして、電子装置において実行されるゲームにおいては、従来型の物理的なコントローラによるユーザ入力に代えて、電子装置に備えられたタッチパネルを介してユーザ入力を行う形態が広く普及してきている。
【０００３】
特にスマートフォン等に代表される小型の携帯型電子装置の普及が急速に進み、このような携帯型電子装置上で実行されるゲームも数多くリリースされている。このような状況において、タッチパネルに表示されたプレイヤキャラクタなどの仮想オブジェクトの操作方法については、例えば非特許文献１に示すバーチャルパッドに関する技術を含め、様々な技術が提案されている。
【０００４】
例えば特許文献１には、タッチパネルを備えるゲーム装置であって、ユーザのタッチ操作に応じて原点を設定してジョイスティックを模した操作を行うことができるゲーム装置やプログラムが開示されている。当該ゲーム装置は、タッチパネルがタッチを検出していない状態から検出した状態に変化した場合に検出を開始したときの座標に基づき基準座標を設定し、その後タッチ検出を継続する場合、その後に検出した座標に基づき指示座標を設定する。そして当該ゲーム装置は、基準座標から指示座標へのベクトルの方向がジョイスティックを倒している方向、ベクトルの大きさがジョイスティックの倒し具合と認識することで、仮想ジョイスティックを実現し、仮想オブジェクトの操作を実現している。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特許第３７３４８２０号
【非特許文献】
【０００６】
【非特許文献１】Matthias Baldauf, Peter Frohlich, Florence Adegeye, and Stefan Suette. 2015. Investigating On-Screen Gamepad Designs for Smartphone-Controlled Video Games. ACM Trans. Multimedia Comput. Commun. Appl. 12, 1s, Article 22 (October 2015), 21 pages. DOI: https://doi.org/10.1145/2808202
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１に示す従来技術において、ユーザは、タッチパネル上の１箇所を指で接触してゲーム装置に基準座標を認識させ、接触したままその指をスライドさせ、スライド後の指の接触位置によりゲーム装置に指示座標を認識させる。このように構成される従来技術は、ユーザが方向を入力するとき、基準座標から指示座標まで有意な距離を生成する必要があるため、高い応答性を実現することは難しかった。例えばユーザが仮想ジョイスティックを大きく倒した操作を行いたい場合、大きく倒したジョイスティックの倒し具合に対応する基準座標から指示座標へのベクトルの大きさを生成する必要があった。
【０００８】
したがって、タッチパネルに表示された、仮想空間上に配置された仮想オブジェクトを制御する操作方法として、例えばより高速で直感的な操作方法の実現が求められている。更に一般化すると、仮想空間内に配置され、ユーザの操作対象となりうるオブジェクトである操作対象オブジェクトを制御する操作方法として、より操作性の高い操作方法の実現が求められている。
【０００９】
本発明は、このような課題を解決するためになされたものであり、仮想空間における操作対象オブジェクトを制御するにあたって、より操作性を高くすることが可能なプログラム等を提供することを主目的とする。
【課題を解決するための手段】
【００１０】
上記の目的を達成するために、本発明の一態様としてのプログラムは、タッチパネルを備える電子装置において実行されるプログラムであって、該電子装置に、前記タッチパネルへのユーザの操作により発生したタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントを保持するステップと、前記保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了するステップと、前記保持されているデータポイントに基づいて回帰直線の傾きを決定するステップと、前記保持されているデータポイントの集合としての変位方向に基づいて前記決定された回帰直線の傾きを回転させる回転量を決定するステップと、前記決定された回帰直線の傾き及び前記決定された回転量に基づいて、前記ユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定するステップと、を実行させることを特徴とする。
【００１１】
また、本発明において好ましくは、前記回転量を決定するステップは、前記保持されているデータポイントにおける時系列的に前後するデータポイントの変位方向に基づいて、前記操作対象オブジェクトを制御するための角度を決定するにあたって、前記決定された傾きに対して１８０度回転させるか否かを示す回転量を決定する。
【００１２】
また、本発明において好ましくは、記プログラムは、前記電子装置に、前記保持されているデータポイントにおける前記第１の軸の値の変位量及び前記第２の軸の値の変位量に基づいて、独立変数の軸として該第１の軸及び該第２の軸のいずれか一方の軸を決定するステップと、他方の軸を従属変数の軸として決定するステップと、を更に実行させ、前記回帰直線の傾きを決定するステップは、前記決定された独立変数の軸及び従属変数の軸に更に基づいて、回帰直線の傾きを決定する。
【００１３】
また、本発明において好ましくは、前記いずれか一方の軸を決定するステップは、前記保持されているデータポイントにおける、前記第１の軸の最大値と最小値の差分値及び前記第２の軸の最大値と最小値の差分値に基づいて、独立変数の軸として前記いずれか一方の軸を決定する。
【００１４】
また、本発明において好ましくは、前記いずれか一方の軸を決定するステップは、前記保持されているデータポイントにおける、前記第１の軸の最大値と最小値の差分値に対して重み付けを行った値及び前記第２の軸の最大値と最小値の差分値の大きさを比較することにより、独立変数の軸として前記いずれか一方の軸を決定する。
【００１５】
また、本発明において好ましくは、前記回転量を決定するステップは、前記保持されているデータポイントにおける時系列的に前後する、前記決定された独立変数の軸の値の差分値の正負の数量を比較することにより、前記操作対象オブジェクトを制御するための角度を決定するにあたって、前記決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量を決定する。
【００１６】
また、本発明において好ましくは、前記回帰直線の傾きを決定するステップは、前記保持されているデータポイントにおける、独立変数の平均及び従属変数の平均を決定するステップと、前記決定された平均を用いて、前記保持されているデータポイントにおける、独立変数の偏差及び従属変数の偏差を決定するステップと、前記決定された独立変数の偏差を用いて、前記保持されているデータポイントにおける独立変数の分散を決定するステップと、前記決定された独立変数の偏差及び従属変数の偏差を用いて、前記保持されているデータポイントにおける共分散を決定するステップと、前記決定された共分散を前記決定された独立変数の分散で割ることにより回帰直線の傾きを決定するステップと、を含む。
【００１７】
また、本発明において好ましくは、前記第１の軸は、前記タッチパネルのセンサが配列される方向の短手方向を示すＸ軸であり、前記第２の軸は、前記タッチパネルのセンサが配列される方向の長手方向を示し、前記第１の軸に直交するＹ軸であり、前記回帰直線の傾きを決定するステップは、前記決定された独立変数の軸が前記第２の軸である場合、前記決定された共分散を前記決定された独立変数の分散で割ることにより決定された回帰直線の傾きに対応する角度を、９０度から引くことにより回帰直線の傾きを決定する。
【００１８】
また、本発明において好ましくは、前記第１の軸は、前記タッチパネルのセンサが配列される方向の短手方向を示すＸ軸であり、前記第２の軸は、前記タッチパネルのセンサが配列される方向の長手方向を示し、前記第１の軸に直交するＹ軸である。
【００１９】
また、本発明において好ましくは、前記角度を決定するステップは、既定の処理時間ごとに角度を決定する。
【００２０】
また、上記の目的を達成するために、本発明の一態様としての一組のプログラムは、上記のプログラムを含む、前記タッチパネルを備える前記電子装置において実行されるゲームのための一組のプログラムであって、前記既定の処理時間は、ゲームを実行するためのフレームレートに対応する時間であり、前記既定の処理時間ごとに決定される角度に基づいて、前記既定の処理時間ごとに角度及び大きさを決定するステップと、前記既定の処理時間ごとに決定される角度及び大きさに基づいて、前記タッチパネルに表示される前記操作対象オブジェクトを制御するステップと、を実行させることを特徴とする。
【００２１】
また、上記の目的を達成するために、本発明の一態様としての一組のプログラムは、上記のプログラムを含む、前記タッチパネルを備える前記電子装置において実行されるゲームのための一組のプログラムであって、前記既定の処理時間は、ゲームを実行するためのフレームレートに対応する時間であり、前記既定の処理時間ごとに決定される角度に基づいて、前記既定の処理時間ごとに角度及び大きさを決定するステップと、前記既定の処理時間ごとに決定される角度及び大きさに基づいて、前記タッチパネルに表示されるゲーム画像を撮影するための前記操作対象オブジェクトである仮想カメラを制御するステップと、を実行させることを特徴とする。
【００２２】
また、上記の目的を達成するために、本発明の一態様としての電子装置は、タッチパネルを備える電子装置であって、前記タッチパネルへのユーザの操作により発生したタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントを保持し、前記保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了し、前記保持されているデータポイントに基づいて回帰直線の傾きを決定し、前記保持されているデータポイントの集合としての変位方向に基づいて前記決定された回帰直線の傾きを回転させる回転量を決定し、前記決定された回帰直線の傾き及び前記決定された回転量に基づいて、前記ユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定する、ことを特徴とする。
【００２３】
また、上記の目的を達成するために、本発明の一態様としての方法は、タッチパネルを備える電子装置において実行される方法であって、前記タッチパネルへのユーザの操作により発生したタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントを保持するステップと、前記保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了するステップと、前記保持されているデータポイントに基づいて回帰直線の傾きを決定するステップと、前記保持されているデータポイントの集合としての変位方向に基づいて前記決定された回帰直線の傾きを回転させる回転量を決定するステップと、前記決定された回帰直線の傾き及び前記決定された回転量に基づいて、前記ユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定するステップと、を有することを特徴とする。
【発明の効果】
【００２４】
本発明によれば、仮想空間における操作対象オブジェクトを制御するにあたって、より操作性を高くすることができる。
【図面の簡単な説明】
【００２５】
【図１】本発明の一実施形態による電子装置のハードウェア構成を示すブロック図である。
【図２】本発明の一実施形態による電子装置の機能ブロック図である。
【図３】本実施形態の第１の軸及び第２の軸からなる座標軸を示す図である。
【図４】角度決定部が決定する角度と角度に対応する方向の一例を説明する図である。
【図５】時間ｔ１におけるデータポイントバッファが保持するデータポイントの一例を示す図である。
【図６】時間ｔ１におけるデータポイントバッファが保持するデータポイントの一例を示す図である。
【図７】図５に示すデータポイントの集合から求めた回帰直線を示す図である。
【図８】図７に示す回帰直線の傾きを用いて関数ａｏｐ（ｘ，ｙ）が算出した角度を示す図である。
【図９】時間ｔ２におけるデータポイントバッファが保持するデータポイントの一例を示す図である。
【図１０】図９に示す回帰直線の傾きを用いて関数ａｏｐ（ｘ，ｙ）が算出した角度を示す図である。
【図１１】時間ｔ３におけるデータポイントバッファが保持するデータポイントの一例を示す図である。
【図１２】時間ｔ３におけるデータポイントバッファが保持するデータポイントの一例を示す図である。
【図１３】図１１に示すデータポイントの集合から求めた回帰直線及び該回帰直線の傾きを用いて関数ａｏｐ（ｘ，ｙ）が算出した角度を示す図である。
【図１４】時間ｔ４におけるデータポイントバッファが保持するデータポイントの一例を示す図である。
【図１５】時間ｔ４におけるデータポイントバッファが保持するデータポイントの一例を示す図である。
【図１６】図１４に示すデータポイントの集合から求めた回帰直線を示す図である。
【図１７】図１６に示す回帰直線の傾きを用いて関数ａｏｐ（ｘ，ｙ）が算出した角度を示す図である。
【図１８】本発明の一実施形態による電子装置がデータポイントの集合から仮想キャラクタを制御する様子を示す図である。
【図１９】本発明の一実施形態による角度決定部の情報処理のフローチャートを示す図である。
【図２０】本発明の一実施形態による電子装置が表示する画像を撮影する仮想空間内に配置された仮想カメラを示す図である。
【発明を実施するための形態】
【００２６】
以下、図面を参照して、本発明の実施形態を説明する。各図において同一の符号は、特に言及が無い限り同一又は相当部分を示すものとし、説明の便宜上、図面の縦横の縮尺を実際のものとは異なるように表す場合がある。また、説明の便宜上、必要以上に詳細な説明は省略する場合がある。例えば、既によく知られた事項の詳細説明や実質的に同一の構成についての重複説明を省略する場合がある。
【００２７】
本発明の一実施形態による電子装置１０は、仮想空間に配置された仮想的なオブジェクトをユーザに提示し、ゲームを進行するゲームアプリケーションがインストールされている。本実施形態の電子装置１０は、当該ゲームアプリケーションが実行されると、ユーザの操作に応じて、仮想空間内のユーザの操作対象の仮想的なオブジェクトである操作対象オブジェクトを制御するための仮想的なコントローラ（仮想コントローラ）を提供する。仮想空間は、当該ゲームアプリケーションにより定められるものであり、２次元空間であることもできるし、３次元空間であることもできる。例えば、仮想的なオブジェクトは、仮想空間に配置されたキャラクタ又はアイテムである。例えば、操作対象オブジェクトの制御とは、仮想空間に配置されたキャラクタ又はアイテムの動作の制御である。
【００２８】
説明の便宜上、本実施形態においては、電子装置１０には上記のようなゲームアプリケーションがインストールされているものとするが、これに限定されない。電子装置１０は、ユーザの操作に応じて、操作対象オブジェクトを制御することが可能なアプリケーションを実装していればよい。例えば、電子装置１０には、ゲームアプリケーションの代わりに又はこれに追加して、ユーザの操作に応じて操作対象オブジェクトを動作させる入力支援アプリケーション又はシミュレーションアプリケーションが実装されてもよい。本実施形態の電子装置１０が提供する仮想コントローラは、ユーザの入力として方向と大きさが必要な入力に用いることができる。以下の説明において、アプリケーションは、アプリケーションプログラム全般を意味するものであり、スマートフォンやタブレット端末にインストールされるアプリを意味することができる。
【００２９】
図１は本発明の一実施形態による電子装置１０のハードウェア構成を示すブロック図である。電子装置１０は、プロセッサ１１、入力装置１２、表示装置１３、記憶装置１４、及び通信装置１５を備える。これらの各構成装置はバス１６によって接続される。なお、バス１６と各構成装置との間には必要に応じてインタフェースが介在しているものとする。本実施形態において、電子装置１０はスマートフォンである。ただし、電子装置１０は、上記の構成を備えるものであれば、タブレット型コンピュータ、タッチパッド等の接触型入力装置を備えるコンピュータなどの端末とすることができる。
【００３０】
プロセッサ１１は、電子装置１０全体の動作を制御する。例えばプロセッサ１１は、ＣＰＵである。なお、プロセッサ１１としては、ＭＰＵ等の電子回路が用いられてもよい。プロセッサ１１は、記憶装置１４に格納されているプログラムやデータを読み込んで実行することにより、様々な処理を実行する。１つの例では、プロセッサ１１は、複数のプロセッサから構成される。
【００３１】
入力装置１２は、電子装置１０に対するユーザからの入力を受け付けるユーザインタフェースであり、例えば、タッチパネル、タッチパッド、キーボード、又はマウスである。表示装置（ディスプレイ）１３は、プロセッサ１１の制御に従って、アプリケーション画面などを電子装置１０のユーザに表示する。本実施形態においては、スマートフォンである電子装置１０は入力装置１２としてタッチパネル１７を備え、タッチパネル１７は表示装置１３としても機能し、入力装置１２と表示装置１３は一体となった構造である。本実施形態のタッチパネル１７は、投影型静電容量方式タッチパネルであるが、同等の機能を有するデバイスがあれば、それを用いてもよい。
【００３２】
記憶装置１４は、揮発性メモリであるＲＡＭ及び不揮発性メモリであるＲＯＭを含む、一般的なスマートフォンが備える記憶装置である。記憶装置１４は、外部メモリを含むこともできる。記憶装置１４は、ゲームアプリケーションを含む各種プログラムを記憶する。例えば、記憶装置１４は、オペレーティングシステム（ＯＳ）、ミドルウェア、アプリケーションプログラム、これらのプログラムの実行に伴って参照され得る各種データなどを格納する。
【００３３】
１つの例では、記憶装置１４は、主記憶装置及び補助記憶装置を含む。主記憶装置は、情報の高速な読み書きが可能な揮発性の記憶媒体であり、プロセッサ１１が情報を処理する際の記憶領域及び作業領域として用いられる。補助記憶装置は、様々なプログラムや、各プログラムの実行に際してプロセッサ１１が使用するデータを格納する。補助記憶装置は、例えばハードディスク装置であるが、情報を格納できるものであればいかなる不揮発性ストレージ又は不揮発性メモリであってもよく、着脱可能なものであっても構わない。
【００３４】
通信装置１５は、ネットワークを介してサーバなどの他のコンピュータとの間でデータの授受を行う。例えば通信装置１５は、移動体通信や無線ＬＡＮ等の無線通信を行い、ネットワークへ接続する。１つの例では、電子装置１０は、通信装置１５によってプログラムをサーバからダウンロードして、記憶装置１４に格納する。ただし、通信装置１５は既知の有線通信を行ってもよい。他のコンピュータとの間でデータの送受信を行わない場合、電子装置１０は通信装置１５を備えなくてもよい。
【００３５】
図２は本発明の一実施形態による電子装置１０の機能ブロック図である。電子装置１０は、入力部２１、表示部２２、及び制御部２３を備える。制御部２３は、角度決定部２４、状態決定部２５、及びアプリケーション部２６を備える。本実施形態においては、プログラムがプロセッサ１１により実行されることによりこれらの機能が実現される。例えば実行されるプログラムは、記憶装置１４に記憶されている又は通信装置１５を介して受信したプログラムである。このように、各種機能がプログラム読み込みにより実現されるため、１つのパート（機能）の一部又は全部を他のパートが有していてもよい。ただし、各機能の一部又は全部を実現するための電子回路等を構成することによりハードウェアによってもこれらの機能は実現してもよい。
【００３６】
入力部２１は、入力装置１２を用いて構成されるものであり、電子装置１０に対するユーザからの入力を受け付ける。本実施形態では、入力部２１は、タッチパネル１７へのユーザのタッチ操作を受け付けてタッチイベントを発生するものであり、タッチパネル１７を備えるスマートフォンが一般的に有しているタッチ検出機能を用いることができる。
【００３７】
表示部２２は、ゲームアプリケーション画面を表示装置１３に表示し、ユーザ操作に応じた画面を表示する。
【００３８】
制御部２３は、仮想コントローラを実現するものである。本実施形態では、制御部２３は３層構造のアーキテクチャを採用し、角度決定部２４、状態決定部２５、及びアプリケーション部２６が各層に対応する。例えば制御部２３は、各層に対応する各プログラムにより構成される一組のプログラムがプロセッサ１１により実行されることにより実現される。
【００３９】
制御部２３が実現する仮想コントローラにおける角度決定部２４の役割は、物理的なコントローラにおけるコントローラ内部のセンサＩＣチップに対応する。角度決定部２４は、主として、タッチパネル１７へのユーザのタッチ操作により発生したタッチイベントを用いてユーザが仮想空間内の操作対象オブジェクトを制御するための角度を決定し、状態決定部２５へ送出する。
【００４０】
状態決定部２５の役割は、物理的なコントローラにおける操作するコントローラ全体に対応する。状態決定部２５は、主として、角度決定部２４から送出された角度を用いて、タッチパネル１７上のユーザのタッチ操作に対応するベクトル（角度及び大きさ）を決定し、アプリケーション部２６へ送出する。
【００４１】
アプリケーション部２６は、ゲーム内の動作等を実装する、具体的なゲームアプリケーションに対応する。ゲームアプリケーションは、一般的なゲームアプリケーションと同様にして、フレームレートが定められ、例えばフレームレートに対応する時間ごとに、メインプログラムのメインループを処理する。フレームレートは、一般的に３０ｆｐｓ（フレーム毎秒）又は６０ｆｐｓである。
【００４２】
角度決定部２４は、ユーザが仮想空間内の操作対象オブジェクトを制御するために必要な角度を決定する。１つの好適な例では、角度決定部２４は、リアルタイムに角度を計算する数学関数ライブラリであり、かつ短時間のタッチイベントの列からの角度計算を行う、統計処理アルゴリズムを実装する、ソフトウェアモジュールである。タッチイベントの列は、タッチパネル１７上の指の動きに対応するものである。
【００４３】
記憶装置１４は、データポイントバッファを含む。データポイントバッファは、角度決定部２４がタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントを保持するためのバッファである。
【００４４】
角度決定部２４は、タッチパネル１７へのユーザの操作により発生したタッチイベントに基づいて取得される第１の軸の値及び第２の軸の値により示されるデータポイントをデータポイントバッファに保持する。ここで、タッチイベントは、ユーザがタッチパネル１７へ指を接触したとき(touchstart)、ユーザがタッチパネル１７に指を接触させたまま動かしたとき(touchmove)、ユーザがタッチパネル１７から指を離したとき(touchend)などに発生する。角度決定部２４は、タッチイベントが発生するときに、タッチイベントを取得する。角度決定部２４は、タッチイベントを取得するとき、タッチパネル１７上の静電容量が変化した位置に対応する、２つの変数からなる数値の組（ｘ、ｙ）を取得するとともに、（ｘ、ｙ）を取得した時間ｔを取得し、３つの変数からなる数値の組（ｘ、ｙ、ｔ）をデータポイントバッファに格納する。当該２つの変数からなる数値の組のデータは、タッチイベントに付随して角度決定部２４が取得するものであり、第１の軸の値及び第２の軸の値により示されるデータポイントに対応するものである。ｔは（ｘ、ｙ）を取得した時間であるデータポイント取得時間を表す値であり、上記のように（ｘ、ｙ）と対応付けられてデータポイントバッファに格納される。１つの例では、ｔは、ＯＳから取得可能な、いわゆるＵＮＩＸ(登録商標)時間と呼ばれる整数値であるか、又は”2017/07/14 15:48:43.444”のような文字列である。以下、特に言及が無い限り、角度決定部２４がデータポイントを保持する（又は保持を終了する）ことは、該データポイントに対応付けられたデータポイント取得時間ｔを保持する（又は保持を終了する）ことを含む。
【００４５】
本実施形態では、説明の便宜上、第１の軸及び第２の軸を以下のとおり定める。図３は、本実施形態の第１の軸及び第２の軸からなる座標軸を示す図である。第１の軸は、タッチパネル１７のセンサが配列される方向に実質的に平行な方向のうちの短手方向を示す軸であり、タッチパネル１７の短辺と実質的に平行な横軸（ｘ軸）である。第２の軸は、第１の軸に直交し、タッチパネル１７のセンサが配列される方向に実質的に平行な方向のうちの長手方向を示す軸であり、タッチパネル１７の長辺と実質的に平行な縦軸（ｙ軸）である。このように、第１の軸及び第２の軸は、タッチパネル１７のセンサが配列される方向に実質的に平行であり、タッチパネル１７上の位置は、２つの軸により座標（ｘ、ｙ）として表される。したがって、本実施形態では、データポイントの座標（ｘ、ｙ）は、タッチパネル１７上の位置に対応する。本実施形態では、角度決定部２４は、当該座標（ｘ、ｙ）を、データポイントとしてデータポイントバッファに保持する。図３に示す座標設定は、一例であり、タッチパネル１７のセンサ配列や電子装置１０が実装するプログラムにより、上記例示と異なるように設定することができる。なお、センサは、例えば電極である。
【００４６】
図４は、図３に示すように座標軸が定められた場合の、角度決定部２４が決定する角度と角度に対応する方向の一例を説明する図である。第一象限の角度３１は方向３２に対応し、第二象限の角度３３は方向３４に対応し、第四象限の角度３５は方向３６に対応する。ここで、方向３４と方向３６の傾きは同じであるが、方向の向きが逆であるため、角度３３と角度３５は１８０度異なることが確認できる。
【００４７】
角度決定部２４は、データポイントバッファに保持されているデータポイントのうち既定の保持時間を超えたデータポイントの保持を終了する。例えば、角度決定部２４は、データポイントのデータの保持を終了する場合、該データを削除してもよいし、該データを無効化してもよいし、又は該データに保持を終了したことを示すフラグを関連付けて適宜削除するようにしてもよい。角度決定部２４は、データポイントバッファに格納するデータポイントの寿命をミリ秒で指定する変数Ｄを定める。変数Ｄにより指定される時間が既定の保持時間に対応する。ただし、変数Ｄの値はミリ秒に限定されない。
【００４８】
例えば、角度決定部２４は、１つのデータポイントをデータポイントバッファに格納すると、該データポイントの格納されてからの経過時間を監視し、継続的に変数Ｄと比較する。角度決定部２４は、監視したデータポイントの経過時間が変数Ｄを超えたとき、該データポイントをデータポイントバッファの保持を終了する。このようにして、角度決定部２４は、データポイントバッファが保持するすべてのデータポイントの各々の寿命を管理する。このとき、角度決定部２４は、データポイント取得時間ｔを用いて、経過時間を算出することができる。なお、変数Ｄを超えたと判断したときは、変数Ｄ以上と判断したときを意味することができるものとする。また、角度決定部２４が管理するデータポイントの経過時間の単位は、変数Ｄと同じであることが好ましい。
【００４９】
例えば、変数Ｄに１６５が設定されたとき、角度決定部２４は、データポイントバッファに格納したデータポイントを１６５ミリ秒だけ保持し、１６５ミリ秒が経過すると、該データポイントをデータポイントバッファの保持を終了する。
【００５０】
角度決定部２４は、定期的に角度を算出できるか否かを判定する。角度決定部２４は、角度を算出可能な場合、データポイントバッファが保持するデータポイントを用いて、該データポイントの集合が示す角度を算出し、ユーザが仮想空間内の操作対象オブジェクトを制御するための角度として決定する。このように、角度決定部２４は、データポイントの集合が示す角度を求めることにより、タッチパネル１７に対してタッチ操作を行ったユーザが意図する方向の角度を求めることが可能となる。
【００５１】
角度決定部２４は、決定した角度を状態決定部２５へ出力する。角度決定部２４は、決定した角度を状態決定部２５へ出力するとき、例えばangleイベントを示す情報とともに出力する。角度決定部２４は、状態決定部２５へ直接出力せずに、状態決定部２５が参照する記憶装置１４内のメモリ領域に決定した角度やangleイベントを示す情報を格納してもよい。
【００５２】
角度決定部２４は、取得したタッチイベントがtouchstartのとき、startイベントを状態決定部２５へ出力し、角度を算出しない。角度決定部２４は、取得したタッチイベントがtouchendのとき、stopイベントを状態決定部２５へ出力し、角度を算出しない。
【００５３】
角度決定部２４は、変数Ｂを定め、データポイントバッファが保持するデータポイントの個数が変数Ｂの数以上であった場合、該データポイントを用いて角度を算出し、決定する。角度決定部２４は、データポイントバッファが保持するデータポイントの個数が変数Ｂの数未満であった場合、データポイントの集合が示す角度を一定の精度以上で算出することが不可能であるため、keepイベントを状態決定部２５へ出力し、角度を算出しない。一般的には、回帰直線の傾きを求めるにあたっては３個以上のデータポイントが有ること好ましいため、変数Ｂは３以上に設定されるのが好ましい。本実施形態では、変数Ｂは３に設定される。
【００５４】
角度決定部２４は、角度決定部２４が角度を算出できるか否かを判定する時間の間隔をミリ秒で指定する変数Ｉを定める。タッチイベントが発生し続ける場合など、角度決定部２４が角度を算出可能な場合が継続する場合、当該間隔は、角度決定部２４が角度を算出する時間の間隔となる。ただし、変数Ｉの値はミリ秒に限定されない。
【００５５】
角度決定部２４は、上記のように既定の処理時間ごとに角度算出可否について判定し、既定の処理時間ごとに角度を決定する。１つの好適な例では、既定の処理時間は、ゲームを実行するためのフレームレートに対応する時間である。フレームレートが３０ｆｐｓ（３０Ｈｚ）の場合、変数Ｉは３３に設定される。変数Ｉに３３が設定されたとき、角度決定部２４は、３３ミリ秒に１回角度を算出できるか判定し、角度を算出可能な場合は算出した角度を決定し、決定した角度をangleイベントとともに状態決定部２５へ出力する。算出不可能な場合、角度決定部２４は、startイベント、stopイベント、又はkeepイベントのいずれか１つを状態決定部２５へ出力する。なお、angleイベントは角度を示す情報を含むことができ、この場合、角度決定部２４は、角度を算出可能な場合、angleイベントを状態決定部２５へ出力する。
【００５６】
データポイントバッファが保持するデータポイントの集合が示す角度を算出するにあたって、角度決定部２４は、データポイントバッファに保持されているデータポイントに基づいて回帰直線の傾きを決定する。ここで、角度決定部２４が参照するデータポイントの個数は、３以上である。角度決定部２４は、回帰直線の傾きを決定するにあたって、データポイントバッファに保持されているデータポイントにおけるｘ軸の値の変位量及びｙ軸の値の変位量に基づいて、独立変数の軸としてｘ軸及びｙ軸のいずれか一方の軸を決定する。同時に、角度決定部２４は、他方の軸を従属変数の軸として決定する。
【００５７】
本実施形態では、角度決定部２４は、最小二乗法を用いて回帰直線の傾きを算出する。最小二乗法を用いて回帰直線の傾きを求める方法は既知であるが、当該方法は独立変数と従属変数の関係の強さを傾きとして求めるものである。最小二乗法は、ｘ軸を独立変数の軸とし、ｙ軸を従属変数の軸として適用するのが一般的であるが、ｘ軸の値が固定されてｙ軸の値のみが変化する場合、従属変数が独立変数に一切の従属性を持たないことになる。また、ｙ軸に沿った傾きを決定する場合、決定される傾きは、例えばｙ軸をまたいで大きなマイナスの値から大きなプラスの値となることがあり、安定して傾きを出すことが難しい。そのため、角度決定部２４は、ｘ軸の値とｙ軸の値のどちらが独立変数として適切であるかを判定し、決定された独立変数の軸及び従属変数の軸に基づいて最小二乗法を用いて回帰直線の傾きを決定する。
【００５８】
角度決定部２４は、独立変数の軸をｘ軸とするとき、ｙ＝ａｘ＋ｂの回帰直線の傾きａを決定し、独立変数の軸をｙ軸とするとき、ｘ＝ｃｙ＋ｄの回帰直線の傾きｃを決定する。具体的には、角度決定部２４は、以下の（ａ）〜（ｅ）により回帰直線の傾きを求める。
（ａ）角度決定部２４は、データポイントバッファに保持されているデータポイントにおける、独立変数の平均及び従属変数の平均を算出（決定）する。
（ｂ）角度決定部２４は、（ａ）で決定された平均を用いて、データポイントバッファに保持されているデータポイントにおける、独立変数の偏差及び従属変数の偏差を算出（決定）する。
（ｃ）角度決定部２４は、（ｂ）で決定された独立変数の偏差を用いて、データポイントバッファに保持されているデータポイントにおける独立変数の分散を算出（決定）する。
（ｄ）角度決定部２４は、（ｂ）で決定された独立変数の偏差及び従属変数の偏差を用いて、データポイントバッファに保持されているデータポイントにおける共分散を算出（決定）する。
（ｅ）角度決定部２４は、（ｄ）で決定された共分散を（ｃ）で決定された独立変数の分散で割ることにより回帰直線の傾きを算出（決定）する。
【００５９】
１つの例では、角度決定部２４は、データポイントバッファに保持されているデータポイントにおけるｘ軸の値の最大値と最小値の差分値及びｙ軸の値の最大値と最小値の差分値に基づいて、独立変数の軸としてｘ軸及びｙ軸のいずれか一方の軸を決定し、他方の軸を従属変数の軸として決定する。好ましくは、角度決定部２４は、データポイントバッファに保持されているデータポイントにおけるｘ軸の値の最大値と最小値の差分値に対して重み係数を用いて重み付けを行った値及びｙ軸の値の最大値と最小値の差分値に基づいて、独立変数の軸としてｘ軸及びｙ軸のいずれか一方の軸を決定し、他方の軸を従属変数の軸として決定する。
【００６０】
角度決定部２４は、上記のように最小二乗法を用いて回帰直線の傾きを算出（決定）する。好ましくは、角度決定部２４が回帰直線の傾きを算出することは、角度決定部２４が回帰直線の傾きの角度を算出することを意味する。ここで、算出される回帰直線の傾きは正負の方向を持たないため、角度決定部２４は、最小二乗法を用いて回帰直線の傾きを算出する際、例えば０度〜９０度及び２７０度〜３６０度の範囲内で算出する。したがって、例えばデータポイントの集合が示す角度が、４５度の場合であっても２２５度の場合であっても、回帰直線の傾きとして４５度が算出される。そのため、角度決定部２４は、回帰直線の傾きを決定した後、データポイントバッファに保持されているデータポイントの集合としての変位方向に基づいて、決定された回帰直線の傾きを回転させる回転量を決定する。具体的には、角度決定部２４は、回帰直線の傾きを決定した後、ユーザが操作対象オブジェクトを制御するための角度を決定するにあたって、決定された回帰直線の傾き（の角度）に対して１８０度回転させるか否かを示す回転量を決定する。ここで、データポイントの集合としての変位方向は、データポイントが時間とともに変位する方向を示すものであり、例えばユーザがタッチパネル１７上で指を動かす大まかな方向に対応するものである。
【００６１】
１つの例では、角度決定部２４は、データポイントバッファに保持されているデータポイントにおいて時系列的に前後するデータポイントの変位方向に基づいて、回転量を決定する。好ましくは、角度決定部２４は、データポイントバッファに保持されているデータポイントにおける時系列的に前後する、決定された独立変数の軸の値の差分値の正負の数量を比較することにより、回転量を決定する。決定される回転量は、決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量である。
【００６２】
角度決定部２４は、データポイントバッファが先に格納されたデータポイントから順番にデータポイントを保持するように、各データポイントを格納する。或いは、角度決定部２４は、データポイントバッファにデータポイントを格納するとき、格納された順番が識別可能な識別情報を関連付けて格納する。このように、角度決定部２４は、格納された順番が識別できるように、すなわち格納されたデータポイントの時系列順が識別できるように、データポイントバッファにデータポイントを保持している。このとき、角度決定部２４は、データポイント取得時間ｔの値を用いることができる。
【００６３】
角度決定部２４は、決定された回帰直線の傾き及び決定された回転量に基づいて、データポイントの集合が示す角度を算出し、ユーザが仮想空間内の操作対象オブジェクトを制御するための角度として決定する。
【００６４】
本実施形態では、上記の角度決定部２４が行う、回帰直線の傾きの決定、回転量の決定、及び角度の決定について、式（１）に示す関数ａｏｐ（ｘ，ｙ）を用いて実現する。関数ａｏｐ（ｘ，ｙ）は、０〜３６０度の実数で角度を算出する。関数ａｏｐ（ｘ，ｙ）が角度を算出するとき、データポイントバッファはｎ個のデータポイントＰ（ｘ，ｙ）を保持しているものとする。また、ｎ個の各データポイントＰk（ｋ＝１〜ｎ）のｘ座標の値及びｙ座標の値は、Ｐk（ｘk，ｙk）で表され、Ｐ1（ｘ1，ｙ1）、Ｐ2（ｘ2，ｙ2）、…、Ｐn（ｘn，ｙn）の順番に格納された時間が早いものとする。
2019200765.tif 000003
（１）
関数ａｏｐ（ｘ，ｙ）は、場合分けをするため、関数ｒｏｔａｔｅ（ｘ，ｙ）、関数ｌｅｆｔ（ｘ）、関数ｄｏｗｎ（ｙ）を使用する。最初に、関数ａｏｐ（ｘ，ｙ）は、関数ｒｏｔａｔｅ（ｘ，ｙ）を用いて、ｘとｙのいずれか一つを独立変数として決定する。
【００６５】
関数ｒｏｔａｔｅ（ｘ，ｙ）は、式（２）により定められる。
2019200765.tif 000004
（２）
関数ｒｏｔａｔｅ（ｘ，ｙ）は、ｎ個のデータポイントＰ（ｘ，ｙ）が主にｙ軸方向に変位しているか否かを判定し、例えば真偽値を返す。ｎ個のデータポイントＰ（ｘ，ｙ）が主にｙ軸方向に変位している場合とは、例えばタッチパネル１７上でユーザの指が主として上下方向に動いた場合である。このようにして、関数ｒｏｔａｔｅ（ｘ，ｙ）は、ｎ個のデータポイントＰ（ｘ，ｙ）が主にｘ軸（左右）方向に変位しているか又は主にｙ軸（上下）方向に変位しているかを判定し、ｘ軸の値とｙ軸の値のどちらが独立変数として適切であるかを判定する。
【００６６】
式（２）において、（ｍａｘ（ｘ）―ｍｉｎ（ｘ））は、ｎ個のデータポイントＰのｘの値（ｘ1，ｘ2，…ｘn）における最大値と最小値の差分の絶対値であり、ｎ個のデータポイントＰのｘ軸方向の変位量を示す。同様にして、（ｍａｘ（ｙ）―ｍｉｎ（ｙ））は、ｎ個のデータポイントＰのｙの値（ｙ1，ｙ2，…ｙn）における最大値と最小値の差分の絶対値であり、ｎ個のデータポイントＰのｙ軸方向の変位量を示す。変数ｗは、（ｍａｘ（ｘ）―ｍｉｎ（ｘ））に対して重み付けを行う重み係数である。
【００６７】
関数ｒｏｔａｔｅ（ｘ，ｙ）は、（ｍａｘ（ｙ）―ｍｉｎ（ｙ））が（ｍａｘ（ｘ）―ｍｉｎ（ｘ））と変数ｗとの積の値よりも大きいときに不等号を満たし、関数ａｏｐ（ｘ，ｙ）は、座標変換を行う。この場合、関数ａｏｐ（ｘ，ｙ）は、ｙ軸を独立変数の軸とし、ｘ軸を従属変数の軸とし、更に関数ｄｏｗｎ（ｙ）を用いて、回転量を決定する。一方、関数ｒｏｔａｔｅ（ｘ，ｙ）は、（ｍａｘ（ｙ）―ｍｉｎ（ｙ））が（ｍａｘ（ｘ）―ｍｉｎ（ｘ））と変数ｗとの積の値以下のときに不等号を満たさず、関数ａｏｐ（ｘ，ｙ）は、座標変換を行わない。この場合、関数ａｏｐ（ｘ，ｙ）は、ｘ軸を独立変数の軸とし、ｙ軸を従属変数の軸とすし、更に関数ｌｅｆｔ（ｘ）を用いて、回転量を決定する。
【００６８】
関数ｒｏｔａｔｅ（ｘ，ｙ）が変数ｗにより重み付けされない場合、ｙ軸方向の変位量がｘ軸方向の変位量よりもわずかに大きいと、関数ａｏｐ（ｘ，ｙ）は座標変換を行うこととなる。変数ｗを用いて重み付けすることにより、関数ａｏｐ（ｘ，ｙ）は、ｎ個のデータポイントＰ（ｘ，ｙ）がよりｙ軸に沿った傾きの場合に座標変換を行うようにすることが可能となる。
【００６９】
例えばスマートフォンは縦持ちで使用されることが多いため、図３に示すタッチパネル１７のｙ軸は重力方向と実質的に平行となることが多い。タッチパネル１７のｙ軸方向の寸法はｘ軸方向の寸法より大きいことを考慮すると、変数ｗは１より大きい値とすることが好ましい。例えば、変数ｗは２とすることが好ましい。他の例では、スマートフォンが横持ちされ、かつゲームアプリが備えるゲームエンジンが縦横の座標の変換をしない場合、角度決定部２４はｗを０．５などの１より小さい値に決定する。
【００７０】
関数ｌｅｆｔ（ｘ）は、式（３）により表される。
2019200765.tif 000005
（３）
関数ｌｅｆｔ（ｘ）は、関数ｒｏｔａｔｅ（ｘ，ｙ）が不等号を満たさない場合、ｎ個のデータポイントＰ（ｘ，ｙ）の変位方向が−ｘ軸方向（左方向）か否かを判定し、例えば真偽値を返す。具体的には、関数ｌｅｆｔ（ｘ）は、ｎ個のデータポイントＰのｘの値（ｘ1，ｘ2，…ｘn）における時系列的に前後する値の差分値（ｘ2−ｘ1，ｘ3−ｘ2，…ｘn−ｘn-1）を算出する。関数ｌｅｆｔ（ｘ）は、差分値がマイナスとなる個数が、差分値がプラスとなる個数より多いか否かを判定することにより、ｎ個のデータポイントＰ（ｘ，ｙ）の変位方向が−ｘ軸方向（左方向）か否かを判定する。このようにして、関数ｌｅｆｔ（ｘ）は、ｎ個のデータポイントＰ（ｘ，ｙ）の変位方向が−ｘ軸方向（左方向）か＋ｘ軸方向（右方向）であるかを判定し、決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量を決定する。例えば、関数ｌｅｆｔ（ｘ）が真である場合、関数ａｏｐ（ｘ，ｙ）は回転量を１８０度と決定し、関数ｌｅｆｔ（ｘ）が偽である場合、関数ａｏｐ（ｘ，ｙ）は回転量を０度と決定する。
【００７１】
関数ｄｏｗｎ（ｙ）は、式（４）により表される。
2019200765.tif 000006
（４）
関数ｄｏｗｎ（ｙ）は、関数ｒｏｔａｔｅ（ｘ，ｙ）が不等号を満たす場合、ｎ個のデータポイントＰ（ｘ，ｙ）の変位方向が−ｙ軸方向（下方向）か否かを判定し、例えば真偽値を返す。具体的には、関数ｄｏｗｎ（ｙ）は、ｎ個のデータポイントＰのｙの値（ｙ1，ｙ2，…ｙn）における時系列的に前後する値の差分値（ｙ2−ｙ1，ｙ3−ｙ2，…ｙn−ｙn-1）を算出する。関数ｄｏｗｎ（ｙ）は、差分値がマイナスとなる個数が、差分値がプラスとなる個数より多いか否かを判定することにより、ｎ個のデータポイントＰ（ｘ，ｙ）の変位方向が−ｙ軸方向（下方向）か否かを判定する。このようにして、関数ｄｏｗｎ（ｙ）は、ｎ個のデータポイントＰ（ｘ，ｙ）の変位方向が−ｙ軸方向（下方向）か＋ｙ軸方向（上方向）であるかを判定し、決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量を決定する。例えば、関数ｄｏｗｎ（ｙ）が真である場合、関数ａｏｐ（ｘ，ｙ）は回転量を１８０度と決定し、関数ｄｏｗｎ（ｙ）が偽である場合、関数ａｏｐ（ｘ，ｙ）は回転量を０度と決定する。
【００７２】
関数ａｏｐ（ｘ，ｙ）は、上記のように、独立変数（独立変数の軸）及び回転量を決定した後、最小二乗法を用いて傾きを算出する。関数ａｏｐ（ｘ，ｙ）は、ｘを独立変数とし、ｙを従属変数とする場合、ｙ＝ａｘ＋ｂの回帰直線の傾きａは、式（５）により算出している。
2019200765.tif 000007
（５）
ここで、
2019200765.tif 000008
は、ｘ（独立変数）の平均であり、
2019200765.tif 000009
は、ｙ（従属変数）の平均であり、
2019200765.tif 000010
は、ｘ（独立変数）とｙ（従属変数）の共分散であり、
2019200765.tif 000011
は、ｘ（独立変数）の分散である。
【００７３】
なお、関数ａｏｐ（ｘ，ｙ）は、ｙを独立変数とし、ｘを従属変数とする場合、ｘ＝ｃｘ＋ｄの回帰直線の傾きｃは、式（６）により算出している。
2019200765.tif 000012
（６）
ここで、
2019200765.tif 000013
は、ｘ（従属変数）の平均であり、
2019200765.tif 000014
は、ｙ（独立変数）の平均であり、
2019200765.tif 000015
は、ｘ（従属変数）とｙ（独立変数）の共分散であり、
2019200765.tif 000016
は、ｙ（独立変数）の分散である。
【００７４】
角度決定部２４は、変数Ｖを定め、独立変数の分散がＶ以上であった場合、関数ａｏｐ（ｘ，ｙ）を用いて角度を算出し、決定する。角度決定部２４は、独立変数の分散がＶ未満である場合、keepイベントを状態決定部２５へ出力し、角度を算出しない。独立変数の分散がＶ未満である場合とは、ｎ個のデータポイントＰ（ｘ，ｙ）が、局所的に集中していることを意味する。したがって、角度決定部２４が変数Ｖを定めることにより、微細すぎる指の動きを無視し、安定した角度の算出を行うことが可能となる。変数Ｖは、好ましくは０．７に設定される。
【００７５】
関数ａｏｐ（ｘ，ｙ）は、関数ｒｏｔａｔｅ（ｘ，ｙ）が偽であり、関数ｌｅｆｔ（ｘ）が偽である場合、回帰直線の傾きから得られる角度をそのまま算出する。関数ａｏｐ（ｘ，ｙ）は、関数ｒｏｔａｔｅ（ｘ，ｙ）が偽であり、関数ｌｅｆｔ（ｘ）が真である場合、回帰直線の傾きから得られる角度に１８０度プラスした角度を算出する。関数ａｏｐ（ｘ，ｙ）は、関数ｒｏｔａｔｅ（ｘ，ｙ）が真であり、関数ｄｏｗｎ（ｙ）が偽である場合、回帰直線の傾きから得られる角度を９０度から引くことにより角度を算出する。関数ａｏｐ（ｘ，ｙ）は、関数ｒｏｔａｔｅ（ｘ，ｙ）が真であり、関数ｄｏｗｎ（ｙ）が真である場合、回帰直線の傾きから得られる角度を９０度から引くことにより算出した角度に１８０度プラスした角度を算出する。
【００７６】
状態決定部２５は、角度決定部２４により既定の処理時間ごとに決定される角度に基づいて、既定の処理時間ごとに角度及び大きさを決定する。状態決定部２５は、決定した角度及び大きさをアプリケーション部２６へ出力する。状態決定部２５は、アプリケーション部２６へ直接出力せずに、アプリケーション部２６が参照するメモリ領域に決定した角度及び大きさを示す情報を格納してもよい。１つの好適な例では、状態決定部２５は、連続的に算出される角度の列をコントローラの機能に変換するソフトウェアモジュールである。本モジュールは、タッチ座標は一切用いず、角度と時間を使った状態管理モデル（ステートマシン）として実装される。
【００７７】
状態決定部２５は、既定の処理時間ごとに角度決定部２４が出力する情報を受け取ると、受け取ったイベントに応じて、既定の処理時間ごとに仮想コントローラの傾きの状態を出力する。仮想コントローラは、物理的なアナログコントローラをソフトウェアで実現するものであるが、仮想コントローラの傾きとは、物理的なコントローラのジョイスティックやレバーの傾きに対応するものである。状態決定部２５は、仮想コントローラの傾きの状態を、ベクトルすなわち方向（角度）及び大きさとして出力する。大きさは、加速度情報とすることもできるし、速度情報とすることもできる。仮想コントローラの傾きの状態は、物理的なアナログコントローラの入力量に対応するものである。
【００７８】
このように、状態決定部２５は、発生したタッチイベントの意味を解釈するための状態遷移モデルを提供するものと考えることができる。状態決定部２５は、仮想のコントローラの傾きを状態として管理し、既定の処理時間ごとに角度決定部２４が出力する情報を受け取ると、既定の処理時間ごとに状態遷移させるものである。
【００７９】
１つの例では、状態決定部２５は、角度決定部２４から出力される角度の情報を蓄積し、時間に応じて、アプリケーション部２６への出力を算出する。例えば、角度決定部２４が１６５ｍｓ継続して３３ｍｓごとに４５度を出力する場合、状態決定部２５は、４５度の方向に１６５ｍｓ分の加速度情報を決定する。例えば、角度決定部２４が同じ角度の出力が連続した場合、状態決定部２５は該角度の方向へ加速する情報を出力し、続けて角度決定部２４が該角度と１８０度反対の角度を入力した場合、状態決定部２５は、減速する情報を出力する。このような構成とすることにより、実際のタッチ座標をそのまま用いずに、コントローラの入力量を、状態遷移回数に対応する時間として求めることが可能となる。
【００８０】
１つの例では、状態決定部２５は、角度決定部２４が出力する情報を受け取ると、受け取ったイベントに応じて、仮想コントローラの傾きの状態を設定し、ゲームアプリケーションへ移動イベント又は加速イベントを角度及び大きさを示す情報とともに出力する。具体的には、状態決定部２５は、所定のプログラム言語を用いて、物理的なアナログコントローラを模した加速度処理を実装することができる。
【００８１】
１つの好適な例では、状態決定部２５は、仮想コントローラの傾きの状態をベクトルとして保持し、既定の処理時間ごとに、保持したベクトルを出力する。状態決定部２５は、角度決定部２４からstartイベントを受け取ると、状態管理を開始する。状態決定部２５は、最初に角度決定部２４からangleイベントを受け取ると、受け取った角度及び状態遷移１回分の大きさのベクトルの保持を開始し、該ベクトルを出力する。状態決定部２５は、更に角度決定部２４からangleイベントを受け取ると、内部で保持するベクトルに、受け取った角度及び状態遷移１回分の大きさのベクトルを加算して、該ベクトルを保持するとともに出力する。状態決定部２５は、出力するベクトルの長さが１．０を超えた場合、１．０に正規化する。
【００８２】
例えば、状態決定部２５は、角度決定部２４から４５度の角度情報を１回受け取ると、４５度の角度及び０．２の大きさのベクトルを出力するとともに、該ベクトルを保持する。状態決定部２５は、角度決定部２４から４５度の角度情報を更に４回受け取ると、４５度の角度及び１．０の大きさのベクトルを保持するとともに出力する。状態決定部２５は、更に角度決定部２４から４５度の角度情報を受け取った場合も、４５度の角度及び１．０の大きさのベクトルを保持するとともに出力する。状態決定部２５は、３０度の角度情報を受け取った場合、３０度の角度及び０．２の大きさのベクトルと、４５度の角度及び１．０の大きさのベクトルとを加算したベクトルの角度及び１．０の大きさのベクトルを保持するとともに出力する。この場合も、ベクトルの大きさが１．０を超えるため、状態決定部２５は、１．０に正規化して出力する。
【００８３】
状態決定部２５は、角度決定部２４からkeepイベントを受け取ると、内部で保持するベクトルの保持を継続し、該ベクトルを出力する。状態決定部２５は、角度決定部２４からstopイベントを受け取ると、内部で保持するベクトルの保持を解除し、ゼロベクトルを出力するか、又はstopイベントを出力する。
【００８４】
このような構成とすることにより、物理的なアナログコントローラと同様の操作をスマートフォン上で実現することが可能となる。
【００８５】
アプリケーション部２６は、電子装置１０上で起動されたアプリの機能を有し、当該アプリによるサービスの提供を行う。１つの好適な例では、アプリケーション部２６は、状態決定部２５から出力されたベクトルを、具体的な仮想キャラクタのモーションなどに変換するものであり、一般的なゲームアプリに実装されている機能である。アプリがＷｅｂアプリである場合、電子装置１０と通信するサーバがアプリケーション部２６の一部又は全部を有し、アプリは、当該サーバとデータの送受信を行う。
【００８６】
角度決定部２４による、式（１）に示す関数ａｏｐ（ｘ，ｙ）を用いた角度算出の実施例を以下に説明する。以下の例示において、変数ｗは２であり、独立変数の分散はＶ以上であるものとし、時間ｔ１〜ｔ４は、角度決定部２４が角度を算出する任意の１つの時間を示すものとする。
【００８７】
図５は、時間ｔ１におけるデータポイントバッファが保持するデータポイントの一例を示す図である。データポイントバッファが保持するデータポイントの集合４０は、６個のデータポイントＰ４１〜４６からなる。また、Ｐ４１〜４６のｘ座標の値及びｙ座標の値（ｘ，ｙ）は、各々Ｐ４１（ｘ41，ｙ41）、Ｐ４２（ｘ42，ｙ42）…Ｐ４６（ｘ46，ｙ46）であり、データポイントバッファは、Ｐ４１、Ｐ４２、…、Ｐ４６の順番でデータポイントを格納したものとする。
【００８８】
最初に、関数ａｏｐ（ｘ，ｙ）は、関数ｒｏｔａｔｅ（ｘ，ｙ）を用いて、ａｂｓ（ｍａｘ（ｘ）―ｍｉｎ（ｘ））とａｂｓ（ｍａｘ（ｙ）―ｍｉｎ（ｙ））を比較する。図６より、Ｐ４６とＰ４１のｘ座標の値の差分値ｘ46−ｘ41（＝Δｘ）がａｂｓ（ｍａｘ（ｘ）―ｍｉｎ（ｘ））に対応し、Ｐ４５とＰ４１のｙ座標の値の差分値ｙ45−ｙ41（＝Δｙ）がａｂｓ（ｍａｘ（ｙ）―ｍｉｎ（ｙ））に対応することが確認できる。図５より、Δｘ＞Δｙである。したがって、関数ｒｏｔａｔｅ（ｘ，ｙ）は、不等号を満たさないため、偽の値を返す。
【００８９】
続いて、関数ａｏｐ（ｘ，ｙ）は、関数ｌｅｆｔ（ｘ）を用いて、時系列的に前後する値の差分値（ｘ42−ｘ41，ｘ43−ｘ42，…ｘ46−ｘ45）を算出する。図５より、差分値はすべてプラスとなる。したがって、関数ｌｅｆｔ（ｘ）は不等号を満たさないため、偽の値を返す。
【００９０】
上記実施例においては、関数ｒｏｔａｔｅ（ｘ，ｙ）が偽であり、関数ｌｅｆｔ（ｘ）が偽である。したがって関数ａｏｐ（ｘ，ｙ）は、データポイントの集合４０から図７に示す回帰直線８１を求め、図８に示すように回帰直線８１の傾きから角度９１を算出する。
【００９１】
図９は、時間ｔ２におけるデータポイントバッファが保持するデータポイントの一例を示す図である。データポイントバッファが保持するデータポイントの集合６０は、６個のデータポイントＰ６１〜６６からなる。Ｐ６１、Ｐ６２、…Ｐ６６のｘ座標の値及びｙ座標の値は、各々Ｐ４６、Ｐ４５、…、Ｐ４１のｘ座標の値及びｙ座標の値と同じであり、Ｐ６１、Ｐ６２、…、Ｐ６６の順番でデータポイントを格納したものとする。
【００９２】
関数ｒｏｔａｔｅ（ｘ，ｙ）は、図５の実施例の場合と同様にして、不等号を満たさないため、偽の値を返す。続いて、関数ａｏｐ（ｘ，ｙ）は、関数ｌｅｆｔ（ｘ）を用いて、時系列的に前後する値の差分値を算出する。図９より、差分値はすべてマイナスとなる。したがって、関数ｌｅｆｔ（ｘ）は不等号を満たし、真の値を返す。
【００９３】
上記実施例においては、関数ｒｏｔａｔｅ（ｘ，ｙ）が偽であり、関数ｌｅｆｔ（ｘ）が真である。したがって関数ａｏｐ（ｘ，ｙ）は、データポイントの集合６０から図９に示す回帰直線８２を求め、図１０に示すように回帰直線８２の傾きから算出される角度９２ａに１８０度プラスした角度９２ｂを算出する。ここで、回帰直線８２の傾きは回帰直線８１と同じであり、角度９１は角度９２ａと同じであるが、データポイントバッファがデータポイントを格納した順番が逆であるため、関数ａｏｐ（ｘ，ｙ）が算出する角度は１８０度異なることが確認できる。
【００９４】
図１１は、時間ｔ３におけるデータポイントバッファが保持するデータポイントの一例を示す図である。データポイントバッファが保持するデータポイントの集合７０は、６個のデータポイントＰ７１〜７６からなる。また、Ｐ７１〜７６のｘ座標の値及びｙ座標の値は、各々Ｐ７１（ｘ71，ｙ71）、Ｐ７２（ｘ72，ｙ72）…Ｐ４６（ｘ76，ｙ76）であり、データポイントバッファは、Ｐ７１、Ｐ７２、…、Ｐ７６の順番でデータポイントを格納したものとする。
【００９５】
図１２より、Ｐ７５とＰ７１のｘ座標の値の差分値ｘ75−ｘ71（＝Δｘ）がａｂｓ（ｍａｘ（ｘ）―ｍｉｎ（ｘ））に対応し、Ｐ７６とＰ７１のｙ座標の値の差分値ｙ76−ｙ71（＝Δｙ）がａｂｓ（ｍａｘ（ｙ）―ｍｉｎ（ｙ））に対応することが確認できる。図１１より、２×Δｘ＜Δｙである。したがって、関数ｒｏｔａｔｅ（ｘ，ｙ）は、不等号を満たすため、真の値を返す。
【００９６】
続いて、関数ａｏｐ（ｘ，ｙ）は、関数ｄｏｗｎ（ｙ）を用いて、時系列的に前後する値の差分値（ｙ72−ｙ71，ｙ73−ｙ72，…ｙ76−ｙ75）を算出する。図１１より、差分値はすべてプラスとなる。したがって、関数ｄｏｗｎ（ｙ）は不等号を満たさないため、偽の値を返す。
【００９７】
上記実施例においては、関数ｒｏｔａｔｅ（ｘ，ｙ）が真であり、関数ｄｏｗｎ（ｙ）が偽である。したがって関数ａｏｐ（ｘ，ｙ）は、データポイントの集合７０から図１３に示す回帰直線８３を求め、図１３に示すように回帰直線８３の傾きから算出される角度９３ａを、９０度から引くことにより角度９３ｂを算出する。ここで、図１３に示す角度９３ａは、ｙを独立変数としてｘを従属変数とした場合の回帰直線８３の傾きから算出される角度を、ｘを独立変数としてｙを従属変数とした座標に戻した場合の位置に対応させて示している。
【００９８】
図１４は、時間ｔ４におけるデータポイントバッファが保持するデータポイントの一例を示す図である。時間ｔ４は、時間ｔ１から時間Δｔが経過した時間である。データポイントバッファが保持するデータポイントの集合４０’は、８個のデータポイントＰ４５〜５２からなる。また、Ｐ４５〜５２のｘ座標の値及びｙ座標の値は、各々Ｐ４５（ｘ45，ｙ46）、Ｐ４６（ｘ46，ｙ46）…Ｐ５２（ｘ52，ｙ52）であり、データポイントバッファは、Ｐ４５、Ｐ４６、…、Ｐ５２の順番でデータポイントを格納したものとする。
【００９９】
図１５より、Ｐ５２とＰ４５のｘ座標の値の差分値ｘ52−ｘ45（＝Δｘ）がａｂｓ（ｍａｘ（ｘ）―ｍｉｎ（ｘ））に対応し、Ｐ４６とＰ５２のｙ座標の値の差分値ｙ46−ｙ52（＝Δｙ）がａｂｓ（ｍａｘ（ｙ）―ｍｉｎ（ｙ））に対応することが確認できる。図１４より、２×Δｘ＜Δｙである。したがって、関数ｒｏｔａｔｅ（ｘ，ｙ）は、不等号を満たすため、真の値を返す。
【０１００】
続いて、関数ａｏｐ（ｘ，ｙ）は、関数ｄｏｗｎ（ｙ）を用いて、時系列的に前後する値の差分値（ｙ46−ｙ45，ｙ47−ｙ46，…ｙ52−ｙ51）を算出する。図１１より、ｙ46−ｙ45以外の差分値はマイナスとなる。したがって、関数ｄｏｗｎ（ｙ）は不等号を満たすため、真の値を返す。
【０１０１】
上記実施例においては、関数ｒｏｔａｔｅ（ｘ，ｙ）が真であり、関数ｄｏｗｎ（ｙ）が真である。したがって関数ａｏｐ（ｘ，ｙ）は、データポイントの集合４０’から図１６に示す回帰直線８４を求め、図１７に示すように回帰直線８３の傾きから算出される角度９４ａを、９０度から引くことにより算出した角度９４ｂに１８０度プラスした角度９４ｃを算出する。
【０１０２】
図１８は、本発明の一実施形態による電子装置１０がデータポイントの集合１２０から仮想キャラクタ１２１を制御する様子を示す図である。図１８は、タッチパネル１７へのユーザの操作により発生したタッチイベントに対応するデータポイントを可視化したデータポイントの集合１２０を示す。電子装置１０は、データポイントの集合１２０が示す角度１２２に基づいて、操作対象オブジェクトである仮想キャラクタ１２１のモーション、例えば歩く、走る、方向転換などを制御する。
【０１０３】
図１９は、本発明の一実施形態による角度決定部２４の情報処理のフローチャートを示す図である。本フローチャートは、タッチイベントが発生し、角度決定部２４が該タッチイベントからデータポイントを取得したときに開始する。
【０１０４】
ステップ１０１で、角度決定部２４は、取得したデータポイントをデータポイントバッファに格納する。このとき、角度決定部２４は、格納するデータポイントに、格納後の経過時間をミリ秒で示すＴと、データポイントバッファに格納できる時間（保持寿命）をミリ秒で示す変数Ｄを関連付ける。
【０１０５】
続いてステップ１０２で、角度決定部２４は、startイベントを状態決定部２５へ出力する。
【０１０６】
続いてステップ１０３で、角度決定部２４は、タッチイベントが発生したか否かを判定する。ステップ１０３は、本フローチャート開始時からＩｍｓ後に実行される。タッチイベントが発生した場合、本フローチャートはステップ１０４へ進み、タッチイベントが発生しなかった場合、本フローチャートはステップ１０６へ進む。
【０１０７】
ステップ１０４で、角度決定部２４は、発生したタッチイベントがtouchendであるか否かを判定する。取得したタッチイベントがtouchendであった場合、本フローチャートは終了する。取得したタッチイベントがtouchendでなかった場合、本フローチャートはステップ１０５へ進む。
【０１０８】
ステップ１０５で、角度決定部２４は、発生したタッチイベントからデータポイントを取得し、データポイントバッファに格納する。このとき、角度決定部２４は、格納するデータポイントに、格納後の経過時間をミリ秒で示すＴと、データポイントバッファに格納できる時間をミリ秒で示す変数Ｄを関連付ける。
【０１０９】
続いてステップ１０６で、角度決定部２４は、データポイントバッファに保持されているデータポイントのうち、経過時間Ｔが変数Ｄ以上であるデータポイントの保持を終了する。角度決定部２４は、データポイントバッファに格納する各データポイントについて、経過時間Ｔと変数Ｄを比較し、経過時間Ｔが変数Ｄ以上である場合、当該データポイントの保持を終了する。
【０１１０】
続いてステップ１０７で、角度決定部２４は、データポイントバッファが保持するデータポイントの個数ｎが変数Ｂの数以上であるか否かを判定する。個数ｎが変数Ｂ以上である場合、本フローチャートはステップ１０８へ進み、個数ｎが変数Ｂ未満であった場合、本フローチャートはステップ１１３へ進む。
【０１１１】
ステップ１０８で、角度決定部２４は、データポイントバッファに保持されているデータポイントにおけるｘ軸の値の変位量及びｙ軸の値の変位量に基づいて、独立変数の軸としてｘ軸及びｙ軸のいずれか一方の軸を決定する。角度決定部２４は、同時に他方の軸を従属変数の軸として決定する。
【０１１２】
続いてステップ１０９で、角度決定部２４は、ステップ１０８でｘ軸が独立変数の軸として決定された場合、式（５）を用いて傾きの角度を算出することにより、回帰直線の傾きの角度を決定する。１つの例では、角度決定部２４は、式（５）を用いて傾きの角度を算出する際、０度〜９０度及び２７０度〜３６０度の範囲内で算出する。角度決定部２４は、ステップ１０８でｙ軸が独立変数の軸として決定された場合、式（６）を用いて傾きの角度を算出し、算出した角度を９０度から引くことにより、回帰直線の傾きの角度を決定する。１つの例では、角度決定部２４は、式（６）を用いて傾きの角度を算出する際、０度〜９０度及び２７０度〜３６０度の範囲内で算出する。
【０１１３】
続いて、ステップ１１０で、角度決定部２４は、データポイントバッファに保持されているデータポイントの集合としての変位方向に基づいて、決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量を決定する。１つの例では、角度決定部２４は、ステップ１０８でｘ軸が独立変数の軸として決定された場合、時系列的に前後するｘ軸の値の差分値を各々算出する。角度決定部２４は、算出した差分値がマイナスとなる個数がプラスとなる個数よりも多いとき、回転量を１８０度に決定し、少ないとき、回転量を０度に決定する。１つの例では、角度決定部２４は、ステップ１０８でｙ軸が独立変数の軸として決定された場合、時系列的に前後するｙ軸の値の差分値を各々算出する。角度決定部２４は、算出した差分値がマイナスとなる個数がプラスとなる個数よりも多いとき、回転量を１８０度に決定し、少ないとき、回転量を０度に決定する。
【０１１４】
続いて、ステップ１１１で、角度決定部２４は、決定された回帰直線の傾き及び決定された回転量に基づいて、角度を決定する。具体的には、角度決定部２４は、決定された回帰直線の傾きに対応する角度に決定された回転量を加算することにより、角度を決定する。例えば回転量が０度の場合、角度決定部２４が決定する角度は、決定された回帰直線の傾きに対応する角度となる。角度決定部２４は、angleイベントを決定された角度とともに状態決定部２５へ出力し、ステップ１１２へ進む。
【０１１５】
ステップ１０７で個数ｎが変数Ｂ未満であった場合、ステップ１１３で、角度決定部２４は、keepイベントを状態決定部２５へ出力し、ステップ１１２へ進む。
【０１１６】
ステップ１１２で、本フローチャートは、例えばゲームアプリケーションが終了するなどにより終了しない限り、ステップ１０３へ戻る。角度決定部２４は、ステップ１０３〜ステップ１１２の処理を、Ｉｍｓごとに実行する。
【０１１７】
本フローチャートが終了すると、角度決定部２４は、データポイントバッファに保持するデータポイントをすべて削除する。
【０１１８】
次に、本発明の実施形態による電子装置１０の主な作用効果について説明する。本実施形態では、タッチパネル１７上で指をスワイプさせたとき、例えば１００ｍｓなどの極めて短い時間に６回以上のタッチイベントが発生するという投影型静電容量方式タッチパネルの特徴を利用している。電子装置１０が実装するソフトウェアのシステムアーキテクチャは、角度決定部２４、状態決定部２５、アプリケーション部２６が第１層、第２層、第３層に各々対応する３層構造をとり、第３層は、ゲームアプリケーションに対応する。第１層は、発生する複数のタッチイベントの集合（データポイントの集合）を対象として、スワイプ方向を３６０度のリニアな角度で算出する。第１層は、極めて短い時間に発生するタッチイベントを用いることができるため、高速に角度を算出し続けることが可能となる。また第１層は、データポイントバッファが極めて短い既定の保持時間（例えば１６５ｍｓ）だけ保持するデータポイントの集合が示す角度を求めることにより、基準点を用いずにタッチパネル１７に対してタッチ操作を行ったユーザが意図する方向の角度を求めることが可能となる。
【０１１９】
なお、本実施形態の電子装置１０は、スワイプ等のユーザの操作が複雑であっても、１００ｍｓなどの極めて短い時間では、等速直線運動としてモデル化できるため、等速度運動の角度を連続的に算出することにより、任意の非線形関数（≒人間の操作）を予測・近似させることができるというコンセプトに基づいて設計されたものである。
【０１２０】
第１層は、変数Ｉの値が比較的大きく設定された場合、比較的低い頻度で角度を算出する。この場合、第１層は、タッチイベントが発生し始めた直後においても、例えばユーザが操作を開始した直後においても、データポイントバッファに比較的多くのデータポイントが保持されている状態で、角度を算出することになる。このように、変数Ｉの値を比較的大きく設定することにより、ユーザの操作を比較的緩やかに反映した角度を算出することが可能となる。一方、第１層は、変数Ｉの値が比較的小さく設定された場合、比較的高い頻度で角度を算出する。この場合、第１層は、タッチイベントが発生し始めた直後では、例えばユーザが操作を開始した直後では、データポイントバッファに比較的少数のデータポイントが保持されている状態で、角度を算出することになる。このように、変数Ｉの値を比較的小さく設定することにより、ユーザの操作を比較的即座に反映した角度を算出することが可能となる。
【０１２１】
第１層は、データポイントの集合が示す角度を算出するにあたって、最小二乗法を用いて回帰直線の傾きを算出する。ｘを独立変数及びｙを従属変数として固定した場合、ｙ軸に沿った傾きの場合等は傾きを算出することが難しいため、第１層は、データポイントの変位量から独立変数及び従属変数を決定した後で、回帰直線の傾きを算出する。このような構成とすることにより、第１層は、安定的に回帰直線の傾きを算出することが可能となる。
【０１２２】
第１層は、データポイントの集合が示す角度を算出するにあたって、ユーザがタッチパネル１７上で指を動かす大まかな方向に対応するデータポイントの集合としての変位方向に基づいて、決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量を決定する。このように、最小二乗法を用いて算出された回帰直線の傾きからは把握できない回転量を決定することにより、タッチパネル１７に対してタッチ操作を行ったユーザが意図する方向の角度を求めることが可能となる。
【０１２３】
第１層は、既定の処理時間ごとに、例えば既定の処理時間としてゲームアプリケーションにおけるフレームレートに対応する時間ごとに、データポイントの集合を対象として、スワイプ方向に対応する角度を算出する。第２層は、継続的に出力される角度情報を用いて、既定の処理時間ごとに、仮想コントローラの傾きの状態を示すベクトル量（角度及び大きさ）を決定し、ゲームアプリケーションへ出力する。このような構成とすることにより、本実施形態では、ゲームアプリケーションに対して、既定の処理時間ごとに算出された角度に基づいた入力を行うことが可能となる。また、このような構成とすることにより、いずれの層も、過去のタッチ座標を基準点として用いずに、第１層が算出するフレームレートごとの高頻度で正確な移動角度に基づいた入力を行うことが可能となる。このように、本実施形態では、電子装置１０は、従来技術における仮想コントローラで使用されていた、開始点（開始座標）や終了点（終了座標）といった点という空間的な概念を使用せずに角度を算出する。
【０１２４】
また本実施形態では、従来技術における仮想コントローラ、すなわち基準座標と現在の指示座標との間の位置関係によって得られるベクトルを用いた仮想コントローラとは異なり、基準座標の概念がないため、基準座標を定める仮想コントローラよりも高い応答性を提供することが可能である。特に仮想キャラクタ等の方向転換操作においては、方向転換前とは大きく異なる方向にユーザがタッチパネル上の操作を行ったとしても、現在の指示座標が基準座標に近づくという概念そのものがないため、ユーザの意図した操作内容に素早く応答して方向転換することができ、優位性が顕著である。また上記のように構成されることにより、スマートフォンで操作するユーザに対して片手での操作を可能とすることができる。これにより、ユーザが従来技術における仮想ジョイスティックの操作を行うにあたって、常に基準座標を意識する必要があり、片手での操作が難しい場合があるという問題点を解消することができる。このように、本実施形態では、より高速で直感的な操作を可能とする仮想コントローラを実現している。
【０１２５】
また本実施形態では、電子装置１０は、従来技術における仮想コントローラと異なり、基準座標からの指の移動距離に応じた入力ではないため、指の移動量がより少ない操作により、ユーザが意図する操作を実現することが可能となる。したがって、従来技術と比較して、より小さい実装面積で実現することが可能となる。例えば、タッチパネル１７の大きさに関わらず、同一の操作性を実現することが可能となる。
【０１２６】
また、本実施形態の電子装置１０が提供する仮想コントローラの技術は、スワイプ操作からの角度の認識を数理的にモデル化しているため、３６０度の方向移動、加速・減速、格闘ゲームのようなコマンド入力等の幅広いジャンルに適用可能である。
【０１２７】
上記の作用効果は、特に言及が無い限り、他の実施形態や他の実施例においても同様である。
【０１２８】
本発明の他の実施形態では、上記で説明した本発明の実施形態の機能やフローチャートに示す情報処理を実現するプログラムや該プログラムを格納したコンピュータ読み取り可能な記憶媒体とすることもできる。また他の実施形態では、上記で説明した本発明の実施形態の機能やフローチャートに示す情報処理を実現する方法とすることもできる。また他の実施形態では、上記で説明した本発明の実施形態の機能やフローチャートに示す情報処理を実現するプログラムをコンピュータに供給することができるサーバとすることもできる。また他の実施形態では、上記で説明した本発明の実施形態の機能やフローチャートに示す情報処理を実現する仮想マシンとすることもできる。
【０１２９】
以下に本発明の実施形態の変形例について説明する。以下で述べる変形例は、矛盾が生じない限りにおいて、適宜組み合わせて本発明の任意の実施形態に適用することができる。
【０１３０】
１つの変形例では、電子装置１０は、仮想空間上に仮想的なオブジェクトを配置し、該仮想空間内に配置される仮想カメラによって撮影したゲーム画像をユーザに提示し、ゲームを進行するゲームアプリケーションがインストールされている。電子装置１０は、当該ゲームアプリケーションが実行されると、仮想空間内に配置される仮想的なオブジェクトなどを、仮想空間内に配置される仮想カメラによって撮影したゲーム画像をタッチパネル１７に表示し、ユーザの操作に応じて仮想カメラを制御する。このように、電子装置１０は、当該ゲームアプリケーションが実行されると、ユーザの操作に応じて、操作対象オブジェクトである仮想カメラを制御するための仮想コントローラを提供する。仮想カメラの制御とは、仮想空間に配置された仮想カメラの動き又は視野領域の制御である。
【０１３１】
図２０は、本発明の一実施形態による電子装置１０が表示する画像を撮影する仮想空間内に配置された仮想カメラ１３１を示す図である。図２０は、仮想カメラ１３１の位置と、仮想カメラ１３１の視線方向１３２を示す。視線方向１３２は仮想カメラ１３１の位置を視点とする３次元ベクトルで定められる。仮想カメラ１３１から視線方向１３２に一定の視野角において視野領域が定められ、当該視野領域に視線方向１３２と垂直な面である２次元スクリーン１３３が定められる。２次元スクリーン１３３に対して、仮想空間内の仮想的なオブジェクトが投影され、２次元画像が形成される。
【０１３２】
１つの変形例では、入力装置１２と表示装置１３は、別の位置に配置される別個の形態である。この場合、入力装置１２は、タッチパネル又は投影型静電容量方式タッチパネルと同等の機能を有するデバイスである。表示装置１３は、プロセッサ１１の制御に従って、アプリケーション画面などを電子装置１０のユーザに表示するものであればよく、例えば液晶ディスプレイ、有機ＥＬを用いたディスプレイやプラズマディスプレイなどである。
【０１３３】
１つの変形例では、角度決定部２４は、最小二乗法以外の既知の方法を用いて、回帰直線の傾きを算出する。この場合、角度決定部２４は、決定された回帰直線の傾きに対して１８０度回転させるか否かを示す回転量を決定せず、これに伴い、独立変数の軸及び従属変数の軸を決定しない。例えば、カルマンフィルタ又はパーティクルフィルタなどのアルゴリズムを用いることができる。
【０１３４】
１つの変形例では、角度決定部２４は、変数Ｄを定めず、データポイントバッファに保持されているデータポイントのうち既定の保持時間を超えたと判断されたデータポイントの保持を終了しない。この場合、角度決定部２４は、変数Ｉで定める時間ごとに、変数Ｉで定める時間ずつずらした特定の時間帯に格納されたデータポイントを参照することにより角度を決定する。
【０１３５】
１つの変形例では、角度決定部２４は、変数Ｖを定めない。この場合、角度決定部２４は、独立変数の分散の値に関わらず、関数ａｏｐ（ｘ，ｙ）を用いて角度を算出し、決定する。
【０１３６】
１つの変形例では、電子装置１０は重力方向を判定することが可能な加速度センサを備える。角度決定部２４は、加速度センサから取得された情報を用いて重み係数を決定する。例えば、スマートフォンが縦持ちされてタッチパネル１７のｙ軸が重力方向となる場合、角度決定部２４はｗを２に決定する。一方、スマートフォンが横持ちされてタッチパネル１７のｘ軸が重力方向となり、かつゲームアプリケーションが備えるゲームエンジンが縦横の座標の変換をしない場合、角度決定部２４はｗを０．５などの１より小さい値に決定する。
【０１３７】
１つの変形例では、角度決定部２４は、タッチイベントを取得するとき、２つの変数からなる数値の組（ｘ、ｙ）を取得し、データポイント取得時間ｔを対応付けずに、２つの変数からなる数値の組（ｘ、ｙ）をデータポイントバッファに格納する。例えば、角度決定部２４は、データポイント取得時間ｔに対応する情報をデータポイントバッファ以外の記憶装置１４内のメモリ領域などに記憶し、データポイントバッファに格納するデータに対応付けて管理することができる。
【０１３８】
以上に説明した処理又は動作において、あるステップにおいて、そのステップではまだ利用することができないはずのデータを利用しているなどの処理又は動作上の矛盾が生じない限りにおいて、処理又は動作を自由に変更することができる。また以上に説明してきた各実施例は、本発明を説明するための例示であり、本発明はこれらの実施例に限定されるものではない。本発明は、その要旨を逸脱しない限り、種々の形態で実施することができる。
【符号の説明】
【０１３９】
１０  電子装置
１１  プロセッサ
１２  入力装置
１３  表示装置
１４  記憶装置
１５  通信装置
１６  バス
１７  タッチパネル
２１  入力部
２２  表示部
２３  制御部
２４  角度決定部
２５  状態決定部
２６  アプリケーション部
３１、３３、３５  角度
３２、３４、３６  方向
８１、８２、８３、８４  回帰直線
９１、９２ａ、９２ｂ、９３ａ、９３ｂ、９４ａ、９４ｂ、９４ｃ  角度
１２０  集合
１２１  仮想キャラクタ
１２２  角度
１３１  仮想カメラ
１３２  視線方向
１３３  ２次元スクリーン
【図１】
2019200765.tif 000017
【図２】
2019200765.tif 000018
【図３】
2019200765.tif 000019
【図４】
2019200765.tif 000020
【図５】
2019200765.tif 000021
【図６】
2019200765.tif 000022
【図７】
2019200765.tif 000023
【図８】
2019200765.tif 000024
【図９】
2019200765.tif 000025
【図１０】
2019200765.tif 000026
【図１１】
2019200765.tif 000027
【図１２】
2019200765.tif 000028
【図１３】
2019200765.tif 000029
【図１４】
2019200765.tif 000030
【図１５】
2019200765.tif 000031
【図１６】
2019200765.tif 000032
【図１７】
2019200765.tif 000033
【図１８】
2019200765.tif 000034
【図１９】
2019200765.tif 000035
【図２０】
2019200765.tif 000036