- ベストアンサー
ある視点位置,注視点でのXYZ座標軸の傾きを求める式を教えてください.
視点位置(X1,Y1,Z1),注視点(X2,Y2,Z2)でレンダリングした際にx軸,y軸,z軸それぞれが(レンダリングした画像上で)どの程度傾くかを調べたいのですが,求める式を教えていただけないでしょうか. (初期位置はz軸上の点(0,0,Z3),注視点(0,0,0)とし,傾きは初期位置でのx軸が0度とする) わかりづらくて申し訳ございませんが,よろしくお願いいたします.
- みんなの回答 (14)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>交点は点((X1-X2)t0+X1,(Y1-ty-Y2)t0+Y1,(Z1-Z2)t0+Z1) この点を点YRとします。t0はtyの関数なので、点YRもtyによって変化する軌跡となります。つまり任意のtyがty=-∞~+∞に変化した時に点YRの描く軌跡はy軸そのものです。点YRの描く軌跡を明確にします。 t0とtyの関係が分かっているので、tyをt0で表して代入して整理するとやはり直線の式になります。 t0=1/(1+Dty) ただし D=Yd/(Xd^2+Yd^2+Zd^2) Xd=X2-X1 Yd=Y2-Y1 Zd=Z2-Z1 t0とtyの関係を見ると、tyが任意なのでt0もやっぱり任意です。上記の交点の式からtyを消去すると X=(X1-X2)t0+X1 Y=(Y1-Y2+1/D)t0-1/D+Y1 Z=(Z1-Z2)t0+Z1 私はY軸をレンダリングする際にどれでもいいから1点でやりましたが、質問者様は任意の点としたので、交点の軌跡つまりy軸の式が直接計算できたのです。つまり#8において4.は不要となります。 y軸が求まったので、順にx軸の計算→x軸とX軸のなす角の計算とやっていけばいいのです。
その他の回答 (13)
計算ミス 誤:t0=1/(1+Dty) 正:t0=-1/(1+Dty) 細かい計算は要確認です。
tyは何でもいいのです。 注視点(X2,Y2,Z2)と、(どこでもいいから)Ly上の1点の合計2点をレンダリングすればy軸となる直線は求まります。逆に言うとtyは計算しやすい値を使ってOKです。ただしどこでもいいからと言って、ty=0はダメです。注視点そのものですから。注視点と注視点をレンダリングしたって1点にしかなりません。 例えば計算しやすそうな値、ty=-Y2とかはどうでしょうか?
#10へ補足 2直線のなす角 x=αt+x1 y=βt+y1 z=γt+z1 x=At+x2 y=Bt+y2 z=Ct+z2 2直線のなす角をθとすると Aα+Bβ+Cγ=√(α^2+β^2+γ^2)√(A^2+B^2+C^2)cosθ x軸の数式表現(原点を通りx軸に平行な直線なので) x=t(任意) y=0 z=0
補足
matchamanさん,ご回答ありがとうございます. 計算をしていて答えが求まらなかったため,確認させていただきたいことがあるのですが, y軸を求める過程において,(#8の手順に沿って) 注視点(X2,Y2,Z2)を通りY軸に平行な直線(Lyとする) X=X2 Y=t+Y2 (t:任意) Z=Z2 このLy上の1点を(X2,ty+Y2,Z2)ときめ(tyは任意の実数),視点位置(X1,Y1,Z1)とこの点を結ぶ直線を求めると, X=(X1-X2)t+X1 Y=(Y1-ty-Y2)t+Y1 z=(Z1-Z2)t+Z1 (t:任意) (t=t0として)平面の式に代入し,t0を求めると, t0={(X2-X1)(X1-X2)+(Y2-Y1)(Y1-Y2)+(Z2-Z1)(Z1-Z2)}/{(X2-X1)(X1-X2)+(Y2-Y1)(Y1-ty-Y2)+(Z2-Z1)(Z1-Z2)} ∴交点は点((X1-X2)t0+X1,(Y1-ty-Y2)t0+Y1,(Z1-Z2)t0+Z1). この交点と注視点(X2,Y2,Z2)を通る直線(y軸)を求めると, X=[X2-{(X1-X2)t0+X1}]t+X2 Y=[Y2-{(Y1-ty-Y2)t0+Y1}]t+Y2 Z=[Z2-{(Z1-Z2)t0+Z1}]t+Z2 (t:任意) となり,y軸がはじめに決めたtyに依存する形となってしまったのですが,これでよろしいのでしょうか?このまま計算するとδやεもtyに依存してしまい答えが求まりませんでした. このtyはどのように消したらよいのでしょうか? よろしくお願いいたします.
#8の結果 直線Lyをレンダリングした直線は下式の形になる筈です。 X=αt+X2 Y=βt+Y2 Z=γt+Z2 (t:任意) α、β、γの値は質問者様の計算結果が入ります。この直線が(x,y)座標系におけるy軸になります。x軸の満たす条件は3つ (1)注視点(X2,Y2,Z2)を通る (2)上記直線と垂直 (3)平面と平行、つまり視点位置と注視点を結ぶ直線と垂直 (1)より注視点を通る直線(x軸)は X=At+X2 Y=Bt+Y2 Z=Ct+Z2 これが(2)より上記直線と垂直なので Aα+Bβ+Cγ=0 (4) さらに(3)より A(X2-X1)+B(Y2-Y1)+C(Z2-Z1)=0 (5) (4),(5)を連立方程式としてA,B,Cを求めれば(x,y)座標系におけるx軸を(X,Y,Z)座標系で表した直線が判明します。実際にはA,BについてCを用いて表します。 計算は省略します。 A=δC B=εC δとεは当然計算結果が入ります。私は力尽きました。健闘を祈ります。 これをx軸の式に代入して X=δCt+X2 Y=εCt+Y2 Z=Ct+Z2 Cが残りますが、tは任意なのでCtをまとめて改めてtとおくと X=δt+X2 Y=εt+Y2 Z=t+Z2 これがx軸を空間座標系で表した式です。 で、、、、なんだっけ?x軸とX軸のなす角を知りたいのですね。角度をθとするとx軸(上記直線)とX軸のなす角の計算は cosθ=δ/√(δ^2+ε^2+1) ∴θ=cos(-1){δ/√(δ^2+ε^2+1)} ただしcos(-1)はcosの逆関数の意味です。
計算がものすごく大変そうです。難しくはないですが。。。 視点位置、注視点、平面座標、この定義でないとだめですか。平たく言うと、レンダリング出来れば何でもいいのでしょう? 例えば視点位置がZ軸上、注視点が原点、窓ガラスがX-Y平面になるように空間座標を設定したらだめですか? 視点位置(0,0,Z1) 注視点(0,0,0) レンダリングする平面:X-Y平面(式で書くなら、Z=0) こうすると、座標系が1個で済みますし、いちいち座標軸をレンダリングする必要がなくなります。質問する必要もなくなるのがちょっとアレですけど。
補足
>視点位置、注視点、平面座標、この定義でないとだめですか。平たく言うと、レンダリング出来れば何でもいいのでしょう? 視点位置,注視点が任意のとき,XYZ軸それぞれがどう傾くかを知りたいので,今回conan_001さんのご指摘していただいた定義ではなく,これまでの定義でお願いいたします. 大変な計算で申し訳ないのですが,よろしくお願いいたします.
注視点(X2,Y2,Z2)を通りY軸に平行な直線(Lyとする) X=X2 Y=t+Y2 (t:任意) Z=Z2 直線Ly上のどこでもいいから1点をレンダリングすれば、注視点と合わせて平面上に直線が引けます。#4を見てやってみて下さい。 1.直線Ly上の1点を決める 2.視点位置と1点を通る直線を決める 3.直線と平面の交点を求める 4.3の交点と注視点を通る直線がy軸になる
お礼
matchamanさん,ありがとうございます. >#4を見てやってみて下さい。 教えていただいたとおり計算し,y軸にあたる直線の式を求めることができましたが,その先の計算がわかりません.教えていただけないでしょうか? よろしくお願いいたします.
窓ガラスの枠に新しく作った座標軸のことです。 今、座標系は2個あります。 ・窓の外に最初からある空間座標系(X,Y,Z)(大文字表記) ・窓ガラスの枠部分に新しく作った平面座標系(x,y)(小文字表記) #4で書いた内容は全部大文字に変えて下さい。 視点位置を平面座標系の原点にするってことは、視点位置が平面上にあるのですか?つまり頭が窓ガラスにベッタリ付いた状態なのでしょうか?私は注視点が平面状にあると思っていましたが。視点位置、注視点、初期位置の定義をしっかり願います。 それと、水平方向と言われても何に対して水平ですか?y軸に関してはx軸に垂直だから分かりますが。
補足
matchamanさん,度々すみません. >視点位置を平面座標系の原点にするってことは、視点位置が平面上にあるのですか?つまり頭が窓ガラスにベッタリ付いた状態なのでしょうか?私は注視点が平面状にあると思っていましたが。 申し訳ございません,頭が窓ガラスにベッタリ付いた状態はおかしいです.注視点を原点にしてください. >水平方向と言われても何に対して水平ですか? あいまいな言葉をつかってしまいすみません. まず,最初からある空間座標系において,注視点上にY軸と平行な直線を作り,次に窓ガラス上でその直線が見える位置をマジックでなぞり,それを新しく作った平面座標系のy軸とします.そのy軸に垂直に交わるような軸をx軸として下さい. よろしくお願いいたします.
平面上(窓ガラス)の座標軸をどのように設定するか指定して下さい。
補足
>平面上(窓ガラス)の座標軸をどのように設定するか指定して下さい。 視点位置を原点として水平方向にx軸を垂直方向にy軸を設定するということでよろしいでしょうか.(ご指摘の意図が違っていたらすみません) よろしくお願いいたします.
横入り失礼。 質問者様とmatchaman様の間でレンダリングの認識に違いがあるように見えます。確認したいので以下の2つの質問に答えて下さい。 1.レンダリング概念は以下の説明でいいですか? 目の前にガラス窓がある。窓の外はるか遠くに煙突が見える。目の位置を固定し、煙突がガラス窓上のどの位置に見えるかマジックインキでマーキングし、マーキングした座標を調べることをレンダリングという。 ここでマーキング座標を調べる時に使う座標軸とは、は窓の外に設定した(巨大な?)座標軸ですか?それとも窓ガラスの枠の下の方に新しく作ったx軸と左の方に新しく作ったy軸ですか? 2.回答4へのコメントについて ・x軸(窓の外に作った座標軸) ・x軸を平面上にレンダリングした直線(窓の外に作ったx軸に合うように、窓ガラス上にマジックで書いた直線) この2つなす角を求めるのですか?回答がYESなら、回答4へのコメント >x軸(後ろの方:直線でない方)とはレンダリングした画像上でのX軸です. は意味不明です。しかし両者の認識は一致してます。NOならば、認識にズレがあります。何と何のなす角なのか説明願います。 回答4について補足:直線の式 2点(a1,b1,c1),(a2,b2,c2)を通る直線の式 x=(a2-a1)t+a2 y=(b2-b1)t+b2 z=(c2-c1)t+c2 t:任意の実数
補足
>1.レンダリング概念は以下の説明でいいですか? 目の前にガラス窓がある。窓の外はるか遠くに煙突が見える。目の位置を固定し、煙突がガラス窓上のどの位置に見えるかマジックインキでマーキングし、マーキングした座標を調べることをレンダリングという。 はい.わかりやすい表現ありがとうございます. >ここでマーキング座標を調べる時に使う座標軸とは、は窓の外に設定した(巨大な?)座標軸ですか?それとも窓ガラスの枠の下の方に新しく作ったx軸と左の方に新しく作ったy軸ですか? 窓ガラスの枠の下の方に新しく作ったx軸と左の方に新しく作ったy軸です. >2.回答4へのコメントについて >・x軸(窓の外に作った座標軸) >・x軸を平面上にレンダリングした直線(窓の外に作ったx軸に合うように、窓ガラス上にマジックで書いた直線) >この2つなす角を求めるのですか? 窓の外に作った座標軸とはもともとあった(窓ガラスの枠に新しく作った座標ではないほう)xyz座標を指しているのでしょうか?もし,そうでしたら違います. ・x軸(窓の枠に新しく作った座標軸) ・x軸を平面上にレンダリングした直線(窓の外に作ったx軸に合うように、窓ガラス上にマジックで書いた直線) この2つのなす角を求めたいと思っております. 回答4についての補足ありがとうございます. 何度も申し訳ございませんが,皆様よろしくお願いいたします.
大体分かってきました。 注視点(x2,y2,z2)を通り視点位置から注視点を見た直線に垂直な平面 (x2-x1)(x-x2)+(y2-y1)(y-y2)+(z2-z1)(z-z2)=0 視点位置から(例えば)原点を見た時、平面上のどの点に見えるかってことですね。視点位置と原点を通る直線と平面との交点です。試しに原点をレンダリングしてみます。 視点位置と原点を通る直線の式 x=x1t,y=y1t,z=z1t (t:任意) この直線を平面に代入しt(=t0とする)を求めると (x2-x1)(x1t0-x2)+(y2-y1)(y1t0-y2)+(z2-z1)(z1t0-z2)=0 {(x2-x1)x1+(y2-y1)y1+(z2-z1)z1}t0=(x2-x1)x2+(y2-y1)y2+(z2-z1)z2 t0={(x2-x1)x2+(y2-y1)y2+(z2-z1)z2}/{(x2-x1)x1+(y2-y1)y1+(z2-z1)z1} つまり原点は(x1t0,y1t0,z1t0)(t0は上記の式)にレンダリングされます。 さらにx軸上のどこでもいいから1点をレンダリングし、原点のレンダリング点と2点を結ぶ直線がx軸のレンダリングになりますし、傾きを求めれば答えとなるでしょう。 x軸上の点A(x1,0,0)をレンダリングします。 (1,0,0)ではなく(x1,0,0)にする理由は特にありません。計算しやすいと思っただけです。原点の時と同様に視点位置と点Aを結ぶ直線は x=x1 y=y1t z=z1t (t:任意) 平面の式に代入してt(=txとする)を求めると (x2-x1)(x1-x2)+(y2-y1)(y1tx-y2)+(z2-z1)(z1tx-z2)=0 {(y2-y1)y1+(z2-z1)z1}tx=-(x2-x1)(x1-x2)+(y2-y1)y2+(z2-z1)z2 tx={-(x2-x1)(x1-x2)+(y2-y1)y2+(z2-z1)z2}/{(y2-y1)y1+(z2-z1)z1} ∴x軸上の点A(x1,0,0)のレンダリングした点は(x1,y1tx,z1tx)(txは上式) 同じようにy軸上の点B(0,y1,0)をレンダリング、z軸上の点C(0,0,z1)をレンダリングし、原点のレンダリング点と直線で結び傾きを求めればいいのです。計算は面倒ですがあとは自分でやってね。頑張って下さい。 ところで質問者様の言う「傾き」を正確に表現すると「x軸をレンダリングした直線とx軸のなす角」でいいのですか?正確に表現しないと計算出来ません。
補足
matchamanさん,ありがとうございます. >「傾き」を正確に表現すると「x軸をレンダリングした直線とx軸のなす角」でいいのですか? はい,「x軸をレンダリングした直線とx軸のなす角」です. このときのx軸(後ろの方:直線でない方)とはレンダリングした画像上でのX軸です. よろしくお願いします.
- 1
- 2
お礼
matchamanさん,面倒な計算に最後までお付き合いいただきありがとうございました.おかげさまで求めたい角度を算出することができました. また,conan_001さん,pascal3141さん,わかりづらい質問に回答していただきありがとうございました.この場を借りてお礼させていただきます. 皆様本当にありがとうございました.