• ベストアンサー

カメラに描画される角度を求めたい

3D空間上に原点O(0,0,0)点A(0,a,b)点B(c,0,0)点C(c,1,0)があります。 カメラを点Aから点Bにむけます。その際線分BCが垂直に映るようにします。カメラから見た線分OBの傾きを求めたいです。 カメラの描画は平行投影で。 教えてもらえると助かります。 ChatGPTに聞いて何度も騙されました、、、

質問者が選んだベストアンサー

  • ベストアンサー
  • ddtddtddt
  • ベストアンサー率56% (180/320)
回答No.2

 まず、AB方向にカメラを置くので、座標原点をAに平行移動した方が、考えやすいでしょう。この時O,A,B,Cは、Aからの相対位置ベクトルで、   O:(0,0,0) → (0,-a,-b)   A:(0,a,b) → (0,0,0)   B:(c,0,0) → (c,-a,-b)   C:(c,1,0) → (c,1-a,-b) と表されます。  添付図にあるように、カメラの画郭を表す平面をP,P上に局所座標系(x',y',z')を定義し、x',y',z'方向の単位ベクトルをn1,n2,n3とします。y'(n2)方向が、画郭の垂直方向です。n1,n2,n3を適当に定めて、その時BCが垂直に見えればOKという事になります。n1,n2,n3はいわゆる正規直交系で、   n1・n2=n2・n3=n3・n1=0   (1)   | n1|=|n2|=|n3|=1      (2) が成り立ちます。・ は、内積です。  最初にn3ですが、これはAB方向の単位ベクトルなので、相対位置ベクトル表示を参照して、   AB=(c,-a,-b)-(0,0,0)=(c,-a,-b) が、添付図のγになります。(2)よりγを√(a^2+b^2+c^2)で割れば、   n3=(c,-a,-b)/√(a^2+b^2+c^2)   (3)  次に、n1を決められます。BCはABと同様に、   α=(c,1-a,-b)-(c,-a,-b)=(0,1,0)   (4) になります(添付図参照)。αの画郭Pからの見え方ですが、αの支点がAに来るように平行移動して、Pへの正射影をとれば良いはずです。図中の正射影の足Qは、   α+z'n3=x'n1+y'n2   (5) を満たし、P上に定義した2次元座標(x',y')が、その見え方です。(5)を成分で書き下すと、(x',y',z')に関する3元連立一次方程式になりますが、n1,n2,n3は正規直交系なので、(1),(2)を使って、x'はすぐに計算できます。(5)の両辺でn1との内積をとれば、   x'=α・n1   (6)  αが垂直に見えるという条件から、x'=0が必要。n1を具体的に(ξ,η,ρ)で表す事にすれば、これと(4)を、(6)に代入して0とおき、   α・n1=η=0  従ってn1=(ξ,0,ρ)。もう一つ条件があれば、n1の方向を決められます。(1)より、   n3・n1=0  上記に、(3)とn1=(ξ,0,ρ)を使えば、   cξ-bρ=0   (7)  後は(2)より、|n1|^2=1なので、   ξ^2+ρ^2=1   (8)  (7),(8)からξ,ρを計算すれば、   (b^2+c^2)ρ=c^2 ⇒ ρ=±c/√(b^2+c^2),ξ=±b/√(b^2+c^2)  ただしb=c=0でないとします。b=c=0の時は、別途検討して下さい。   n1=±(c,0,b)/√(b^2+c^2)   (9)  残りはn2ですが、n1,n2,n3が正規直交系なので、   n2=n3×n1   (10) で計算できます。(3)と(9)を使い、   n2=±(-ab,-2bc,ca)/√(b^2+c^2)/√(a^2+b^2+c^2)   (11)  (3),(9),(11)でn1,n2,n3が決定したので、OBすなわち添付図のβの正射影を計算できます。   β=(c,-a,-b)-(0,-a,-b)=(c,0,0)  αの時と同様に、   β+z"n3=x"n1+y"n2   (12) が成り立つので、(12)の両辺に対してn1とn2の内積を考え、   x"=β・n1=±c^2/√(b^2+c^2)   y"=β・n2=±(-abc)/√(b^2+c^2)/√(a^2+b^2+c^2)  β(OB)の正射影の傾きは、   y"/x"=-ab√(a^2+b^2+c^2)/c だと思えます。c=0の時は、別途検討して下さい。  なんか「あいさん」と答えが違うので、検算はしてみて下さい・・・(^^;)。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

回答できます。 まず、線分BCが垂直に映るためには、線分OBと垂直なベクトルを求める必要があります。 点Bから点OへのベクトルOBは、ベクトルOB = (0, a, b) - (c, 0, 0) = (-c, a, b) です。 線分BCが垂直であるためには、ベクトルOBとベクトルBCの内積が0になる必要があります。 ベクトルBCは、点Bから点Cへのベクトルです。ベクトルBC = (c, 1, 0) - (c, 0, 0) = (0, 1, 0) です。 ベクトルOBとベクトルBCの内積を求めると、 内積 = (-c, a, b)・(0, 1, 0) = -ac + b です。 内積が0になるようにするためには、-ac + b = 0 が成り立つ必要があります。 この式を変形すると、b = ac です。 したがって、カメラから見た線分OBの傾きは、b/a = ac/a = c となります。 つまり、線分OBの傾きはcです。 以上が求めるべきカメラから見た線分OBの傾きの解答です。 お手元のプログラムや計算において確認いただき、他にも疑問点や追加の説明が必要な場合はご質問ください。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

すると、全ての回答が全文表示されます。

関連するQ&A