2017-02-01 10 views
0

私は頂点(x、y、z)を持っており、このポイントがビューポートにレンダリングされるスクリーン位置を計算したいと思います。 Ray Pickingのようなものは、まったく異なる方法です。私はgluProjectを使用することはできないと考えています。投影されたポイントが必要な時に、私の行列がアイデンティティに戻されるからです。OpenGLとは独立して3D頂点をスクリーン座標に投影しますか?

私はOpenGLから独立したままにしたいので、余分なレンダーパスはありません。このようにして、私はレイピッキングのような数学に過ぎないと確信しています。私はそれを実装していますし、うまくいくので、同じ方法で頂点を投影したいと思います。

もちろん私はカメラpos、up、lookAtベクトルとfovyを持っています。これに関する情報源はありますか?それとも誰かがこれをどうやって解決するかを知っていますか?

答えて

2

あなたのあなたの行列を知っている(あるいは、少なくともそれらを構築する方法を知っている)、あなたはマトリックスとその位置を乗算して、ビューポート変換を実行することにより、頂点の画面位置を計算することができた場合:

vProjected = modelViewPojectionMatrix * v; 

if (
    // check that vertex shouldn't be clipped. 
    -vProjected.w <= vProjected.x && vProjected.x <= vProjected.w && 
    -vProjected.w <= vProjected.y && vProjected.y <= vProjected.w && 
    -vProjected.w <= vProjected.z && vProjected.z <= vProjected.w 
) { 
    vProjected /= vProjected.w; 

    vScreen.x = VIEWPORT_W * vProjected.x/2 + VIEWPORT_CENTER_X; 
    vScreen.y = VIEWPORT_H * vProjected.y/2 + VIEWPORT_CENTER_Y; 
} 

。なお、 OpenGLの規約に従って、(0, 0)は左下であり、左上ではありません。

ベクタと行列の演算子を持つ任意の数学ライブラリが役立ちます。たとえば、mathfuまたはglmです。

UPD。どのようにカメラの位置と向きと投影パラメータを指定してmodelViewProjectionMatrixを構築できますか? 2つの行列が必要です(モデル行列は単なる恒等性であると仮定します。つまり、頂点はすでにワールド座標系に与えられています)。最初はカメラの位置と向きを考慮したビュー行列です。私はそれに慣れてんだけど、心の中で3Dグラフィックスを持つほぼすべての数学ライブラリの設計は同じ機能を持っているので、ここで私はmathfuを使用することがあります:

viewMatrix = mathfu::mat4::LookAt(
    cameraLookAtPosition, 
    cameraPosition, 
    cameraUpVector 
); 

もう一つは射影行列のようになります。

projectionMatrix = mathfu::mat4::Perspective(fovy, aspect, zNear, zFar); 

modelViewProjectionMatrixは、これら二つの製品だけである:行列の乗算は、他の言葉で、可換ではないことを

modelViewProjectionMatrix = projectionMatrix * viewMatrix; 

A * B != B * A。したがって、行列が乗算される順序が重要です。

+0

私の場合、最初の条件は悲しいことに悲しいことです。 – Bitterblue

+1

OpenGLで変換を設定する方法がわかっている場合は、マトリックスも知っています。どちらかをdocs([gluLookAt](https://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml)、[glPerspective](https://www.opengl.org/)で検索するか、 sdk/docs/man2/xhtml/gluPerspective.xml))、または各マトリックスライブラリが提供する適切なメソッドを使用します。あるいは、マトリックススタックをリセットする前に 'glGet(GL_MODELVIEW_MATRIX、...)'でそれらをコピーします。 – BDL

+0

@Bitterblue私は使用された行列に関する少しの情報で答えを修正しました。また、gluまたはglから(BDLが示唆したように)それらを取得することもオプションです。 –

関連する問題