遠近法マトリックスが右手系座標系か左手系座標系かを知るにはどうすればよいですか?


7

たとえば、パースペクティブマトリックスを次のように定義するとします。

m[0]  = 1.f / ( aspect * focalLength );
m[5]  = 1.f / focalLength;
m[10] = -zFar / (zFar - zNear);
m[11] = -1;
m[14] = -(zFar*zNear)/(zFar - zNear);

遠近法マトリックスが右手系座標系か左手系座標系かをどのように確認できますか?

回答:


7

Z行(または行列の向きに応じて列)に1または-1があるかどうかで違いがわかると思います。特に:

  • 左利き:1
  • 右利き:-1

比較については、D3DXMatrixPerspectiveLHD3DXMatrixPerspectiveRHの両方のリンクを参照してください。DirectXは左利きなので、通常は左利きバージョンを使用します。これは、3行目の4列目に1があります。

一方、OpenGLとXNAはどちらも右利きであり、OpenGLは4列目の3列目にあるのに対し、XNAはDirectXのように3列目の4列目にあるにもかかわらず、生成されるパースペクティブマトリックスが-1を使用していることを確認できます。 (列の主行列と行の主行列)。


4
どちらのAPIも特定の利き手があると説明するのは実際には正しくありません。一般にそれぞれに起因する利き手は、最近の何よりも歴史的な慣習であり、それぞれは、必要または望まれる場合、完全にもう一方の利き手をサポートすることができます。OpenGLに関する注意事項:opengl.org/resources/faq/technical/transformations.htm9.150)。
Maximus Minimus

@ mh01もちろん、右手座標系と左手座標系の間の変換は、他のすべての前に(1,1、-1)スケール変換を適用するのと同じくらい簡単です。ただし、変換を自分で行うよりも、各APIの規則に従ってプレイする方が賢明です。
David Gouveia

2
D3Dについては、明示的に規約をまったく指定しておらず、少なくともD3D8以降、そのすべての射影行列関数の-RHバージョンと-LHバージョンの両方を備えています。RMとCMについて-D3Dは実際にはCMを内部で使用しており、シェーダーに送信するときにマトリックスを転置する必要があります。D3D9が自動的に行います。10と11では、自分で行う必要があります。しかし、サンプルコードに従っている場合は確立された規則を使用する可能性が高いので、自分で従えばより明確になるということを考慮して同意します。
Maximus Minimus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.