あなたのあなたの行列を知っている(あるいは、少なくともそれらを構築する方法を知っている)、あなたはマトリックスとその位置を乗算して、ビューポート変換を実行することにより、頂点の画面位置を計算することができた場合:
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
。したがって、行列が乗算される順序が重要です。
私の場合、最初の条件は悲しいことに悲しいことです。 – Bitterblue
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
@Bitterblue私は使用された行列に関する少しの情報で答えを修正しました。また、gluまたはglから(BDLが示唆したように)それらを取得することもオプションです。 –