2012-03-10 2 views
1

マウスのクリックに基づいて3Dベクトルを計算するために使用している計算はうまくいきますが、実際にはうまくいきます。具体的には、水平軸の視野に基づいて新しい比率を計算するのではなく、水平軸の縦横比によって縦軸に縦軸に表示されます。これは私が気になるのは、視野を線形にスケーリングしているのに対し、水平軸のfov接線を再計算するのは線形ではありません - だから、私のカメラにはわずかに不自然なレンズがありますか?D3Dのスクリーン座標から3Dベクトルを投影するのが反比例する

ここで私は自分の感性を怒られているラインを隔離しました正常に動作コード、(FOVは水平軸の発現されており、D3Dは、縦軸のためにそれを望んでいることに注意してください)

double mouseX = ((((double) hitPt.x)/(double) vport.cx) - 0.5) * 2.0; 
double mouseY = ((1.0 - (((double) hitPt.y)/(double) vport.cy)) - 0.5) * 2.0; 
double tfy = tan((fov/aspr) * 0.5); 


double tfx = tfy * aspr; 

SFMatrix4 CM1; 
this->m_renderSurface->GetRawCameraMatrix(CM1); 
CM1.Invert(); 
origin = CM1 * SFVec3f((nearp * tfx) * mouseX,(nearp * tfy) * mouseY,nearp); 
dest = CM1 * SFVec3f((farp * tfx) * mouseX,(farp * tfy) * mouseY,farp); 

です(tfx = tfy * aspr) - 私はむしろやるだろう tfx = tan(fov)* 0.5; しかし、それはうまくいかない - 中央から離れていくにつれてエラーが増える。 これはD3Dがやることで、私はちょうどそれと一緒に生活しなければならない - 私は好奇心が強い実際に正しいパスがあるかどうか(離散メッシュを使って線形代数を変えようとすると何かが正しいことが分かる)、なぜ

答えて

1

私はこれが最初は直感的ではないことに同意する。

目の視野は、基本的に球面に投影されます。その結果、特定の角度を対象とするオブジェクトは、まっすぐ見るか、周辺視野で見るかにかかわらず、同じサイズを持つように見えます。オブジェクトの2つの辺の間の角度の差は、サイズを定義するものであり、したがって、オブジェクトに対する角度は、視野内のその位置を定義するための良い方法です。

平面に投影する場合、ルールは少し異なります。この絵を見て:

enter image description here

画面上の各オブジェクトの位置は、そのオブジェクトへの角度によって決定されません。代わりに、我々は同様の三角形を使用します。

(distance from center of screen)  (offset from sight line to object) 
________________________________ = ___________________________________________ 
(distance from eye to screen)  (distance along sight line to object plane) 
+0

AHAを - 脳が痛い - 仮想カメラが(正確に)円/球面レンズを持っていると仮定され、私は、投影の線形性を混乱しました - 私は迅速をしましたレンズ自体を非対称にする独自の投影機能でテストし、その結果はぼんやりと邪魔していました:-) –

関連する問題