骨格の角度制御方法,装置,及びプログラム
【課題】簡便な手法により,骨格モデルにおける各々の骨の回転(曲げ,捻り等)の制御を実現する。
【解決手段】親骨と子骨とが関節によって連結された骨格モデルにおいて,前記親骨に対する前記子骨の前記関節における角度範囲を制限することによって前記子骨の動作を制御するための方法であって,前記関節を中心とする球の球面上に,前記子骨の角度範囲の境界を定義する角度範囲境界円を設定する角度範囲境界円設定ステップであって,前記球の中心と前記角度範囲境界円とで形成される円錐の軸単位ベクトルu及び前記円錐の半頂角αによって前記角度範囲境界円を設定する,角度範囲境界円設定ステップと,前記軸単位ベクトルuと前記半頂角αと、前記子骨の向きを表す単位ベクトルvとを用いて、検査値を算出し,前記検査値に基づいて,前記子骨の角度が前記角度範囲の中にあるか否かを判定する,角度範囲判定ステップと,を有する。
【解決手段】親骨と子骨とが関節によって連結された骨格モデルにおいて,前記親骨に対する前記子骨の前記関節における角度範囲を制限することによって前記子骨の動作を制御するための方法であって,前記関節を中心とする球の球面上に,前記子骨の角度範囲の境界を定義する角度範囲境界円を設定する角度範囲境界円設定ステップであって,前記球の中心と前記角度範囲境界円とで形成される円錐の軸単位ベクトルu及び前記円錐の半頂角αによって前記角度範囲境界円を設定する,角度範囲境界円設定ステップと,前記軸単位ベクトルuと前記半頂角αと、前記子骨の向きを表す単位ベクトルvとを用いて、検査値を算出し,前記検査値に基づいて,前記子骨の角度が前記角度範囲の中にあるか否かを判定する,角度範囲判定ステップと,を有する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は,骨格モデルにおける各々の骨の角度すなわち回転(曲げ,捻り等)の制御に関する。
【背景技術】
【0002】
CGキャラクタ等を動かしてポーズやアニメーションを作る際に,複数の骨を関節で繋いだ骨格モデル(スケルトンモデル)(図1(a))が使われる場合がある。このような骨格モデルは,仮想空間ばかりでなく,ロボット制御等の実空間における対象物を制御する場合にも用いられ得る。
【0003】
本願明細書では,図1(b)のように関節の両側の骨のうち一方を親骨,他方を子骨と呼ぶことにする。関節の回転(曲げ,捻り)の状態は,親骨を基準とした子骨の向きで表すことができる。骨の向きを表すために,各々の骨に対して図1(b)のように座標系が定められる。図1(b)の座標系では,x軸回転が捻り,y軸回転とz軸回転が曲げとなる。
【0004】
三次元(3D)仮想空間又は実空間上で人体モデル,動物,構造物等の姿勢(ポーズ,動き等)を制御する際に用いられるこのような骨格モデルにおいては,図1(a)に示す各々の骨および関節の位置,角度,回転(曲げ,捻り)等を意図したとおりに制御することが必要となる。図1(a)に示される骨格モデルでは,各々の骨は関節で結合されており,各々の骨の動きが他の骨の動きに影響を与える。従来から,骨格をモデル化し,骨格モデルを制御するする手法として,種々のものが提案されている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2000−306116
【特許文献2】特開2009−070340
【特許文献3】特開2010−170279
【特許文献4】米国特許公開公報2010182329号明細書
【発明の概要】
【発明が解決しようとする課題】
【0006】
例示として,図1(a)の骨格モデルを用いた場合を想定する。この骨格モデルは,人間の骨格をモデル化したものである。したがって,例えば,肘から先の腕の可動範囲には,一定の制限がある。この制限を超えた角度(曲げ,捻り)に腕を曲げるポーズを取らせることは,現実の人間に対するモデルからかけ離れたものになる。人間として自然なポーズを取る骨格モデルを形成するためには,たとえば肘の関節から先の骨の可動範囲に対して,一定の制限を課すことが必要となる。
【0007】
従来では,特許文献1に開示されるように,たとえば親骨に対する子骨の向きを親骨の座標系を基準とした3軸(x,y,z)の各軸回りの回転角度で表現するものがある。
【0008】
特許文献2には,関節を中心点とする球面上の所与の点を焦点とし,関節に対応する中心点と焦点とを結ぶ軸に直交する平面を射影面とし,関節の可動範囲を,射影面上において設定する技術が開示されている。
【0009】
特許文献3及び特許文献4には,子骨の向きが,予め定められた可動範囲内に収まっていない場合には,可動範囲の形状に応じた条件を満たすように,前記親骨に対する前記子骨の向きを補正する発明が開示されている。
【0010】
上述のような従来の骨格の制御方法では,設計者の意図とはかけ離れた可動範囲となってしまうという問題が指摘されていた。また,この問題をある程度解決する手法として,特許文献2,特許文献3及び特許文献4に開示された技術が提案されている。しかしながら,これらの技術においては,必要な計算量は比較的少ないものの,多関節のモデルをリアルタイムに動かす等の場合には,計算量の更なる軽減が求められる。
【0011】
したがって,より多様な骨格モデルに柔軟に対応でき,より簡便な処理で,骨格モデルを制御する手法の実現が望まれている。本発明は,上述のような,従来技術の欠点を解決することを目的としている。なお,ここで取り上げた課題及び本願発明の目的は,例示的なものである。したがって,本願発明の目的が,上述の記載に限定されるものではない点に留意すべきである。
【0012】
本願明細書では,便宜上,実施例として仮想空間上に形成され得る骨格モデルの制御を取り上げて説明を行う。しかしながら,本発明の適用範囲は,仮想空間に限られるものではない。たとえば,ロボットの制御等の物理的構造物の位置や角度(曲げ,捻り等を含む)の制御に利用することも当然に意図されている。すなわち,本発明は,仮想空間及び実空間の双方の骨格モデルを対象とするものであることに特に留意すべきである。また,本発明は,本願明細書で取り扱う特定の骨格モデルに限定されるものでもない。
【課題を解決するための手段】
【0013】
本願発明は,親骨と子骨とが関節によって連結された骨格モデルにおいて,前記親骨に対する前記子骨の前記関節における角度範囲を制限することによって前記子骨の動作を制御するための方法であって,前記関節を中心とする球の球面上に,前記子骨の角度範囲の境界を定義する角度範囲境界円を設定する角度範囲境界円設定ステップであって,前記角度範囲境界円は前記関節を中心とする球面と親骨または親骨の延長線との交点1を通るものであり,前記子骨又は前記子骨の延長線と前記球面の交点2の位置が前記角度範囲境界円によって二分される前記球面の何れに存在すべきかによって前記子骨の角度範囲が定められ,前記球の中心と前記角度範囲境界円とで形成される円錐の軸単位ベクトルu及び前記円錐の半頂角α,または,前記軸単位ベクトルu及び前記半頂角αを導くことができる数値をメモリに格納することによって前記角度範囲境界円を設定する,角度範囲境界円設定ステップと,前記メモリに格納された数値を読み出すことによって前記軸単位ベクトルuと前記半頂角αとを得て,前記子骨の向きを表す単位ベクトルvを用いて,u・v−cosαの値を検査値として算出し,前記検査値に基づいて,前記子骨の角度が前記角度範囲の中にあるか否かを判定する,角度範囲判定ステップと,を有する,方法を提供する。なお,上記の式(v・u)の演算は,ベクトルvとベクトルuの内積を意味する。
【0014】
また,本願発明は,更に 前記関節を原点とし,前記交点1から前記原点に向かう方向をx軸の正方向とする,三次元直交座標系(x,y,z)から,
μ=2tan−1(−z/(x+1))
ν=2tan−1(y/(x+1))
の関係を有する,モノポーラ球面座標系(μ,ν)を用いて,前記角度範囲境界円が,少なくともμ=μe及びν=νeのうち何れか一方を満たす(ここにおいて,μe及びνeは定数)ようにしてもよい。
【0015】
本願発明は,更に,前記交点2の前記モノポーラ球面座標を(μ,ν)とし,μの下限及び上限をそれぞれμ0,μ1とし,νの下限及び上限をそれぞれν0,ν1とした場合に,前記角度範囲が,μ0<μ<μ1及びν0<ν<ν1を満たすよう前記角度範囲境界円を設定してもよい。
【0016】
本願発明は,更に,前記角度範囲境界円が,前記交点1を通らない補助角度範囲境界円を更に用いるようにしてもよい。すなわち,この補助角度範囲境界円を角度範囲判定ステップで用いてもよい。
【0017】
本願発明は,前記角度範囲判定ステップにおいて,前記子骨の角度が前記角度範囲の中に無いと判定された場合,前記交点2から前記角度範囲の中にあることを満たす球面上の点まで前記球面上に沿って測定した距離が最短となる前記球面上の点に,前記交点2を移動させことにより,前記子骨の角度を修正する,角度修正ステップ,を更に有してもよい。
【0018】
また,本願発明は,上記方法を実行する命令を有するプログラムとして実現されてもよい。あるいは,本願発明は,上記方法を実現する手段を有する装置として実現されてもよい。
【発明の効果】
【0019】
本願発明により,骨格の角度を簡便な手法で制御することができる。なお,本願発明の効果は,この点に限定されるものではない。
【図面の簡単な説明】
【0020】
【図1】スケルトンモデル,親骨,子骨,及び座標系を示す図。
【図2】モノポーラ球面座標を示す図((b)は,(a)を反対側から見た図)。
【図3】平面群と単位球面の交線が縦グリッドとなることを示す図。
【図4】平面群と単位球面の交線が横グリッドとなることを示す図。
【図5】平面の向きとφ,θとの関係を示す図。
【図6】xz平面上の点Pのφ,μを示す図。
【図7】xy平面上の点Pのθ,νを示す図。
【図8】矩形領域による角度制限を示す図。
【図9】小判型領域による角度制限(横長形状)を示す図。
【図10】小判型領域による角度制限(縦長形状)を示す図。
【図11】矩形領域の内外判定を模式的に示す図。
【図12】小判型領域(横長)の補助円を示す図。
【図13】小判型領域(縦長)の補助円を示す図。
【図14】円領域Cに対する,点Pからの最近点Pnを示す図。
【図15】矩形領域の4頂点を示す図。
【図16】球面上で互いに接する3円C2,C3,Ct0を示す図。
【図17】球面3角形O2O3Ot0と内接円を示す図。
【図18】矩形領域の内外判定の手順を示す図。
【図19】横長の小判型領域の内外判定の手順を示す図。
【図20】縦長の小判型領域の内外判定の手順を示す図。
【図21】矩形領域に対する最近点を求める手順を示す図。
【図22】横長の小判型領域に対する最近点求める手順を示す図。
【図23】縦長の小判型領域に対する最近点求める手順を示す図。
【図24】小判型領域形状が縦長か横長かを判定する手順を示す図。
【図25】本発明の実施例の装置構成を示す図。
【図26】本発明の実施例のハードウエア構成を示す図。
【図27】本発明の実施例の手順を示す図。
【図28】本発明の実施例の構成を示す図。
【図29】曲げと捻りの修正の手順を示す図。
【発明を実施するための形態】
【0021】
[1.モノポーラ球面座標]
上述のように,スケルトンモデル(図1(a))の骨の向きを表すために,各骨に対して図1(b)のように座標系を定める。
【0022】
関節を中心とする単位球面(半径1の球面)を作り,子骨のx軸(x>0の部分)と球面との交点をPとすると,関節の曲げ状態は,球面上の点Pの位置で表すことができる。関節の回転(曲げ,捻り)を表現する方法の一つに,3軸の回転角(オイラー角)を使う方法がある。例として,親骨の座標系を基準にx軸回転,z軸回転,y軸回転の順に回転を掛けた場合,各軸の回転角と点Pの位置との関係に注目すると,y軸回転角が経度に,z軸回転角が緯度に相当する。そこで,y軸回転角,z軸回転角を等間隔にとって球面上にグリッドを作ると,地球儀の経線・緯線と同様の形状になる。北極と南極に相当する2点が角度表現上の特異点となるため,扱いにくいという問題がある。
【0023】
これに対して,特異点を1個に減らす手法として,射影を用いる方法(特許文献2,特許文献3,特許文献4)が知られている。この手法の特性を球面上のグリッドで表すと図2のようになる。このグリッドは,球面上に作られた座標系と捉えることができる。極(特異点)が1個であることから,本願明細書では,この座標系を「モノポーラ球面座標」と呼ぶことにする。
【0024】
以下,このモノポーラ球面座標に関して,次の項目について述べる。
・射影を使わずに球面上にモノポーラ球面座標系を構成する手法
・モノポーラ球面座標を使って関節の角度制限を行なう手法
[2.モノポーラ球面座標系の構成]
一般に2次元の座標系に目盛りをつけるとグリッド(格子)となる。以下の説明では,便宜上「グリッド」という用語を用いる場合があるが,その表すものは,単なる格子ではなく座標系の意味を含むものとする。
【0025】
座標(−1,0,0)の点をP*とし,「極」と呼ぶことにする。極P*を通りy軸に平行な直線をlyとし,図3のように,lyを含む等角度間隔の平面群を用意する。この平面群と単位球面との交線をグリッドの縦線とする。
【0026】
同様に,極P*を通りz軸に平行な直線をlzとし,図4のように,lzを含む等角度間隔の平面群を用意する。この平面群と単位球面との交線をグリッドの横線とする。
【0027】
図5のように,直線lyを含む平面の向きを角度φで表し,直線lzを含む平面の向きを角度θで表す。φ,θの符号は,図中に示す方向を正とする。球面上の点Pの位置は,φによって決まる平面,θによって決まる平面,および単位球面の3つの面の交点として決まる。μ≡2φ,ν≡2θとし,μ,νを使って球面上の位置を表す。
【0028】
φ,θをそのまま使わずにμ,νを使うことにより,次のようなメリットがある。図6のように,点Pがxz平面上にある(即ちν=0である)場合を考える。子骨の向きはOPである。座標(1,0,0)の点をQとする。
【0029】
∠OP*P=∠OPP*=φ
∠OP*P+∠OPP*=∠QOP
∴∠QOP=2φ=μ
したがって,ν=0の場合には,μは子骨のy軸回りの回転角となる。同様に,図7のように,点Pがxy平面上にある(即ちμ=0である)場合には,νは子骨のz軸回りの回転角となる。
【0030】
このように,μ,νを使うと回転の状態(子骨の向き)を感覚的に把握しやすい。例えば図2は,μ,νの値を10°間隔にとって作ったグリッドであるが,xy平面上およびxz平面上ではグリッドが円周上で10°ずつの等間隔になっていることが分かる。
【0031】
[3.モノポーラ球面座標と子骨の向き]
子骨の向きを表す単位ベクトルをv≡(x,y,z)とし,これをモノポーラ球面座標で表したものを(μ,ν)とする。両者の関係は次式で表される(本明細書においてvはベクトルを表す)。
【0032】
【数1】
ただし,M,N,Tは次のとおりである。
【0033】
【数2】
式の導出方法については,後述する([式の導出方法A]を参照)。
【実施例】
【0034】
以下,具体的な角度(曲げ,捻り)の制御について詳細に述べる。
【0035】
[4.可動領域の設定]
[4.1 矩形領域による角度制限]
μ,νの値に上限,下限を設定することで,図8のように可動領域を設定できる。このような可動領域制限を矩形制限と呼ぶことにする。μの上下限値をそれぞれμ1,μ0とし,νの上下限値をそれぞれν1,ν0とする。
【0036】
式μ=μ0は単位球面上で1つの円を表す。この円をC0とする。円C0によって球の表面は2つの領域に分けられるが,このうち可動領域側(μ>=μ0の領域)を,円C0の「内側」と呼ぶことにする。球面上の円に対する内外判定の際に,後述のように円錐を使って判定を行なう。そこで,以下のように円錐パラメータを求めておく。
【0037】
円C0と球の中心Oとを結んで作られる円錐をOC0とし,円錐OC0の軸方向の単位ベクトルをu0≡(a0,b0,c0)とする(本明細書においてuはベクトルを表す)。u0の方向は可動領域側とする。また,円錐OC0の半頂角(軸u0と円錐面のなす角)をα0とする。これらの値は次式により得られる。
【0038】
【数3】
同様に,式μ=μ1,ν=ν0,ν=ν1が表す円を,それぞれC1,C2,C3とする。円錐OC1,OC2,OC3の中心軸をそれぞれu1≡(a1,b1,c1),u2≡(a2,b2,c2),u3≡(a3,b3,c3)とし,半頂角をそれぞれα1,α2,α3とする。これらの値は次式により得られる。
【0039】
【数4】
値の範囲が−π<μ0<μ1<π,−π<ν0<ν1<πなので,次式が成り立つ。
【0040】
【数5】
なお,今後扱う他の可動領域についても,球面上の円は可動領域側を「内側」とし,円錐の軸ベクトルの向きは可動領域側とする。
【0041】
[4.2 小判型領域による角度制限]
矩形制限を用いて骨格モデルを動かすと,可動領域の角部に引っ掛かり,滑らかでない動きになることがある。この挙動を改善するために,以下のように小判型の可動領域を設定する。
【0042】
[4.2.1 隅円の作成]
図9,図10のように,矩形領域の3辺に接する隅円を作り,角部を取り除く。元の矩形領域の形状によって,図9のようにC2,C3の一部が残る場合と,図10のようにC0,C1の一部が残る場合とがある。前者の形状を「横長」,後者の形状を「縦長」と呼ぶことにする。
【0043】
横長形状の場合,図9のように,μ0側の隅円(C0,C2,C3に接する円)をCt0とし,μ1側の隅円(C1,C2,C3に接する円)をCt1とする。
【0044】
縦長形状の場合,図10のように,ν0側の隅円(C0,C1,C2に接する円)をCt2とし,ν1側の隅円(C0,C1,C3に接する円)をCt3とする。
【0045】
[4.2.2 隅円の円錐パラメータ]
隅円の円錐パラメータは,以下の計算によって得られる。まず,次のようにk0,k1,k2,k3を定義する。
【0046】
【数6】
−π<μ0<μ1<π,−π<ν0<ν1<πなので,k0<k1,k2>k3である。次式により領域形状の縦長・横長を決定する。
【0047】
【数7】
Da<0ならば横長,Da>0ならば縦長である。Da=0の場合には,2つの隅円は連続した1つの円となる。隅円の円錐パラメータは,以下の手順によって求められる。
【0048】
[Da<=0の場合(横長または円形状)]
円錐OCt0の軸方向の単位ベクトルをut0≡(at0,bt0,ct0)とし,半頂角をαt0とする。これらの値は,以下の計算によって得られる。
【0049】
【数8】
円錐OCt1の軸単位ベクトルut1≡(at1,bt1,ct1)および半頂角αt1は,以下の計算によって得られる。
【0050】
【数9】
[Da>0の場合(縦長形状)]
円錐OCt2の軸単位ベクトルut2≡(at2,bt2,ct2)および半頂角αt2は,以下の計算によって得
られる。
【0051】
【数10】
円錐OCt3の軸単位ベクトルut3≡(at3,bt3,ct3)および半頂角αt3は,以下の計算によって得られる。
【0052】
【数11】
以上の円錐パラメータ計算式の導出方法については,後述する(「式の導出方法B」を参照)。また,判定式Daの導出方法については,後述する([式の導出方法D]を参照)。
【0053】
[5.可動領域に対する内外判定]
「5.1 円錐を使った内外判定」
矩形制限,小判型制限のいずれも,可動領域の形状は複数の円を組み合わせたものになっている。そのため,可動領域に対する内外判定は,円領域に対する内外判定の組み合わせとなる。円領域に対する内外判定は,以下のように円錐を使って実現できる。
【0054】
子骨の向き(x軸の向き)を表す単位ベクトルをv≡(x,y,z)とする。球面上の円Cが与えられ,円錐OCの軸単位ベクトルがu≡(a,b,c)で,半頂角がαであるとする。ベクトルvの円錐OCに対する内外判定は,以下のように実現できる。
【0055】
vとuのなす角がα以下であることが,vが円錐OCの内側にあることの必要十分条件である。この条件を式で表すと,次のようになる。
【0056】
【数12】
角度範囲[0,π]においてcosは単調減少なので,次式のように変形できる。
【0057】
【数13】
判定式Dを次のように定義すると,Dの正負によって円錐OCに対する内外を判定できる。
【0058】
【数14】
D>=0であれば円錐内,そうでなければ円錐外である。
【0059】
この判定式は,平面を使った判定と見ることもできる。法線ベクトルが(a,b,c)で原点からの距離がcosαの平面を,平面κとする。判定式Dの値は,点(x,y,z)の平面κからの符号付きの距離(u方向が正)を意味する。したがって,Dの正負による判定は,点(x,y,z)が平面κの表裏どちら側にあるかを判定していることになる。
【0060】
判定式Dの平面式としての解釈は,次のように理解できる。一般に,球面上の円は,球と「その円を含む平面」との交線として捉えられる。そのため,球面上の円領域に対する内外判定は,平面による判定を使って実現できる。式D=0が表す平面は,円Cを含む平面になっている。
【0061】
[5.2 矩形領域の内外判定]
図11のように,子骨の向きvが円C0,C1,C2,C3全てに対して内側にある場合のみ,矩形領域内となる。図18に示すように,以下の手順によって,領域に対する内外判定を行なう。
【0062】
S1801において,円C0による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1811)。この判定が「はい」であれば,S103に次に進む。
【0063】
S1803において,円C1による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1811)。この判定が「はい」であれば,S105に次に進む。
【0064】
S1805において,円C2による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1811)。この判定が「はい」であれば,S107に次に進む。
【0065】
S1807において,円C3による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1811)。この判定が「はい」であれば,領域内と判定される(S1809)。
【0066】
[5.3 小判型領域の内外判定]
[5.3.1 補助円の作成]
小判型領域の内外判定には,領域形状を構成する円(C0〜C3,Ct0,〜Ct3)だけでなく,以下に述べる補助円を使う。
【0067】
[横長形状の場合]
領域形状が横長の場合,図12のように補助円を作る。円Ct0とC2の接点をP02とし,円Ct0とC3の接点をP03とする。点P*,P02,P03の3点を通る円を,補助円Cs0とする。円Cs0の「内側」は,小判型領域の中央の側とする。
【0068】
円錐OCs0の軸単位ベクトルを(as0,bs0,cs0)とし,半頂角をαs0とする。これらの値は,以下の計算によって得られる。
【0069】
【数15】
同様に,円Ct1とC2の接点をP12とし,円Ct1とC3の接点をP13とする。点P*,P12,P13の3点を通る補助円をCs1とする。円錐OCs1の軸単位ベクトル(as1,bs1,cs1)と半頂角αs1は,以下の計算によって得られる。
【0070】
【数16】
[縦長形状の場合]
領域形状が縦長の場合は,図13のように補助円を作る。円Ct2とC0の接点をP20とし,円Ct2とC1の接点をP21とする。点P*,P20,P21の3点を通る補助円をCs2とする。円錐OCs2の軸単位ベクトル(as2,bs2,cs2)と半頂角αs2は,以下の計算によって得られる。
【0071】
【数17】
円Ct3とC0の接点をP30とし,円Ct3とC1の接点をP31とする。点P*,P30,P31の3点を通る補助円をCs3とする。円錐OCs3の軸単位ベクトル(as3,bs3,cs3)と半頂角αs3は,以下の計算によって得られる。
【0072】
【数18】
以上の円錐パラメータ計算式の導出方法については,後述する([式の導出方法C]を参照)。
【0073】
[5.3.2 補助円を使った内外判定]
[横長形状の場合]
横長の小判型領域の内外判定には,Ct0,Ct1,C2,C3,Cs0,Cs1の6つの円を使う。図19に示すように以下の手順によって,領域に対する内外判定を行なう。
【0074】
S1901において,円C2による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1913)。この判定が「はい」であれば,S1903に次に進む。
【0075】
S1903において,円C3による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1913)。この判定が「はい」であれば,S1905に次に進む。
【0076】
S1905において,円Cs0,Cs1による内外判定で,ともに内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S1911)。この判定が「いいえ」であれば,S1907に進む。
【0077】
S1907において,円Ct0による内外判定で,内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S1911)。この判定が「いいえ」であれば,S1909に進む。
【0078】
S1909において,円Ct1による内外判定で,内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S1911)。この判定が「いいえ」であれば,領域外と判定する(S1913)。
[縦長形状の場合]
縦長の小判型領域の内外判定には,Ct2,Ct3,C0,C1,Cs2,Cs3の6つの円を使う。図20に示すように以下の手順によって,領域に対する内外判定を行なう。
【0079】
S2001において,円C0による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S2013)。この判定が「はい」であれば,S2003に次に進む。
【0080】
S2003において,円C1による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S2013)。この判定が「はい」であれば,S2005に次に進む。
【0081】
S2005において,円Cs2,Cs3による内外判定で,ともに内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S2011)。この判定が「いいえ」であれば,S2007に進む。
【0082】
S2007において,円Ct2による内外判定で,内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S2011)。この判定が「いいえ」であれば,S2009に進む。
【0083】
S2009において,円Ct3による内外判定で,内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S2011)。この判定が「いいえ」であれば,領域外と判定する(S2013)。
【0084】
[6.捻り角]
[6.1 曲げと捻りの順序]
子骨の捻り角をλとし,捻りを含めたモノポーラ球面座標をλ,μ,νで表す。曲げと捻りの順序は,次の2とおりが考えられる。
・曲げた後に,子骨のx軸回りに捻る。
・x軸回りに捻り,その後に曲げる。
前者を「元曲げ」,後者を「元捻り」と呼ぶことにする。
【0085】
[6.2 捻り角の定義]
捻り角を扱うには,捻り角λ=0の状態を定義する必要がある。まず,元曲げ方式について説明する。関節の曲げ状態は,球面上の点P(子骨のx軸と単位球面との交点)の位置で表すことができる。これに対して捻りは,軸OP回りの回転として表される。子骨のy軸,z軸がグリッドの向き(それぞれ+ν方向,−μ方向)と合っている状態を,捻り角が0であると定義する。
【0086】
元捻り方式の場合は,捻りによってグリッド自体がx軸(親骨のx軸)回りにλだけ回転する。捻りの後に曲げを掛けても,子骨のy軸,z軸は,回転後のグリッドの向き(それぞれ+ν方向,−μ方向)と常に一致するものとする。
【0087】
[6.3マトリクスとモノポーラ球面座標の関係]
子骨の向きを表すマトリクスを,次式のようにMとする。マトリクスの要素の並びは,列ベクトルに対して左からマトリクスを掛ける方式とする(本明細書でMはマトリクスを表す)。
【0088】
【数19】
マトリクスMb,Mtを次のように定義する。ただし,M,N,Tは式(6),(7)のとおりとする。
【0089】
【数20】
Mbは曲げ,Mtは捻りを表すりマトリクスである。曲げだけを作用させたときの,子骨の向きを表す単位ベクトルを,vb≡(xb,yb,zb)とする。vbはMbの第1列(最も左の列)になるので,次式のようになる。
【0090】
【数21】
vbからT,M,Nを求める式は次のようになる。
【0091】
【数22】
x≒−1の場合に別の式を使うのは,桁落ちによる精度の低下を避けるためである。
【0092】
[6.3.1 元曲げ方式]
Mからλ,μ,νを求める手順は,以下のようになる。m00≒−1の場合に別の式を使うのは,桁落ちによる精度の低下を避けるためである。
【0093】
【数23】
逆に,λ,μ,νからMを求めるには,式(64),(65)を使ってMb,Mtを求め,これを次式に代入する。
【0094】
【数24】
Mからλ,vbを求めるには,式(70)および次式を使う。
【0095】
【数25】
逆に,λ,vbからMを求めるには,式(67),(68),(69)を使ってT,M,Nを求め,これを式(64)に代入し,式(65),(74)を使う。
【0096】
[6.3.2 元捻り方式]
Mからλ,μ,νを求める手順は,以下のようになる。
【0097】
【数26】
逆に,λ,μ,νからMを求めるには,式(64),(65)を使ってMb,Mtを求め,これを次式に代入する。
【0098】
【数27】
Mからλ,vbを求めるには,式(76)および次式を使う。
【0099】
【数28】
逆に,λ,vbからMを求めるには,式(67),(68),(69)を使ってT,M,Nを求め,これを式(64)に代入し,式(65),(80)を使う。
【0100】
計算式の導出方法については,後述する([式の導出方法E]を参照)。
【0101】
[6.4 四元数とモノポーラ球面座標の関係]
子骨の向きを表す四元数(クォータニオン)を,次式のようにqとする。
【0102】
【数29】
四元数qb,qtを次のように定義する。
【0103】
【数30】
qbは曲げ,qtは捻りを表す四元数である。
【0104】
[6.4.1 元曲げ方式]
qからλ,μ,νを求める式は,以下のようになる。
【0105】
【数31】
逆に,λ,μ,νからqを求めるには,式(83),(84)を使ってqb,qtを求め,これを次式に代入する。
【0106】
【数32】
qからλ,vbを求めるには,式(85)および次式を使う。
【0107】
【数33】
逆に,λ,vbからqを求めるには,式(67),(68),(69)を使ってT,M,Nを求め,これを式(83)に代入し,式(84),(88)を使う。
【0108】
[6.4.2 元捻り方式]
qからλ,μ,νを求める式は,以下のようになる。
【0109】
【数34】
逆に,λ,μ,νからqを求めるには,式(83),(84)を使ってqb,qtを求め,これを次式に代入する。
【0110】
【数35】
qからλ,vbを求めるには,式(85)および次式を使う。
【0111】
【数36】
逆に,λ,vbからqを求めるには,式(67),(68),(69)を使ってT,M,Nを求め,これを式(83)に代入し,式(84),(93)を使う。
【0112】
[7.可動領域外の場合の修正方法]
関節の曲げが可動領域外となった場合に,これを可動領域内に修正する方法について説明する。関節の曲げ状態は,単位球面上の点Pの位置で表される。Pの位置を可動領域内(境界を含む)に修正した点をPmとする。
【0113】
球面上の領域Aと,領域A外の球面上の点Pとが与えられたとき,領域境界上の点のうち,Pからの距離(球面上での距離)が最小となる点を,「領域Aに対するPの最近点」と呼ぶことにする。可動領域と点Pのみが与えられた場合,可動領域に対するPの最近点をPmとするのが最良であると考えられる。そこで,最近点を用いた修正方法について述べる。
【0114】
[7.1 円領域に対する最近点]
矩形制限,小判型制限のいずれも,可動領域の形状は複数の円を組み合わせたものになっている。そのため,可動領域に対する最近点を得るには,円領域に対する最近点を求める必要がある。
【0115】
図14のように,子骨の向き(x軸の向き)を表す単位ベクトルをv≡(x,y,z)とし,点Pの座標を(x,y,z)とする。球面上の円Cが与えられ,円錐OCの軸単位ベクトルがu≡(a,b,c)で,半頂角がαであるとする。円領域Cに対するPの最近点をPnとし,ベクトルOPnをwとする。wは次式により求められる。
【0116】
【数37】
ただしβはvとuのなす角で,0<β<=πである。sinβ>=0なので,sinβ,tanβは次式により得られる。
【0117】
【数38】
sinβ=0となるのはv=−uのときで,その場合は円C上の全ての点が最近点となる。
【0118】
[7.2円領域までの距離]
単位球面上において,点Pが円領域Cの外にあるとする。Pから円Cまでの距離(単位球面上での距離)をγとする。前述(7.1節)の記号を使うと,γ=∠POPn=β−αなので,次式のようになる。
【0119】
【数39】
0<γ<πなので,cosγはγに対して単調減少である。したがって,円領域に対する距離の大小判定には,γの替わりにcosγを使うことができる(ただし大小関係は逆になる)。
【0120】
[7.3 矩形領域に対する最近点]
矩形領域に対する点Pの最近点Pmは,図21に示すように,以下の手順によって得られる。Pは矩形領域の外にあるものとする。また,図15のように,矩形領域の角の4頂点を,それぞれPa,Pb,Pc,Pdとする。
【0121】
S2101において,円C0によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であればS2107に進む。判定が「いいえ」であれば,S2103に進む。
【0122】
S2103において,円C0に対するPの最近点を求め,PnとしS2105に進む。
【0123】
S2105において,円C2,C3によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2127),終了する。判定が「いいえ」であれば,S2113に進む。
【0124】
S2107において,円C1によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であれば,S2113に進む。判定が「いいえ」であれば,S2109に進む。
【0125】
S2109において,円C1に対するPの最近点を求め,PnとしS2111に進む。
【0126】
S2111において,円C2,C3によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2127)終了する。判定が「いいえ」であれば,S3113に進む。
【0127】
S2113において,円C2によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であれば,S2119に進む。判定が「いいえ」であればS2115に進む。
【0128】
S2115において,円C2に対するPの最近点を求め,PnとしS2117に進む。
【0129】
S2117において,円C0,C1によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2127)終了する。判定が「いいえ」であればS2125に進む。
【0130】
S2119において,Pが円C3の外であることが確定する。S2121に進む。
【0131】
S2121において,円C3に対するPの最近点を求め,PnとしS2123に進む。
【0132】
S2123において,円C0,C1によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2127)終了する。判定が「いいえ」であれば,S2125に進む。
【0133】
S2125において,Pa,Pb,Pc,Pdの4点のうちPから最も近い(球面上での距離が最小)のものをPmとし,終了する。
【0134】
[7.4小判型領域に対する最近点]
[横長形状の場合]
横長の小判型領域に対する点Pの最近点Pmは,図22に示すように,以下の手順によって得られる。Pは小判型領域の外にあるものとする。
【0135】
S2201において,円C2によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であれば,S2207に進む。判定が「いいえ」であればS2203に進む。
【0136】
S2203において,円C2に対するPの最近点を求めPnとしS2205に進む。
【0137】
S2205において,円Cs0,Cs1によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2215)として終了する。判定が「いいえ」であればS2213に進む。
【0138】
S2207において,円C3によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であればS2213に進む。判定が「いいえ」であればS2209に進む。
【0139】
S2209において,円C3に対するPの最近点を求めPnとしS2211に進む。
【0140】
S2211において,円Cs0,Cs1によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2215)終了する。判定が「いいえ」であればS2213に進む。
【0141】
S2213において,円Ct0,Ct1のうち,Pからの距離が小さい方に対するPの最近点をPmとし,終了する。
【0142】
[縦長形状の場合]
縦長の小判型領域に対する点Pの最近点は,図23に示すように,以下の手順によって得られる。Pは小判型領域の外にあるものとする。
【0143】
S2301において,円C0によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であればS2307に進む。判定が「いいえ」であればS2303に進む。
【0144】
S2303において,円C0に対するPの最近点を求めPnとし,S2205に進む。
【0145】
S2305において,円Cs2,Cs3によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であればPnをPmとして(S2315)終了する。判定が「いいえ」であれば,S2313に進む。
【0146】
S2307において,円C1によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であれば,S2313に進む。判定が「いいえ」であればS2309に進む。
【0147】
S2309において,円C1に対するPの最近点を求めPnとする。
【0148】
S2311において,円Cs2,Cs3によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2315)終了する。判定が「いいえ」であればS2313に進む。
【0149】
S2313において,円Ct2,Ct3のうち,Pからの距離が小さい方に対するPの最近点をPmとし,終了する。
【0150】
[7.5 曲げと捻りの修正方法]
関節の回転(曲げ捻り)の状態がマトリクス(または四元数)で与えられ,これを角度制限範囲内に修正する手順は,図29に示すように以下のようになる。
【0151】
S2901で,マトリクス(または四元数)からλ,vbを求める(6.3節,6.4節参照)。
【0152】
S2903で,vbが可動領域内かどうかを調べる(5.2節,5.3節参照)。可動領域外であればvbを修正する(7.3節,7.4節参照)(S2905)。
【0153】
S2907で,λに上下限が設定されていれば,この範囲内にあるかどうかを調べる。この範囲外であればλが上下限の範囲内になるようλを修正する(S2909)。
【0154】
S2911で,λ,vbからマトリクス(または四元数)を求める(6.3節,6.4節参照)。
【0155】
[式の導出方法A]方向ベクトルとモノポーラ球面座標との関係式の導出
子骨の向きを表す単位ベクトルを(x,y,z)とし,これをモノポーラ球面座標で表したものを(μ,ν)とする。モノポーラ球面座標系の構成方法より,座標(x,y,z)の点は,次の2平面上にある。
【0156】
【数40】
式(100)は,xy平面を直線ly回りに角度μ/2だけ回転させた平面で,式(101)は,xz平面を直線lz回りに角度ν/2だけ回転させた平面である。μ,νの取り得る値の範囲は,−π<μ<π,−π<ν<πである。また,(x,y,z)は単位ベクトルなので,
【0157】
【数41】
である。以上の3つの式を連立させて解く。
【0158】
cos(ν/2)≠0なので,式(101)より次式が得られる。ただし,N≡tan(ν/2)である。
【0159】
【数42】
an(μ/2)である。
【0160】
【数43】
式(103),(104)を式(102)に代入すると,xの2次方程式が得られる。これを解いて,解のうちx=−1でないほうを選ぶと,次式のようにxが得られる。ただし,T≡2/(M2+N2+1)である。
【0161】
【数44】
これを式(103),(104)に代入すると,次式のようにy,zが得られる。
【0162】
【数45】
[式の導出方法B]小判型領域隅円の円錐パラメータの導出
円C0,C2,C3に接する円Ct0を求める。円錐OCt0の軸方向単位ベクトルを未知ベクトルw≡(x,y,z)とし,半頂角を未知数τとする(本明細書において,wはベクトルを表す)。
【0163】
円錐OC0の軸単位ベクトルはu0≡(a0,b0,c0),半頂角はα0である。円Ct0は円C0の内側(可動領域側)に接するので,u0とwのなす角はα0−τとなる。したがって,
【0164】
【数46】
となる。cosα0=−a0,sinα0=−c0,b0=0を代入すると
【0165】
【数47】
となり,k0≡a0/c0とおくと,次式が得られる。
【0166】
【数48】
同様に,円錐OC2とOCt0に対してcosα2=−a2,sinα2=b2,c2=0を利用し,k2≡a2/b2とおくと,次式が得られる。
【0167】
【数49】
同様に,円錐OC3とOCt0に対してcosα3=−a3,sinα3=−b3,c3=0を利用し,k3≡a3/b3とおくと,次式が得られる。
【0168】
【数50】
式(109),(110)より次式が得られる。
【0169】
【数51】
式(108),(112)より次式が得られる。
【0170】
【数52】
式(111),(113),(112)より
【0171】
【数53】
となり,x2+y2+z2=1を利用して式を整理し,右辺をk4とおくと,次式が得られる。
【0172】
【数54】
式(112),(114)より
【0173】
【数55】
となる。sinτ>0,k2>k3なので,式(112)よりx+cosτ>0である。よって,上式(115)より次式が得られる。
【0174】
【数56】
式(114),(116)より,次式が得られる。
【0175】
【数57】
ただし,l4は次式のとおりである。
【0176】
【数58】
得られたcosτを使って,式(114)より,次式のようにxが得られる。
【0177】
【数59】
得られたx,cosτを使って,式(111),(113)より,次式のようにy,zが得られる。
【0178】
【数60】
以上により,隅円の円錐OCt0が得られる。
【0179】
残りの3つの隅円Ct1,Ct2,Ct3についても,同様の方法で円錐パラメータを求めることができる。
【0180】
[式の導出方法C]補助円の円錐パラメータの導出
図16のように,球面上の3つの円C2,C3,Ct0は互いに接しており,円C2,C3,の接点は極P*,円C2,Ct0の接点はP02,円C3,Ct0の接点はP03である。3点P*,P02,P03を通る円をCs0とする。円錐OCs0の軸方向単位ベクトルを未知ベクトルw≡(x,y,z)とし,半頂角を未知数τとする。
【0181】
座標−u2≡(−a2,−b2,−c2)の点をO2とする。同様に,座標−u3,ut0の点をそれぞれO3,Ot0とする。O2,O3,Ot0は,それぞれ円C2,C3,Ct0の球面上での中心となる。
【0182】
図17のように,球面3角形O2O3Ot0を作る。点P*,P02,P03は,それぞれ辺O2O3,辺O2Ot0,辺O3Ot0の上にある。座標−w≡(−x,−y,−z)の点をOs0とする。Os0は,図のように球面上における円Cs0の中心となる。
【0183】
円Cs0は,3点P*,P02,P03を通る円であるが,それと同時に球面3角形O2O3Ot0の内接円でもある。
【0184】
上述のように内接円であることは以下の点から明らかである。
・3辺相等により,△Os0P*O3≡△Os0P03O3,ゆえに∠Os0P*O3=∠Os0P03O3である。同様に,∠Os0P03Ot0=∠Os0P02Ot0,∠Os0P02O2=∠Os0P*O2となる。
・また,∠Os0P03O3=π−∠Os0P03Ot0,∠Os0P02Ot0=π−∠Os0P02O2,∠Os0P*O2=π−∠Os0P*O3である。
・∠Os0P03O3=ρとして,これを以上の関係に当てはめると,ρ=π−ρとなりρ=π/2が得られる。したがって,Os0P*⊥O2O3,Os0P02⊥O2Ot0,Os0P03⊥O3Ot0である。
・よって,円Cs0は球面3角形O2O3Ot0に接する。
【0185】
したがって,円錐OCs0は,平面OO2O3と平面OO2Ot0に接する。そのため,ベクトル−wと平面OO2O3がなす角は,ベクトル−wと平面OO2Ot0がなす角に等しい(ともにπ−τである)。
【0186】
平面OO2O3はxy平面である。よって,ベクトル−wとz軸のなす角は,ベクトル−wと平面OO2Ot0の法線がなす角に等しい(ともにτ−π/2である)。これを式で表すと次のようになる。ただしez≡(0,0,1)である(本明細書において,eはベクトルを表す)。
【0187】
【数61】
平面OOs0P*は,点P*≡(−1,0,0)を通り,平面OO2O3に垂直である。したがって,ベクトルw≡(x,y,z)はxz平面内にあるので
【0188】
【数62】
となり,w=(x,0,z)である。また,u2=(a2,b2,0),ut0=(at0,bt0,ct0)なので,式(122)は次のようになる。
【0189】
【数63】
一方,|u2×ut0|は次のように表される。
【0190】
【数64】
さらに,k2≡a2/b2なので,式(124)は次のようになる。
【0191】
【数65】
また,sinαt0>0,k2>k3なので,式(21)より次式が得られる。
【0192】
【数66】
式(21),(126)を式(125)に代入して整理すると,次式が得られる。この式をl0とする。
【0193】
【数67】
|w|=1からx2+z2=1である。z<0なので,x,zは次式のようになる。
【0194】
【数68】
円錐面Cs0はP*を通るので,以下のようにしてcosτが得られる。ただしex≡(1,0,0)である。
【0195】
【数69】
残りの3つの補助円Cs1,Cs2,Cs3についても,同様の方法で円錐パラメータを求めることができる。
【0196】
[式の導出方法D]小判型形状の縦長・横長判定式の導出
小判型形状の形状を変化させて,横長から縦長へと切り替わる瞬間を考える。この状態では,円Ct0とCt1が一致するので,ut0=ut1かつαt0=αt1である。
・ut0=ut1であればbt0=bt1であり,式(19),(25)よりl4=l5となり,更に式(17),(23)よりk4=k5となる。
・逆に,k4=k5であれば,式(17),(23)よりl4=l5となり,ut0=ut1かつαt0=αt1となる。
【0197】
よって,円Ct0とCt1が一致することの必要十分条件はk4=k5である。これに式(16),(22)を代入し整理すると,次式が得られる。この式を判定式Daとする。
【0198】
【数70】
式(13)よりk0,k1はそれぞれμ0,μ1に対して単調増加である。そのため,可動領域を横に広げると(μ0減少,またはμ1増加),Daの値は減少する。
【0199】
同様に,式(14)よりk2,k3はそれぞれν0,ν1に対して単調減少である。そのため,可動領域を縦に広げると(ν0減少,またはν1増加),Daの値は増加する。
【0200】
したがって,Daの値を使って,図24に示すように,次のように小判型領域形状の縦長・横長を判定できる。
【0201】
S2401において,Da<0が成り立てば,横長であると判断される(S2405)。
【0202】
S2403において,Da>0が成り立てば,縦長であると判断される(S2407)。
【0203】
S2403において,「いいえ」であれば,連続した1つの円であると判断される(S2409)。
【0204】
[式の導出方法E]マトリクスとモノポーラ球面座標の関係式の導出
捻りが0の状態における子骨のy軸およびz軸の方向の単位ベクトルを,それぞれvy,vzとする。vy,vzは,それぞれモノポーラグリッドの+ν方向および−μ方向である。
子骨の向きを表す単位ベクトルをv≡(x,y,z)とする。vの偏微分を次のようにvμ,vνとする。
【0205】
【数71】
vy,vzは,それぞれvν,−vμを正規化したものなので,次式で表される。
【0206】
【数72】
vy,vzを求めるにあたり,まず下記のようにM,Nの偏微分を計算しておく。
【0207】
【数73】
これらを利用してT≡2/(M2+N2+1)の偏微分を求めると,次のようになる。
【0208】
【数74】
これらを利用してx=T−1,y=TN,z=−TMの偏微分を求めると,それぞれ次のようになる。
【0209】
【数75】
T(M2+N2+1)=2を利用して計算すると,次式が得られる。
【0210】
【数76】
同様に次式が得られる。
【0211】
【数77】
よって,vy,vzは次式のようになる。
【0212】
【数78】
子骨の向きを表すマトリクスを次のようにMとする。
【0213】
【数79】
曲げおよび捻りを表すマトリクスを,それぞれMb,Mtとする。マトリクスの要素の並びは,列ベクトルに対して左からマトリクスを掛ける方式とする。
【0214】
曲げマトリクスMbの要素は,式(3),(4),(5),(150),(151)より次のようになる。
【0215】
【数80】
捻りマトリクスMtの要素は次式のようになる。ただし,Sλ≡sinλ,Cλ≡cosλである。
【0216】
【数81】
[元曲げ方式の場合]
曲げの後に捻りを掛けるので,Mは次のようになる。この式を使えばλ,μ,νからMを求めることができる。
【0217】
【数82】
逆にMからλ,μ,νを求める手順は,以下のようになる。まずTを求めると,
【0218】
【数83】
となるが,この式はm00≒−1の場合に桁落ちにより精度が悪くなる。そのような場合には,
【0219】
【数84】
を利用して
【0220】
【数85】
によりTを求める。μ,νは次式により得られる。
【0221】
【数86】
次に,λを求めるに次式を利用する。
【0222】
【数87】
すると,
【0223】
【数88】
となり,次式が得られる。
【0224】
【数89】
よって,次式のようにλが得られる。
【0225】
【数90】
[元捻り方式の場合]
捻りの後に曲げを掛けるので,Mは次のようになる。この式を使えばλ,μ,νからMを求めることができる。
【0226】
【数91】
Mからλ,μ,νを求める式は,元曲げ方式の場合と同様の方法により得られる。
【0227】
[本発明の実施例の処理および構成例]
図25は,本願発明の実施例の装置構成を示す図である。コンピュータ2500には,キーボード2505,マウス2506,ペン2508を含むタブレット2507,ディスプレイ2501が接続されている。ディスプレイ2501上には,キャンバス2502が表示され,キャンバス2502上に図形が描画されている(2503)。
【0228】
図26は,本願発明の実施例のハードウエア構成を示す図である。CPU2601にバス2607が接続されている。バス2607には,メモリ2602,種々の入力装置2603,ディスプレイ等の表示装置2604及びプリンタ2605が接続されている。
【0229】
図27に本願発明の実施例を示す。図27を参照すると,まず,モノポーラ球面座標系によって,子骨の角度範囲を構成する境界円を設定する(S2701)。具体的には,例えばμ,νの上下限,形状(矩形か小判型か)等を指定する。そして,子骨の角度が,角度範囲の中(すなわち内側)にあるか否かを判定する(S2703)。子骨の角度が角度範囲の外にあると判定された場合には,上述の最近点を求める手法を用いて,子骨の角度を修正する(S2705)。そして,骨格モデルを画面に表示する。なお,ロボット等の実空間の対象物の制御を行う場合は,所望の角度に子骨を向ける制御を行う(S2707)。
【0230】
図28は,子骨の制御を行う制御装置の実施例を示す。まず,モノポーラ球面座標系によって,子骨の角度範囲を構成する境界円を設定する(2801)。そして,子骨の角度が,角度範囲の中(すなわち内側)にあるか否かを判定する(2803)。子骨の角度が角度範囲の外にあると判定された場合には,上述の最近点を求める手法を用いて,子骨の角度を修正する(2805)。そして,骨格モデルを画面に表示する(2807)。なお,ロボット等の実空間の対象物の制御を行う場合は,所望の角度に子骨を向ける制御を行う(2808)。また,各種の数値を設定するための入力手段(2806)を設けてもよい。
【0231】
本願明細書では,親骨に対する子骨の角度の制御を例示して,説明を行った。なお,本願発明は,3つ以上の骨が関節によって連結された骨格モデルに拡張して適用できることは言うまでもない。
【0232】
以上,本願発明について説明したが,本願発明の範囲は,本願明細書における上記実施例に限定されるものではない。当業者は,本願明細書の説明から,本願発明の変形態様を理解することができる。そして,これらの変形態様及びその均等物も,特許請求の範囲に係る技術的範囲に属することは言うまでもない。
【0233】
また,請求項に定義された各々のステップは,記載された順序通りに実行される必要はなく,矛盾の生じない範囲で,請求項に定義されたステップは,順番を変更して実行できる。そして,請求項のステップの順番を変更したものも,当該請求項の技術的範囲に包含されることは言うまでもない。
【符号の説明】
【0234】
P* モノポーラ球面座標系の極
v 子骨の向きを表す単位ベクトル
Pm 最近点
【技術分野】
【0001】
本発明は,骨格モデルにおける各々の骨の角度すなわち回転(曲げ,捻り等)の制御に関する。
【背景技術】
【0002】
CGキャラクタ等を動かしてポーズやアニメーションを作る際に,複数の骨を関節で繋いだ骨格モデル(スケルトンモデル)(図1(a))が使われる場合がある。このような骨格モデルは,仮想空間ばかりでなく,ロボット制御等の実空間における対象物を制御する場合にも用いられ得る。
【0003】
本願明細書では,図1(b)のように関節の両側の骨のうち一方を親骨,他方を子骨と呼ぶことにする。関節の回転(曲げ,捻り)の状態は,親骨を基準とした子骨の向きで表すことができる。骨の向きを表すために,各々の骨に対して図1(b)のように座標系が定められる。図1(b)の座標系では,x軸回転が捻り,y軸回転とz軸回転が曲げとなる。
【0004】
三次元(3D)仮想空間又は実空間上で人体モデル,動物,構造物等の姿勢(ポーズ,動き等)を制御する際に用いられるこのような骨格モデルにおいては,図1(a)に示す各々の骨および関節の位置,角度,回転(曲げ,捻り)等を意図したとおりに制御することが必要となる。図1(a)に示される骨格モデルでは,各々の骨は関節で結合されており,各々の骨の動きが他の骨の動きに影響を与える。従来から,骨格をモデル化し,骨格モデルを制御するする手法として,種々のものが提案されている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2000−306116
【特許文献2】特開2009−070340
【特許文献3】特開2010−170279
【特許文献4】米国特許公開公報2010182329号明細書
【発明の概要】
【発明が解決しようとする課題】
【0006】
例示として,図1(a)の骨格モデルを用いた場合を想定する。この骨格モデルは,人間の骨格をモデル化したものである。したがって,例えば,肘から先の腕の可動範囲には,一定の制限がある。この制限を超えた角度(曲げ,捻り)に腕を曲げるポーズを取らせることは,現実の人間に対するモデルからかけ離れたものになる。人間として自然なポーズを取る骨格モデルを形成するためには,たとえば肘の関節から先の骨の可動範囲に対して,一定の制限を課すことが必要となる。
【0007】
従来では,特許文献1に開示されるように,たとえば親骨に対する子骨の向きを親骨の座標系を基準とした3軸(x,y,z)の各軸回りの回転角度で表現するものがある。
【0008】
特許文献2には,関節を中心点とする球面上の所与の点を焦点とし,関節に対応する中心点と焦点とを結ぶ軸に直交する平面を射影面とし,関節の可動範囲を,射影面上において設定する技術が開示されている。
【0009】
特許文献3及び特許文献4には,子骨の向きが,予め定められた可動範囲内に収まっていない場合には,可動範囲の形状に応じた条件を満たすように,前記親骨に対する前記子骨の向きを補正する発明が開示されている。
【0010】
上述のような従来の骨格の制御方法では,設計者の意図とはかけ離れた可動範囲となってしまうという問題が指摘されていた。また,この問題をある程度解決する手法として,特許文献2,特許文献3及び特許文献4に開示された技術が提案されている。しかしながら,これらの技術においては,必要な計算量は比較的少ないものの,多関節のモデルをリアルタイムに動かす等の場合には,計算量の更なる軽減が求められる。
【0011】
したがって,より多様な骨格モデルに柔軟に対応でき,より簡便な処理で,骨格モデルを制御する手法の実現が望まれている。本発明は,上述のような,従来技術の欠点を解決することを目的としている。なお,ここで取り上げた課題及び本願発明の目的は,例示的なものである。したがって,本願発明の目的が,上述の記載に限定されるものではない点に留意すべきである。
【0012】
本願明細書では,便宜上,実施例として仮想空間上に形成され得る骨格モデルの制御を取り上げて説明を行う。しかしながら,本発明の適用範囲は,仮想空間に限られるものではない。たとえば,ロボットの制御等の物理的構造物の位置や角度(曲げ,捻り等を含む)の制御に利用することも当然に意図されている。すなわち,本発明は,仮想空間及び実空間の双方の骨格モデルを対象とするものであることに特に留意すべきである。また,本発明は,本願明細書で取り扱う特定の骨格モデルに限定されるものでもない。
【課題を解決するための手段】
【0013】
本願発明は,親骨と子骨とが関節によって連結された骨格モデルにおいて,前記親骨に対する前記子骨の前記関節における角度範囲を制限することによって前記子骨の動作を制御するための方法であって,前記関節を中心とする球の球面上に,前記子骨の角度範囲の境界を定義する角度範囲境界円を設定する角度範囲境界円設定ステップであって,前記角度範囲境界円は前記関節を中心とする球面と親骨または親骨の延長線との交点1を通るものであり,前記子骨又は前記子骨の延長線と前記球面の交点2の位置が前記角度範囲境界円によって二分される前記球面の何れに存在すべきかによって前記子骨の角度範囲が定められ,前記球の中心と前記角度範囲境界円とで形成される円錐の軸単位ベクトルu及び前記円錐の半頂角α,または,前記軸単位ベクトルu及び前記半頂角αを導くことができる数値をメモリに格納することによって前記角度範囲境界円を設定する,角度範囲境界円設定ステップと,前記メモリに格納された数値を読み出すことによって前記軸単位ベクトルuと前記半頂角αとを得て,前記子骨の向きを表す単位ベクトルvを用いて,u・v−cosαの値を検査値として算出し,前記検査値に基づいて,前記子骨の角度が前記角度範囲の中にあるか否かを判定する,角度範囲判定ステップと,を有する,方法を提供する。なお,上記の式(v・u)の演算は,ベクトルvとベクトルuの内積を意味する。
【0014】
また,本願発明は,更に 前記関節を原点とし,前記交点1から前記原点に向かう方向をx軸の正方向とする,三次元直交座標系(x,y,z)から,
μ=2tan−1(−z/(x+1))
ν=2tan−1(y/(x+1))
の関係を有する,モノポーラ球面座標系(μ,ν)を用いて,前記角度範囲境界円が,少なくともμ=μe及びν=νeのうち何れか一方を満たす(ここにおいて,μe及びνeは定数)ようにしてもよい。
【0015】
本願発明は,更に,前記交点2の前記モノポーラ球面座標を(μ,ν)とし,μの下限及び上限をそれぞれμ0,μ1とし,νの下限及び上限をそれぞれν0,ν1とした場合に,前記角度範囲が,μ0<μ<μ1及びν0<ν<ν1を満たすよう前記角度範囲境界円を設定してもよい。
【0016】
本願発明は,更に,前記角度範囲境界円が,前記交点1を通らない補助角度範囲境界円を更に用いるようにしてもよい。すなわち,この補助角度範囲境界円を角度範囲判定ステップで用いてもよい。
【0017】
本願発明は,前記角度範囲判定ステップにおいて,前記子骨の角度が前記角度範囲の中に無いと判定された場合,前記交点2から前記角度範囲の中にあることを満たす球面上の点まで前記球面上に沿って測定した距離が最短となる前記球面上の点に,前記交点2を移動させことにより,前記子骨の角度を修正する,角度修正ステップ,を更に有してもよい。
【0018】
また,本願発明は,上記方法を実行する命令を有するプログラムとして実現されてもよい。あるいは,本願発明は,上記方法を実現する手段を有する装置として実現されてもよい。
【発明の効果】
【0019】
本願発明により,骨格の角度を簡便な手法で制御することができる。なお,本願発明の効果は,この点に限定されるものではない。
【図面の簡単な説明】
【0020】
【図1】スケルトンモデル,親骨,子骨,及び座標系を示す図。
【図2】モノポーラ球面座標を示す図((b)は,(a)を反対側から見た図)。
【図3】平面群と単位球面の交線が縦グリッドとなることを示す図。
【図4】平面群と単位球面の交線が横グリッドとなることを示す図。
【図5】平面の向きとφ,θとの関係を示す図。
【図6】xz平面上の点Pのφ,μを示す図。
【図7】xy平面上の点Pのθ,νを示す図。
【図8】矩形領域による角度制限を示す図。
【図9】小判型領域による角度制限(横長形状)を示す図。
【図10】小判型領域による角度制限(縦長形状)を示す図。
【図11】矩形領域の内外判定を模式的に示す図。
【図12】小判型領域(横長)の補助円を示す図。
【図13】小判型領域(縦長)の補助円を示す図。
【図14】円領域Cに対する,点Pからの最近点Pnを示す図。
【図15】矩形領域の4頂点を示す図。
【図16】球面上で互いに接する3円C2,C3,Ct0を示す図。
【図17】球面3角形O2O3Ot0と内接円を示す図。
【図18】矩形領域の内外判定の手順を示す図。
【図19】横長の小判型領域の内外判定の手順を示す図。
【図20】縦長の小判型領域の内外判定の手順を示す図。
【図21】矩形領域に対する最近点を求める手順を示す図。
【図22】横長の小判型領域に対する最近点求める手順を示す図。
【図23】縦長の小判型領域に対する最近点求める手順を示す図。
【図24】小判型領域形状が縦長か横長かを判定する手順を示す図。
【図25】本発明の実施例の装置構成を示す図。
【図26】本発明の実施例のハードウエア構成を示す図。
【図27】本発明の実施例の手順を示す図。
【図28】本発明の実施例の構成を示す図。
【図29】曲げと捻りの修正の手順を示す図。
【発明を実施するための形態】
【0021】
[1.モノポーラ球面座標]
上述のように,スケルトンモデル(図1(a))の骨の向きを表すために,各骨に対して図1(b)のように座標系を定める。
【0022】
関節を中心とする単位球面(半径1の球面)を作り,子骨のx軸(x>0の部分)と球面との交点をPとすると,関節の曲げ状態は,球面上の点Pの位置で表すことができる。関節の回転(曲げ,捻り)を表現する方法の一つに,3軸の回転角(オイラー角)を使う方法がある。例として,親骨の座標系を基準にx軸回転,z軸回転,y軸回転の順に回転を掛けた場合,各軸の回転角と点Pの位置との関係に注目すると,y軸回転角が経度に,z軸回転角が緯度に相当する。そこで,y軸回転角,z軸回転角を等間隔にとって球面上にグリッドを作ると,地球儀の経線・緯線と同様の形状になる。北極と南極に相当する2点が角度表現上の特異点となるため,扱いにくいという問題がある。
【0023】
これに対して,特異点を1個に減らす手法として,射影を用いる方法(特許文献2,特許文献3,特許文献4)が知られている。この手法の特性を球面上のグリッドで表すと図2のようになる。このグリッドは,球面上に作られた座標系と捉えることができる。極(特異点)が1個であることから,本願明細書では,この座標系を「モノポーラ球面座標」と呼ぶことにする。
【0024】
以下,このモノポーラ球面座標に関して,次の項目について述べる。
・射影を使わずに球面上にモノポーラ球面座標系を構成する手法
・モノポーラ球面座標を使って関節の角度制限を行なう手法
[2.モノポーラ球面座標系の構成]
一般に2次元の座標系に目盛りをつけるとグリッド(格子)となる。以下の説明では,便宜上「グリッド」という用語を用いる場合があるが,その表すものは,単なる格子ではなく座標系の意味を含むものとする。
【0025】
座標(−1,0,0)の点をP*とし,「極」と呼ぶことにする。極P*を通りy軸に平行な直線をlyとし,図3のように,lyを含む等角度間隔の平面群を用意する。この平面群と単位球面との交線をグリッドの縦線とする。
【0026】
同様に,極P*を通りz軸に平行な直線をlzとし,図4のように,lzを含む等角度間隔の平面群を用意する。この平面群と単位球面との交線をグリッドの横線とする。
【0027】
図5のように,直線lyを含む平面の向きを角度φで表し,直線lzを含む平面の向きを角度θで表す。φ,θの符号は,図中に示す方向を正とする。球面上の点Pの位置は,φによって決まる平面,θによって決まる平面,および単位球面の3つの面の交点として決まる。μ≡2φ,ν≡2θとし,μ,νを使って球面上の位置を表す。
【0028】
φ,θをそのまま使わずにμ,νを使うことにより,次のようなメリットがある。図6のように,点Pがxz平面上にある(即ちν=0である)場合を考える。子骨の向きはOPである。座標(1,0,0)の点をQとする。
【0029】
∠OP*P=∠OPP*=φ
∠OP*P+∠OPP*=∠QOP
∴∠QOP=2φ=μ
したがって,ν=0の場合には,μは子骨のy軸回りの回転角となる。同様に,図7のように,点Pがxy平面上にある(即ちμ=0である)場合には,νは子骨のz軸回りの回転角となる。
【0030】
このように,μ,νを使うと回転の状態(子骨の向き)を感覚的に把握しやすい。例えば図2は,μ,νの値を10°間隔にとって作ったグリッドであるが,xy平面上およびxz平面上ではグリッドが円周上で10°ずつの等間隔になっていることが分かる。
【0031】
[3.モノポーラ球面座標と子骨の向き]
子骨の向きを表す単位ベクトルをv≡(x,y,z)とし,これをモノポーラ球面座標で表したものを(μ,ν)とする。両者の関係は次式で表される(本明細書においてvはベクトルを表す)。
【0032】
【数1】
ただし,M,N,Tは次のとおりである。
【0033】
【数2】
式の導出方法については,後述する([式の導出方法A]を参照)。
【実施例】
【0034】
以下,具体的な角度(曲げ,捻り)の制御について詳細に述べる。
【0035】
[4.可動領域の設定]
[4.1 矩形領域による角度制限]
μ,νの値に上限,下限を設定することで,図8のように可動領域を設定できる。このような可動領域制限を矩形制限と呼ぶことにする。μの上下限値をそれぞれμ1,μ0とし,νの上下限値をそれぞれν1,ν0とする。
【0036】
式μ=μ0は単位球面上で1つの円を表す。この円をC0とする。円C0によって球の表面は2つの領域に分けられるが,このうち可動領域側(μ>=μ0の領域)を,円C0の「内側」と呼ぶことにする。球面上の円に対する内外判定の際に,後述のように円錐を使って判定を行なう。そこで,以下のように円錐パラメータを求めておく。
【0037】
円C0と球の中心Oとを結んで作られる円錐をOC0とし,円錐OC0の軸方向の単位ベクトルをu0≡(a0,b0,c0)とする(本明細書においてuはベクトルを表す)。u0の方向は可動領域側とする。また,円錐OC0の半頂角(軸u0と円錐面のなす角)をα0とする。これらの値は次式により得られる。
【0038】
【数3】
同様に,式μ=μ1,ν=ν0,ν=ν1が表す円を,それぞれC1,C2,C3とする。円錐OC1,OC2,OC3の中心軸をそれぞれu1≡(a1,b1,c1),u2≡(a2,b2,c2),u3≡(a3,b3,c3)とし,半頂角をそれぞれα1,α2,α3とする。これらの値は次式により得られる。
【0039】
【数4】
値の範囲が−π<μ0<μ1<π,−π<ν0<ν1<πなので,次式が成り立つ。
【0040】
【数5】
なお,今後扱う他の可動領域についても,球面上の円は可動領域側を「内側」とし,円錐の軸ベクトルの向きは可動領域側とする。
【0041】
[4.2 小判型領域による角度制限]
矩形制限を用いて骨格モデルを動かすと,可動領域の角部に引っ掛かり,滑らかでない動きになることがある。この挙動を改善するために,以下のように小判型の可動領域を設定する。
【0042】
[4.2.1 隅円の作成]
図9,図10のように,矩形領域の3辺に接する隅円を作り,角部を取り除く。元の矩形領域の形状によって,図9のようにC2,C3の一部が残る場合と,図10のようにC0,C1の一部が残る場合とがある。前者の形状を「横長」,後者の形状を「縦長」と呼ぶことにする。
【0043】
横長形状の場合,図9のように,μ0側の隅円(C0,C2,C3に接する円)をCt0とし,μ1側の隅円(C1,C2,C3に接する円)をCt1とする。
【0044】
縦長形状の場合,図10のように,ν0側の隅円(C0,C1,C2に接する円)をCt2とし,ν1側の隅円(C0,C1,C3に接する円)をCt3とする。
【0045】
[4.2.2 隅円の円錐パラメータ]
隅円の円錐パラメータは,以下の計算によって得られる。まず,次のようにk0,k1,k2,k3を定義する。
【0046】
【数6】
−π<μ0<μ1<π,−π<ν0<ν1<πなので,k0<k1,k2>k3である。次式により領域形状の縦長・横長を決定する。
【0047】
【数7】
Da<0ならば横長,Da>0ならば縦長である。Da=0の場合には,2つの隅円は連続した1つの円となる。隅円の円錐パラメータは,以下の手順によって求められる。
【0048】
[Da<=0の場合(横長または円形状)]
円錐OCt0の軸方向の単位ベクトルをut0≡(at0,bt0,ct0)とし,半頂角をαt0とする。これらの値は,以下の計算によって得られる。
【0049】
【数8】
円錐OCt1の軸単位ベクトルut1≡(at1,bt1,ct1)および半頂角αt1は,以下の計算によって得られる。
【0050】
【数9】
[Da>0の場合(縦長形状)]
円錐OCt2の軸単位ベクトルut2≡(at2,bt2,ct2)および半頂角αt2は,以下の計算によって得
られる。
【0051】
【数10】
円錐OCt3の軸単位ベクトルut3≡(at3,bt3,ct3)および半頂角αt3は,以下の計算によって得られる。
【0052】
【数11】
以上の円錐パラメータ計算式の導出方法については,後述する(「式の導出方法B」を参照)。また,判定式Daの導出方法については,後述する([式の導出方法D]を参照)。
【0053】
[5.可動領域に対する内外判定]
「5.1 円錐を使った内外判定」
矩形制限,小判型制限のいずれも,可動領域の形状は複数の円を組み合わせたものになっている。そのため,可動領域に対する内外判定は,円領域に対する内外判定の組み合わせとなる。円領域に対する内外判定は,以下のように円錐を使って実現できる。
【0054】
子骨の向き(x軸の向き)を表す単位ベクトルをv≡(x,y,z)とする。球面上の円Cが与えられ,円錐OCの軸単位ベクトルがu≡(a,b,c)で,半頂角がαであるとする。ベクトルvの円錐OCに対する内外判定は,以下のように実現できる。
【0055】
vとuのなす角がα以下であることが,vが円錐OCの内側にあることの必要十分条件である。この条件を式で表すと,次のようになる。
【0056】
【数12】
角度範囲[0,π]においてcosは単調減少なので,次式のように変形できる。
【0057】
【数13】
判定式Dを次のように定義すると,Dの正負によって円錐OCに対する内外を判定できる。
【0058】
【数14】
D>=0であれば円錐内,そうでなければ円錐外である。
【0059】
この判定式は,平面を使った判定と見ることもできる。法線ベクトルが(a,b,c)で原点からの距離がcosαの平面を,平面κとする。判定式Dの値は,点(x,y,z)の平面κからの符号付きの距離(u方向が正)を意味する。したがって,Dの正負による判定は,点(x,y,z)が平面κの表裏どちら側にあるかを判定していることになる。
【0060】
判定式Dの平面式としての解釈は,次のように理解できる。一般に,球面上の円は,球と「その円を含む平面」との交線として捉えられる。そのため,球面上の円領域に対する内外判定は,平面による判定を使って実現できる。式D=0が表す平面は,円Cを含む平面になっている。
【0061】
[5.2 矩形領域の内外判定]
図11のように,子骨の向きvが円C0,C1,C2,C3全てに対して内側にある場合のみ,矩形領域内となる。図18に示すように,以下の手順によって,領域に対する内外判定を行なう。
【0062】
S1801において,円C0による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1811)。この判定が「はい」であれば,S103に次に進む。
【0063】
S1803において,円C1による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1811)。この判定が「はい」であれば,S105に次に進む。
【0064】
S1805において,円C2による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1811)。この判定が「はい」であれば,S107に次に進む。
【0065】
S1807において,円C3による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1811)。この判定が「はい」であれば,領域内と判定される(S1809)。
【0066】
[5.3 小判型領域の内外判定]
[5.3.1 補助円の作成]
小判型領域の内外判定には,領域形状を構成する円(C0〜C3,Ct0,〜Ct3)だけでなく,以下に述べる補助円を使う。
【0067】
[横長形状の場合]
領域形状が横長の場合,図12のように補助円を作る。円Ct0とC2の接点をP02とし,円Ct0とC3の接点をP03とする。点P*,P02,P03の3点を通る円を,補助円Cs0とする。円Cs0の「内側」は,小判型領域の中央の側とする。
【0068】
円錐OCs0の軸単位ベクトルを(as0,bs0,cs0)とし,半頂角をαs0とする。これらの値は,以下の計算によって得られる。
【0069】
【数15】
同様に,円Ct1とC2の接点をP12とし,円Ct1とC3の接点をP13とする。点P*,P12,P13の3点を通る補助円をCs1とする。円錐OCs1の軸単位ベクトル(as1,bs1,cs1)と半頂角αs1は,以下の計算によって得られる。
【0070】
【数16】
[縦長形状の場合]
領域形状が縦長の場合は,図13のように補助円を作る。円Ct2とC0の接点をP20とし,円Ct2とC1の接点をP21とする。点P*,P20,P21の3点を通る補助円をCs2とする。円錐OCs2の軸単位ベクトル(as2,bs2,cs2)と半頂角αs2は,以下の計算によって得られる。
【0071】
【数17】
円Ct3とC0の接点をP30とし,円Ct3とC1の接点をP31とする。点P*,P30,P31の3点を通る補助円をCs3とする。円錐OCs3の軸単位ベクトル(as3,bs3,cs3)と半頂角αs3は,以下の計算によって得られる。
【0072】
【数18】
以上の円錐パラメータ計算式の導出方法については,後述する([式の導出方法C]を参照)。
【0073】
[5.3.2 補助円を使った内外判定]
[横長形状の場合]
横長の小判型領域の内外判定には,Ct0,Ct1,C2,C3,Cs0,Cs1の6つの円を使う。図19に示すように以下の手順によって,領域に対する内外判定を行なう。
【0074】
S1901において,円C2による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1913)。この判定が「はい」であれば,S1903に次に進む。
【0075】
S1903において,円C3による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S1913)。この判定が「はい」であれば,S1905に次に進む。
【0076】
S1905において,円Cs0,Cs1による内外判定で,ともに内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S1911)。この判定が「いいえ」であれば,S1907に進む。
【0077】
S1907において,円Ct0による内外判定で,内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S1911)。この判定が「いいえ」であれば,S1909に進む。
【0078】
S1909において,円Ct1による内外判定で,内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S1911)。この判定が「いいえ」であれば,領域外と判定する(S1913)。
[縦長形状の場合]
縦長の小判型領域の内外判定には,Ct2,Ct3,C0,C1,Cs2,Cs3の6つの円を使う。図20に示すように以下の手順によって,領域に対する内外判定を行なう。
【0079】
S2001において,円C0による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S2013)。この判定が「はい」であれば,S2003に次に進む。
【0080】
S2003において,円C1による内外判定で,内側か否かの判定を行う。この判定が「いいえ」であれば,領域外と判定される(S2013)。この判定が「はい」であれば,S2005に次に進む。
【0081】
S2005において,円Cs2,Cs3による内外判定で,ともに内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S2011)。この判定が「いいえ」であれば,S2007に進む。
【0082】
S2007において,円Ct2による内外判定で,内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S2011)。この判定が「いいえ」であれば,S2009に進む。
【0083】
S2009において,円Ct3による内外判定で,内側か否かの判定を行う。この判定が「はい」であれば,領域内と判定する(S2011)。この判定が「いいえ」であれば,領域外と判定する(S2013)。
【0084】
[6.捻り角]
[6.1 曲げと捻りの順序]
子骨の捻り角をλとし,捻りを含めたモノポーラ球面座標をλ,μ,νで表す。曲げと捻りの順序は,次の2とおりが考えられる。
・曲げた後に,子骨のx軸回りに捻る。
・x軸回りに捻り,その後に曲げる。
前者を「元曲げ」,後者を「元捻り」と呼ぶことにする。
【0085】
[6.2 捻り角の定義]
捻り角を扱うには,捻り角λ=0の状態を定義する必要がある。まず,元曲げ方式について説明する。関節の曲げ状態は,球面上の点P(子骨のx軸と単位球面との交点)の位置で表すことができる。これに対して捻りは,軸OP回りの回転として表される。子骨のy軸,z軸がグリッドの向き(それぞれ+ν方向,−μ方向)と合っている状態を,捻り角が0であると定義する。
【0086】
元捻り方式の場合は,捻りによってグリッド自体がx軸(親骨のx軸)回りにλだけ回転する。捻りの後に曲げを掛けても,子骨のy軸,z軸は,回転後のグリッドの向き(それぞれ+ν方向,−μ方向)と常に一致するものとする。
【0087】
[6.3マトリクスとモノポーラ球面座標の関係]
子骨の向きを表すマトリクスを,次式のようにMとする。マトリクスの要素の並びは,列ベクトルに対して左からマトリクスを掛ける方式とする(本明細書でMはマトリクスを表す)。
【0088】
【数19】
マトリクスMb,Mtを次のように定義する。ただし,M,N,Tは式(6),(7)のとおりとする。
【0089】
【数20】
Mbは曲げ,Mtは捻りを表すりマトリクスである。曲げだけを作用させたときの,子骨の向きを表す単位ベクトルを,vb≡(xb,yb,zb)とする。vbはMbの第1列(最も左の列)になるので,次式のようになる。
【0090】
【数21】
vbからT,M,Nを求める式は次のようになる。
【0091】
【数22】
x≒−1の場合に別の式を使うのは,桁落ちによる精度の低下を避けるためである。
【0092】
[6.3.1 元曲げ方式]
Mからλ,μ,νを求める手順は,以下のようになる。m00≒−1の場合に別の式を使うのは,桁落ちによる精度の低下を避けるためである。
【0093】
【数23】
逆に,λ,μ,νからMを求めるには,式(64),(65)を使ってMb,Mtを求め,これを次式に代入する。
【0094】
【数24】
Mからλ,vbを求めるには,式(70)および次式を使う。
【0095】
【数25】
逆に,λ,vbからMを求めるには,式(67),(68),(69)を使ってT,M,Nを求め,これを式(64)に代入し,式(65),(74)を使う。
【0096】
[6.3.2 元捻り方式]
Mからλ,μ,νを求める手順は,以下のようになる。
【0097】
【数26】
逆に,λ,μ,νからMを求めるには,式(64),(65)を使ってMb,Mtを求め,これを次式に代入する。
【0098】
【数27】
Mからλ,vbを求めるには,式(76)および次式を使う。
【0099】
【数28】
逆に,λ,vbからMを求めるには,式(67),(68),(69)を使ってT,M,Nを求め,これを式(64)に代入し,式(65),(80)を使う。
【0100】
計算式の導出方法については,後述する([式の導出方法E]を参照)。
【0101】
[6.4 四元数とモノポーラ球面座標の関係]
子骨の向きを表す四元数(クォータニオン)を,次式のようにqとする。
【0102】
【数29】
四元数qb,qtを次のように定義する。
【0103】
【数30】
qbは曲げ,qtは捻りを表す四元数である。
【0104】
[6.4.1 元曲げ方式]
qからλ,μ,νを求める式は,以下のようになる。
【0105】
【数31】
逆に,λ,μ,νからqを求めるには,式(83),(84)を使ってqb,qtを求め,これを次式に代入する。
【0106】
【数32】
qからλ,vbを求めるには,式(85)および次式を使う。
【0107】
【数33】
逆に,λ,vbからqを求めるには,式(67),(68),(69)を使ってT,M,Nを求め,これを式(83)に代入し,式(84),(88)を使う。
【0108】
[6.4.2 元捻り方式]
qからλ,μ,νを求める式は,以下のようになる。
【0109】
【数34】
逆に,λ,μ,νからqを求めるには,式(83),(84)を使ってqb,qtを求め,これを次式に代入する。
【0110】
【数35】
qからλ,vbを求めるには,式(85)および次式を使う。
【0111】
【数36】
逆に,λ,vbからqを求めるには,式(67),(68),(69)を使ってT,M,Nを求め,これを式(83)に代入し,式(84),(93)を使う。
【0112】
[7.可動領域外の場合の修正方法]
関節の曲げが可動領域外となった場合に,これを可動領域内に修正する方法について説明する。関節の曲げ状態は,単位球面上の点Pの位置で表される。Pの位置を可動領域内(境界を含む)に修正した点をPmとする。
【0113】
球面上の領域Aと,領域A外の球面上の点Pとが与えられたとき,領域境界上の点のうち,Pからの距離(球面上での距離)が最小となる点を,「領域Aに対するPの最近点」と呼ぶことにする。可動領域と点Pのみが与えられた場合,可動領域に対するPの最近点をPmとするのが最良であると考えられる。そこで,最近点を用いた修正方法について述べる。
【0114】
[7.1 円領域に対する最近点]
矩形制限,小判型制限のいずれも,可動領域の形状は複数の円を組み合わせたものになっている。そのため,可動領域に対する最近点を得るには,円領域に対する最近点を求める必要がある。
【0115】
図14のように,子骨の向き(x軸の向き)を表す単位ベクトルをv≡(x,y,z)とし,点Pの座標を(x,y,z)とする。球面上の円Cが与えられ,円錐OCの軸単位ベクトルがu≡(a,b,c)で,半頂角がαであるとする。円領域Cに対するPの最近点をPnとし,ベクトルOPnをwとする。wは次式により求められる。
【0116】
【数37】
ただしβはvとuのなす角で,0<β<=πである。sinβ>=0なので,sinβ,tanβは次式により得られる。
【0117】
【数38】
sinβ=0となるのはv=−uのときで,その場合は円C上の全ての点が最近点となる。
【0118】
[7.2円領域までの距離]
単位球面上において,点Pが円領域Cの外にあるとする。Pから円Cまでの距離(単位球面上での距離)をγとする。前述(7.1節)の記号を使うと,γ=∠POPn=β−αなので,次式のようになる。
【0119】
【数39】
0<γ<πなので,cosγはγに対して単調減少である。したがって,円領域に対する距離の大小判定には,γの替わりにcosγを使うことができる(ただし大小関係は逆になる)。
【0120】
[7.3 矩形領域に対する最近点]
矩形領域に対する点Pの最近点Pmは,図21に示すように,以下の手順によって得られる。Pは矩形領域の外にあるものとする。また,図15のように,矩形領域の角の4頂点を,それぞれPa,Pb,Pc,Pdとする。
【0121】
S2101において,円C0によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であればS2107に進む。判定が「いいえ」であれば,S2103に進む。
【0122】
S2103において,円C0に対するPの最近点を求め,PnとしS2105に進む。
【0123】
S2105において,円C2,C3によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2127),終了する。判定が「いいえ」であれば,S2113に進む。
【0124】
S2107において,円C1によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であれば,S2113に進む。判定が「いいえ」であれば,S2109に進む。
【0125】
S2109において,円C1に対するPの最近点を求め,PnとしS2111に進む。
【0126】
S2111において,円C2,C3によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2127)終了する。判定が「いいえ」であれば,S3113に進む。
【0127】
S2113において,円C2によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であれば,S2119に進む。判定が「いいえ」であればS2115に進む。
【0128】
S2115において,円C2に対するPの最近点を求め,PnとしS2117に進む。
【0129】
S2117において,円C0,C1によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2127)終了する。判定が「いいえ」であればS2125に進む。
【0130】
S2119において,Pが円C3の外であることが確定する。S2121に進む。
【0131】
S2121において,円C3に対するPの最近点を求め,PnとしS2123に進む。
【0132】
S2123において,円C0,C1によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2127)終了する。判定が「いいえ」であれば,S2125に進む。
【0133】
S2125において,Pa,Pb,Pc,Pdの4点のうちPから最も近い(球面上での距離が最小)のものをPmとし,終了する。
【0134】
[7.4小判型領域に対する最近点]
[横長形状の場合]
横長の小判型領域に対する点Pの最近点Pmは,図22に示すように,以下の手順によって得られる。Pは小判型領域の外にあるものとする。
【0135】
S2201において,円C2によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であれば,S2207に進む。判定が「いいえ」であればS2203に進む。
【0136】
S2203において,円C2に対するPの最近点を求めPnとしS2205に進む。
【0137】
S2205において,円Cs0,Cs1によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2215)として終了する。判定が「いいえ」であればS2213に進む。
【0138】
S2207において,円C3によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であればS2213に進む。判定が「いいえ」であればS2209に進む。
【0139】
S2209において,円C3に対するPの最近点を求めPnとしS2211に進む。
【0140】
S2211において,円Cs0,Cs1によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2215)終了する。判定が「いいえ」であればS2213に進む。
【0141】
S2213において,円Ct0,Ct1のうち,Pからの距離が小さい方に対するPの最近点をPmとし,終了する。
【0142】
[縦長形状の場合]
縦長の小判型領域に対する点Pの最近点は,図23に示すように,以下の手順によって得られる。Pは小判型領域の外にあるものとする。
【0143】
S2301において,円C0によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であればS2307に進む。判定が「いいえ」であればS2303に進む。
【0144】
S2303において,円C0に対するPの最近点を求めPnとし,S2205に進む。
【0145】
S2305において,円Cs2,Cs3によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であればPnをPmとして(S2315)終了する。判定が「いいえ」であれば,S2313に進む。
【0146】
S2307において,円C1によるPの内外判定で,内側か否かの判定を行う。判定が「はい」であれば,S2313に進む。判定が「いいえ」であればS2309に進む。
【0147】
S2309において,円C1に対するPの最近点を求めPnとする。
【0148】
S2311において,円Cs2,Cs3によるPnの内外判定で,ともに内側であるか否かの判定を行う。判定が「はい」であれば,PnをPmとして(S2315)終了する。判定が「いいえ」であればS2313に進む。
【0149】
S2313において,円Ct2,Ct3のうち,Pからの距離が小さい方に対するPの最近点をPmとし,終了する。
【0150】
[7.5 曲げと捻りの修正方法]
関節の回転(曲げ捻り)の状態がマトリクス(または四元数)で与えられ,これを角度制限範囲内に修正する手順は,図29に示すように以下のようになる。
【0151】
S2901で,マトリクス(または四元数)からλ,vbを求める(6.3節,6.4節参照)。
【0152】
S2903で,vbが可動領域内かどうかを調べる(5.2節,5.3節参照)。可動領域外であればvbを修正する(7.3節,7.4節参照)(S2905)。
【0153】
S2907で,λに上下限が設定されていれば,この範囲内にあるかどうかを調べる。この範囲外であればλが上下限の範囲内になるようλを修正する(S2909)。
【0154】
S2911で,λ,vbからマトリクス(または四元数)を求める(6.3節,6.4節参照)。
【0155】
[式の導出方法A]方向ベクトルとモノポーラ球面座標との関係式の導出
子骨の向きを表す単位ベクトルを(x,y,z)とし,これをモノポーラ球面座標で表したものを(μ,ν)とする。モノポーラ球面座標系の構成方法より,座標(x,y,z)の点は,次の2平面上にある。
【0156】
【数40】
式(100)は,xy平面を直線ly回りに角度μ/2だけ回転させた平面で,式(101)は,xz平面を直線lz回りに角度ν/2だけ回転させた平面である。μ,νの取り得る値の範囲は,−π<μ<π,−π<ν<πである。また,(x,y,z)は単位ベクトルなので,
【0157】
【数41】
である。以上の3つの式を連立させて解く。
【0158】
cos(ν/2)≠0なので,式(101)より次式が得られる。ただし,N≡tan(ν/2)である。
【0159】
【数42】
an(μ/2)である。
【0160】
【数43】
式(103),(104)を式(102)に代入すると,xの2次方程式が得られる。これを解いて,解のうちx=−1でないほうを選ぶと,次式のようにxが得られる。ただし,T≡2/(M2+N2+1)である。
【0161】
【数44】
これを式(103),(104)に代入すると,次式のようにy,zが得られる。
【0162】
【数45】
[式の導出方法B]小判型領域隅円の円錐パラメータの導出
円C0,C2,C3に接する円Ct0を求める。円錐OCt0の軸方向単位ベクトルを未知ベクトルw≡(x,y,z)とし,半頂角を未知数τとする(本明細書において,wはベクトルを表す)。
【0163】
円錐OC0の軸単位ベクトルはu0≡(a0,b0,c0),半頂角はα0である。円Ct0は円C0の内側(可動領域側)に接するので,u0とwのなす角はα0−τとなる。したがって,
【0164】
【数46】
となる。cosα0=−a0,sinα0=−c0,b0=0を代入すると
【0165】
【数47】
となり,k0≡a0/c0とおくと,次式が得られる。
【0166】
【数48】
同様に,円錐OC2とOCt0に対してcosα2=−a2,sinα2=b2,c2=0を利用し,k2≡a2/b2とおくと,次式が得られる。
【0167】
【数49】
同様に,円錐OC3とOCt0に対してcosα3=−a3,sinα3=−b3,c3=0を利用し,k3≡a3/b3とおくと,次式が得られる。
【0168】
【数50】
式(109),(110)より次式が得られる。
【0169】
【数51】
式(108),(112)より次式が得られる。
【0170】
【数52】
式(111),(113),(112)より
【0171】
【数53】
となり,x2+y2+z2=1を利用して式を整理し,右辺をk4とおくと,次式が得られる。
【0172】
【数54】
式(112),(114)より
【0173】
【数55】
となる。sinτ>0,k2>k3なので,式(112)よりx+cosτ>0である。よって,上式(115)より次式が得られる。
【0174】
【数56】
式(114),(116)より,次式が得られる。
【0175】
【数57】
ただし,l4は次式のとおりである。
【0176】
【数58】
得られたcosτを使って,式(114)より,次式のようにxが得られる。
【0177】
【数59】
得られたx,cosτを使って,式(111),(113)より,次式のようにy,zが得られる。
【0178】
【数60】
以上により,隅円の円錐OCt0が得られる。
【0179】
残りの3つの隅円Ct1,Ct2,Ct3についても,同様の方法で円錐パラメータを求めることができる。
【0180】
[式の導出方法C]補助円の円錐パラメータの導出
図16のように,球面上の3つの円C2,C3,Ct0は互いに接しており,円C2,C3,の接点は極P*,円C2,Ct0の接点はP02,円C3,Ct0の接点はP03である。3点P*,P02,P03を通る円をCs0とする。円錐OCs0の軸方向単位ベクトルを未知ベクトルw≡(x,y,z)とし,半頂角を未知数τとする。
【0181】
座標−u2≡(−a2,−b2,−c2)の点をO2とする。同様に,座標−u3,ut0の点をそれぞれO3,Ot0とする。O2,O3,Ot0は,それぞれ円C2,C3,Ct0の球面上での中心となる。
【0182】
図17のように,球面3角形O2O3Ot0を作る。点P*,P02,P03は,それぞれ辺O2O3,辺O2Ot0,辺O3Ot0の上にある。座標−w≡(−x,−y,−z)の点をOs0とする。Os0は,図のように球面上における円Cs0の中心となる。
【0183】
円Cs0は,3点P*,P02,P03を通る円であるが,それと同時に球面3角形O2O3Ot0の内接円でもある。
【0184】
上述のように内接円であることは以下の点から明らかである。
・3辺相等により,△Os0P*O3≡△Os0P03O3,ゆえに∠Os0P*O3=∠Os0P03O3である。同様に,∠Os0P03Ot0=∠Os0P02Ot0,∠Os0P02O2=∠Os0P*O2となる。
・また,∠Os0P03O3=π−∠Os0P03Ot0,∠Os0P02Ot0=π−∠Os0P02O2,∠Os0P*O2=π−∠Os0P*O3である。
・∠Os0P03O3=ρとして,これを以上の関係に当てはめると,ρ=π−ρとなりρ=π/2が得られる。したがって,Os0P*⊥O2O3,Os0P02⊥O2Ot0,Os0P03⊥O3Ot0である。
・よって,円Cs0は球面3角形O2O3Ot0に接する。
【0185】
したがって,円錐OCs0は,平面OO2O3と平面OO2Ot0に接する。そのため,ベクトル−wと平面OO2O3がなす角は,ベクトル−wと平面OO2Ot0がなす角に等しい(ともにπ−τである)。
【0186】
平面OO2O3はxy平面である。よって,ベクトル−wとz軸のなす角は,ベクトル−wと平面OO2Ot0の法線がなす角に等しい(ともにτ−π/2である)。これを式で表すと次のようになる。ただしez≡(0,0,1)である(本明細書において,eはベクトルを表す)。
【0187】
【数61】
平面OOs0P*は,点P*≡(−1,0,0)を通り,平面OO2O3に垂直である。したがって,ベクトルw≡(x,y,z)はxz平面内にあるので
【0188】
【数62】
となり,w=(x,0,z)である。また,u2=(a2,b2,0),ut0=(at0,bt0,ct0)なので,式(122)は次のようになる。
【0189】
【数63】
一方,|u2×ut0|は次のように表される。
【0190】
【数64】
さらに,k2≡a2/b2なので,式(124)は次のようになる。
【0191】
【数65】
また,sinαt0>0,k2>k3なので,式(21)より次式が得られる。
【0192】
【数66】
式(21),(126)を式(125)に代入して整理すると,次式が得られる。この式をl0とする。
【0193】
【数67】
|w|=1からx2+z2=1である。z<0なので,x,zは次式のようになる。
【0194】
【数68】
円錐面Cs0はP*を通るので,以下のようにしてcosτが得られる。ただしex≡(1,0,0)である。
【0195】
【数69】
残りの3つの補助円Cs1,Cs2,Cs3についても,同様の方法で円錐パラメータを求めることができる。
【0196】
[式の導出方法D]小判型形状の縦長・横長判定式の導出
小判型形状の形状を変化させて,横長から縦長へと切り替わる瞬間を考える。この状態では,円Ct0とCt1が一致するので,ut0=ut1かつαt0=αt1である。
・ut0=ut1であればbt0=bt1であり,式(19),(25)よりl4=l5となり,更に式(17),(23)よりk4=k5となる。
・逆に,k4=k5であれば,式(17),(23)よりl4=l5となり,ut0=ut1かつαt0=αt1となる。
【0197】
よって,円Ct0とCt1が一致することの必要十分条件はk4=k5である。これに式(16),(22)を代入し整理すると,次式が得られる。この式を判定式Daとする。
【0198】
【数70】
式(13)よりk0,k1はそれぞれμ0,μ1に対して単調増加である。そのため,可動領域を横に広げると(μ0減少,またはμ1増加),Daの値は減少する。
【0199】
同様に,式(14)よりk2,k3はそれぞれν0,ν1に対して単調減少である。そのため,可動領域を縦に広げると(ν0減少,またはν1増加),Daの値は増加する。
【0200】
したがって,Daの値を使って,図24に示すように,次のように小判型領域形状の縦長・横長を判定できる。
【0201】
S2401において,Da<0が成り立てば,横長であると判断される(S2405)。
【0202】
S2403において,Da>0が成り立てば,縦長であると判断される(S2407)。
【0203】
S2403において,「いいえ」であれば,連続した1つの円であると判断される(S2409)。
【0204】
[式の導出方法E]マトリクスとモノポーラ球面座標の関係式の導出
捻りが0の状態における子骨のy軸およびz軸の方向の単位ベクトルを,それぞれvy,vzとする。vy,vzは,それぞれモノポーラグリッドの+ν方向および−μ方向である。
子骨の向きを表す単位ベクトルをv≡(x,y,z)とする。vの偏微分を次のようにvμ,vνとする。
【0205】
【数71】
vy,vzは,それぞれvν,−vμを正規化したものなので,次式で表される。
【0206】
【数72】
vy,vzを求めるにあたり,まず下記のようにM,Nの偏微分を計算しておく。
【0207】
【数73】
これらを利用してT≡2/(M2+N2+1)の偏微分を求めると,次のようになる。
【0208】
【数74】
これらを利用してx=T−1,y=TN,z=−TMの偏微分を求めると,それぞれ次のようになる。
【0209】
【数75】
T(M2+N2+1)=2を利用して計算すると,次式が得られる。
【0210】
【数76】
同様に次式が得られる。
【0211】
【数77】
よって,vy,vzは次式のようになる。
【0212】
【数78】
子骨の向きを表すマトリクスを次のようにMとする。
【0213】
【数79】
曲げおよび捻りを表すマトリクスを,それぞれMb,Mtとする。マトリクスの要素の並びは,列ベクトルに対して左からマトリクスを掛ける方式とする。
【0214】
曲げマトリクスMbの要素は,式(3),(4),(5),(150),(151)より次のようになる。
【0215】
【数80】
捻りマトリクスMtの要素は次式のようになる。ただし,Sλ≡sinλ,Cλ≡cosλである。
【0216】
【数81】
[元曲げ方式の場合]
曲げの後に捻りを掛けるので,Mは次のようになる。この式を使えばλ,μ,νからMを求めることができる。
【0217】
【数82】
逆にMからλ,μ,νを求める手順は,以下のようになる。まずTを求めると,
【0218】
【数83】
となるが,この式はm00≒−1の場合に桁落ちにより精度が悪くなる。そのような場合には,
【0219】
【数84】
を利用して
【0220】
【数85】
によりTを求める。μ,νは次式により得られる。
【0221】
【数86】
次に,λを求めるに次式を利用する。
【0222】
【数87】
すると,
【0223】
【数88】
となり,次式が得られる。
【0224】
【数89】
よって,次式のようにλが得られる。
【0225】
【数90】
[元捻り方式の場合]
捻りの後に曲げを掛けるので,Mは次のようになる。この式を使えばλ,μ,νからMを求めることができる。
【0226】
【数91】
Mからλ,μ,νを求める式は,元曲げ方式の場合と同様の方法により得られる。
【0227】
[本発明の実施例の処理および構成例]
図25は,本願発明の実施例の装置構成を示す図である。コンピュータ2500には,キーボード2505,マウス2506,ペン2508を含むタブレット2507,ディスプレイ2501が接続されている。ディスプレイ2501上には,キャンバス2502が表示され,キャンバス2502上に図形が描画されている(2503)。
【0228】
図26は,本願発明の実施例のハードウエア構成を示す図である。CPU2601にバス2607が接続されている。バス2607には,メモリ2602,種々の入力装置2603,ディスプレイ等の表示装置2604及びプリンタ2605が接続されている。
【0229】
図27に本願発明の実施例を示す。図27を参照すると,まず,モノポーラ球面座標系によって,子骨の角度範囲を構成する境界円を設定する(S2701)。具体的には,例えばμ,νの上下限,形状(矩形か小判型か)等を指定する。そして,子骨の角度が,角度範囲の中(すなわち内側)にあるか否かを判定する(S2703)。子骨の角度が角度範囲の外にあると判定された場合には,上述の最近点を求める手法を用いて,子骨の角度を修正する(S2705)。そして,骨格モデルを画面に表示する。なお,ロボット等の実空間の対象物の制御を行う場合は,所望の角度に子骨を向ける制御を行う(S2707)。
【0230】
図28は,子骨の制御を行う制御装置の実施例を示す。まず,モノポーラ球面座標系によって,子骨の角度範囲を構成する境界円を設定する(2801)。そして,子骨の角度が,角度範囲の中(すなわち内側)にあるか否かを判定する(2803)。子骨の角度が角度範囲の外にあると判定された場合には,上述の最近点を求める手法を用いて,子骨の角度を修正する(2805)。そして,骨格モデルを画面に表示する(2807)。なお,ロボット等の実空間の対象物の制御を行う場合は,所望の角度に子骨を向ける制御を行う(2808)。また,各種の数値を設定するための入力手段(2806)を設けてもよい。
【0231】
本願明細書では,親骨に対する子骨の角度の制御を例示して,説明を行った。なお,本願発明は,3つ以上の骨が関節によって連結された骨格モデルに拡張して適用できることは言うまでもない。
【0232】
以上,本願発明について説明したが,本願発明の範囲は,本願明細書における上記実施例に限定されるものではない。当業者は,本願明細書の説明から,本願発明の変形態様を理解することができる。そして,これらの変形態様及びその均等物も,特許請求の範囲に係る技術的範囲に属することは言うまでもない。
【0233】
また,請求項に定義された各々のステップは,記載された順序通りに実行される必要はなく,矛盾の生じない範囲で,請求項に定義されたステップは,順番を変更して実行できる。そして,請求項のステップの順番を変更したものも,当該請求項の技術的範囲に包含されることは言うまでもない。
【符号の説明】
【0234】
P* モノポーラ球面座標系の極
v 子骨の向きを表す単位ベクトル
Pm 最近点
【特許請求の範囲】
【請求項1】
親骨と子骨とが関節によって連結された骨格モデルにおいて,前記親骨に対する前記子骨の前記関節における角度範囲を制限することによって前記子骨の動作を制御するための方法であって,
前記関節を中心とする球の球面上に,前記子骨の角度範囲の境界を定義する角度範囲境界円を設定する角度範囲境界円設定ステップであって,前記角度範囲境界円は前記関節を中心とする球面と親骨または親骨の延長線との交点1を通るものであり,前記子骨又は前記子骨の延長線と前記球面の交点2の位置が前記角度範囲境界円によって二分される前記球面の何れに存在すべきかによって前記子骨の角度範囲が定められ,前記球の中心と前記角度範囲境界円とで形成される円錐の軸単位ベクトルu及び前記円錐の半頂角α,または,前記軸単位ベクトルu及び前記半頂角αを導くことができる数値をメモリに格納することによって前記角度範囲境界円を設定する,角度範囲境界円設定ステップと,
前記メモリに格納された数値を読み出すことによって前記軸単位ベクトルuと前記半頂角αとを得て,前記子骨の向きを表す単位ベクトルvを用いて,u・v−cosαの値を検査値として算出し,前記検査値に基づいて,前記子骨の角度が前記角度範囲の中にあるか否かを判定する,角度範囲判定ステップと,
を有する,方法。
【請求項2】
前記関節を原点とし,前記交点1から前記原点に向かう方向をx軸の正方向とする,三次元直交座標系(x,y,z)から,
μ=2tan−1(−z/(x+1))
ν=2tan−1(y/(x+1))
の関係を有する,モノポーラ球面座標系(μ,ν)を用いて,
前記角度範囲境界円が,少なくともμ=μe及びν=νeのうち何れか一方を満たす,
(ここにおいて,μe及びνeは定数である),
請求項1記載の方法。
【請求項3】
前記交点2の前記モノポーラ球面座標を(μ,ν)とし,μの下限及び上限をそれぞれμ0,μ1とし,νの下限及び上限をそれぞれν0,ν1とした場合に,前記角度範囲が,
μ0<μ<μ1及びν0<ν<ν1
を満たすよう前記角度範囲境界円を設定する,
請求項2記載の方法。
【請求項4】
前記角度範囲境界円が,前記交点1を通らない補助角度範囲境界円を更に用いる,
請求項1乃至3のうちいずれか1項記載の方法。
【請求項5】
前記角度範囲判定ステップにおいて,
前記子骨の角度が前記角度範囲の中に無いと判定された場合,
前記交点2から前記角度範囲の中にあることを満たす球面上の点まで前記球面上に沿って測定した距離が最短となる前記球面上の点に,前記交点2を移動させることにより,前記子骨の角度を修正する,角度修正ステップ,
を更に有する請求項1乃至4のうちいずれか1項記載の方法。
【請求項6】
請求項1乃至5のうちいずれか1項記載の方法をコンピュータに実行させるための命令を含む,プログラム。
【請求項7】
親骨と子骨とが関節によって連結された骨格モデルにおいて,前記親骨に対する前記子骨の前記関節における角度範囲を制限することによって前記子骨の動作を制御するための装置であって,
前記関節を中心とする球の球面上に,前記子骨の角度範囲の境界を定義する角度範囲境界円を設定する角度範囲境界円設定手段であって,前記角度範囲境界円は前記関節を中心とする球面と親骨または親骨の延長線との交点1を通るものであり,前記子骨又は前記子骨の延長線と前記球面の交点2の位置が前記角度範囲境界円によって二分される前記球面の何れに存在すべきかによって前記子骨の角度範囲が定められ,前記球の中心と前記角度範囲境界円とで形成される円錐の軸単位ベクトルu及び前記円錐の半頂角α,または,前記軸単位ベクトルu及び前記半頂角αを導くことができる数値をメモリに格納することによって前記角度範囲境界円を設定する,角度範囲境界円設定手段と,
前記メモリに格納された数値を読み出すことによって前記軸単位ベクトルuと前記半頂角αとを得て,前記子骨の向きを表す単位ベクトルvを用いて,u・v−cosαの値を検査値として算出し,前記検査値に基づいて,前記子骨の角度が前記角度範囲の中にあるか否かを判定する,角度範囲判定手段と,
を有する,装置。
【請求項1】
親骨と子骨とが関節によって連結された骨格モデルにおいて,前記親骨に対する前記子骨の前記関節における角度範囲を制限することによって前記子骨の動作を制御するための方法であって,
前記関節を中心とする球の球面上に,前記子骨の角度範囲の境界を定義する角度範囲境界円を設定する角度範囲境界円設定ステップであって,前記角度範囲境界円は前記関節を中心とする球面と親骨または親骨の延長線との交点1を通るものであり,前記子骨又は前記子骨の延長線と前記球面の交点2の位置が前記角度範囲境界円によって二分される前記球面の何れに存在すべきかによって前記子骨の角度範囲が定められ,前記球の中心と前記角度範囲境界円とで形成される円錐の軸単位ベクトルu及び前記円錐の半頂角α,または,前記軸単位ベクトルu及び前記半頂角αを導くことができる数値をメモリに格納することによって前記角度範囲境界円を設定する,角度範囲境界円設定ステップと,
前記メモリに格納された数値を読み出すことによって前記軸単位ベクトルuと前記半頂角αとを得て,前記子骨の向きを表す単位ベクトルvを用いて,u・v−cosαの値を検査値として算出し,前記検査値に基づいて,前記子骨の角度が前記角度範囲の中にあるか否かを判定する,角度範囲判定ステップと,
を有する,方法。
【請求項2】
前記関節を原点とし,前記交点1から前記原点に向かう方向をx軸の正方向とする,三次元直交座標系(x,y,z)から,
μ=2tan−1(−z/(x+1))
ν=2tan−1(y/(x+1))
の関係を有する,モノポーラ球面座標系(μ,ν)を用いて,
前記角度範囲境界円が,少なくともμ=μe及びν=νeのうち何れか一方を満たす,
(ここにおいて,μe及びνeは定数である),
請求項1記載の方法。
【請求項3】
前記交点2の前記モノポーラ球面座標を(μ,ν)とし,μの下限及び上限をそれぞれμ0,μ1とし,νの下限及び上限をそれぞれν0,ν1とした場合に,前記角度範囲が,
μ0<μ<μ1及びν0<ν<ν1
を満たすよう前記角度範囲境界円を設定する,
請求項2記載の方法。
【請求項4】
前記角度範囲境界円が,前記交点1を通らない補助角度範囲境界円を更に用いる,
請求項1乃至3のうちいずれか1項記載の方法。
【請求項5】
前記角度範囲判定ステップにおいて,
前記子骨の角度が前記角度範囲の中に無いと判定された場合,
前記交点2から前記角度範囲の中にあることを満たす球面上の点まで前記球面上に沿って測定した距離が最短となる前記球面上の点に,前記交点2を移動させることにより,前記子骨の角度を修正する,角度修正ステップ,
を更に有する請求項1乃至4のうちいずれか1項記載の方法。
【請求項6】
請求項1乃至5のうちいずれか1項記載の方法をコンピュータに実行させるための命令を含む,プログラム。
【請求項7】
親骨と子骨とが関節によって連結された骨格モデルにおいて,前記親骨に対する前記子骨の前記関節における角度範囲を制限することによって前記子骨の動作を制御するための装置であって,
前記関節を中心とする球の球面上に,前記子骨の角度範囲の境界を定義する角度範囲境界円を設定する角度範囲境界円設定手段であって,前記角度範囲境界円は前記関節を中心とする球面と親骨または親骨の延長線との交点1を通るものであり,前記子骨又は前記子骨の延長線と前記球面の交点2の位置が前記角度範囲境界円によって二分される前記球面の何れに存在すべきかによって前記子骨の角度範囲が定められ,前記球の中心と前記角度範囲境界円とで形成される円錐の軸単位ベクトルu及び前記円錐の半頂角α,または,前記軸単位ベクトルu及び前記半頂角αを導くことができる数値をメモリに格納することによって前記角度範囲境界円を設定する,角度範囲境界円設定手段と,
前記メモリに格納された数値を読み出すことによって前記軸単位ベクトルuと前記半頂角αとを得て,前記子骨の向きを表す単位ベクトルvを用いて,u・v−cosαの値を検査値として算出し,前記検査値に基づいて,前記子骨の角度が前記角度範囲の中にあるか否かを判定する,角度範囲判定手段と,
を有する,装置。
【図1】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図2】
【図3】
【図4】
【公開番号】特開2012−164162(P2012−164162A)
【公開日】平成24年8月30日(2012.8.30)
【国際特許分類】
【出願番号】特願2011−24449(P2011−24449)
【出願日】平成23年2月7日(2011.2.7)
【出願人】(596021562)株式会社セルシス (22)
【Fターム(参考)】
【公開日】平成24年8月30日(2012.8.30)
【国際特許分類】
【出願日】平成23年2月7日(2011.2.7)
【出願人】(596021562)株式会社セルシス (22)
【Fターム(参考)】
[ Back to top ]