掲示板
  .NET開発  > Managed DirectX  > LookAtLHの使い方について  
 
 
 投稿者 スレッド: LookAtLHの使い方について
shiro はオフラインです。最後に活動した時刻: 2006/02/14 1:59:17 shiro
参加日: 2004-10-10
投稿数: 25
 
LookAtLHの使い方について
投稿日時: 2004-10-10 午後 12:14
LookAtLHの使い方について質問があります。Matrix.LookAtLH( eye, target, upper )の第一番目の引数は視点だと思うのですが、どうもうまく表示してくれないので、その使い方が理解できなくて困っています。
テストプログラムはDirectx9.0bに付属してきた、Tutorial5のtexture.csというもので、banana.bmpを円筒に貼り付けるというテクスチャのテストプログラムです。円筒は半径1でY方向に-1から1の座標となる形です。元のプログラムでは複雑な回転をするので、回転しないように device.Transform.World = Matrix.Identity; としました。さらに、LookAtLHの挙動を調べるために、パラメータをいろいろと変えてみます。オリジナルでは

eye = new Vector3( 0.0f, 3.0f, -5.0f );
target = new Vector3( 0.0f, 0.0f, 0.0f );
upper = new Vector3( 0.0f, 1.0f, 0.0f );
device.Transform.View = Matrix.LookAtLH( eye, target, upper );

となり、円筒の全体が見えますが、

eye = new Vector3( 0.0f, 1.5f, -2.5f );
target = new Vector3( 0.0f, 1.0f, 1.0f );

とすると、円筒の上部の縁の部分が見えるようになります。さらに、視点を変えて

eye = new Vector3( 0.0f, 1.1f, -1.95f );

とすると、円筒の手前がかけて見え、円筒の縁にカメラがぶつかったように見えるため、円筒の手前の縁の座標が
Vector3( 0.0f, 1.0f, -2.0f )にあることがわかります。視点をどんどん変えてみます。
eye = new Vector3( 0.0f, 1.1f, -1.0f ); 円筒の中心にあるように見える。
eye = new Vector3( 0.0f, 1.1f, -0.05f ); 両端が欠ける
eye = new Vector3( 0.0f, 1.1f, 0.0f ); 両端がたくさん欠ける
eye = new Vector3( 0.0f, 1.1f, 0.05f ); 見えなくなる

これらから、円筒はZ座標軸上では -2から0の間にあり、-1が中心にあるようです。
そこで反対側から見ても同じことが言えるかどうか、試してみました。

eye = new Vector3( 0.0f, 1.5f, 2.5f );
target = new Vector3( 0.0f, 1.0f, -1.0f ); 注視する点も変える

とします。そうすると、今度は
eye = new Vector3( 0.0f, 1.1f, 1.0f ); 円筒の中心にあるように見える。
eye = new Vector3( 0.0f, 1.1f, 0.05f ); 両端が欠ける
eye = new Vector3( 0.0f, 1.1f, 0.0f ); 両端がたくさん欠ける
eye = new Vector3( 0.0f, 1.1f, -0.05f ); 見えなくなる
つまり、最初とは異なり、今度は円筒がZ座標軸上では 2から0の間にあり、1が中心にあるように見えます。
さらに不思議なのは、X軸についても同じようになります。つまり、

eye = new Vector3( -2.5f, 1.5f, 0.0f );
target = new Vector3( 1.0f, 1.0f, 0.0f );
から、
eye = new Vector3( -1.95f, 1.1f, 0.0f );円筒の手前がかける。
eye = new Vector3( -1.0f, 1.1f, 0.0f ); 円筒の中心にあるように見える。
eye = new Vector3( -0.05f, 1.1f, 0.0f ); 両端が欠ける
eye = new Vector3( 0.0f, 1.1f, 0.0f ); 両端がたくさん欠ける
eye = new Vector3( 0.05f, 1.1f, 0.0f ); 見えなくなる

となります。LookAtLHの視点と注視点によって円筒の座標の配置が変化して見えるのはなぜなのでしょうか?LookAtLHの正しい解釈を教えていただけると助かります。
もし、ソースが必要であれば、132行程度なのでアップします。以上、よろしくお願い致します。





NyaRuRu はオフラインです。最後に活動した時刻: 2006/03/20 21:56:13 NyaRuRu
Top 25 Poster
参加日: 2003-9-18
投稿数: 399
 
Re: LookAtLHの使い方について
投稿日時: 2004-10-10 午後 1:07
>eye = new Vector3( 0.0f, 1.1f, -1.95f );

>とすると、円筒の手前がかけて見え、円筒の縁にカメラがぶつかったように見えるため、円筒の手前の縁の座標が
>Vector3( 0.0f, 1.0f, -2.0f )にあることがわかります。


ここの推測が誤りということではないでしょうか.

texture.cs のデフォルトのままでしたら,射影行列の設定は以下のようになっていませんか?
device.Transform.Projection =
  Matrix.PerspectiveFovLH( (float)Math.PI / 4.0f, 1.0f, 1.0f, 100.0f );
この設定では,Z = 1.0 より手前の物体と Z = 100.0 より奥の物体は表示されません.各引数の意味についてはヘルプをご覧下さい.
物体が見えなくなるかどうかと LookAtLH の設定だけからでは,円筒の手前の縁がどこにあるかは分かりません.

また,このころのチュートリアル全般にあった問題ですが,Matrix.PerspectiveFovLH を呼び出すときの第二引数 (アスペクト比) が 1.0f 固定になっているため描画領域の縦横サイズが同じ場合以外は描画結果がゆがんでいるかと思います.

device.Transform.Projection =
  Matrix.PerspectiveFovLH(
    (float)Math.PI / 4.0f,
    ((float)描画領域の横幅) / ((float)描画領域の縦幅),
    1.0f,
    100.0f );
と,ついでに変更しておくと良いでしょう.
shiro はオフラインです。最後に活動した時刻: 2006/02/14 1:59:17 shiro
参加日: 2004-10-10
投稿数: 25
 
Re: LookAtLHの使い方について
投稿日時: 2004-10-10 午後 1:33
初心者の質問に丁寧に答えていただきありがとうございました。
Matrix.PerspectiveFovLHのことを考えずに、一人で悩んでいました。

Matrix.PerspectiveFovLH( (float)Math.PI / 4.0f, 4.0f/3.0f, 0.1f, 100.0f );

として、距離が0.1以下にならないようにすると、矛盾の無い表示になりました。
ありがとうございました。
 
Page 1 of 1
 
GotDotNet Japan 掲示板  > .NET開発  > Managed DirectX  > LookAtLHの使い方について