0

3DOpenGLプロジェクトのCameraクラスを作成しようとしています。しかし、実際にカメラを自分のシーンに適用する方法がわかりません。私はこれらのカメラ機能を持っています(とりわけ):

void Camera::update(){
    glm::vec3 direction(cos(_verticalAngle) * sin(_horizontalAngle), sin(_verticalAngle), cos(_verticalAngle) * cos(_horizontalAngle));

    glm::vec3 right = glm::vec3(sin(_horizontalAngle - 3.14f/2.0f), 0, cos(_horizontalAngle - 3.14f/2.0f));

    glm::vec3 up = glm::cross(right, direction);

    _projectionMatrix = glm::perspective(_FoV, float(VIEWPORT_X) / float(VIEWPORT_Y), 0.1f, 250.0f);
    _viewMatrix = glm::lookAt(_position, _position + direction, up);
}
glm::mat4 Camera::getProjectionMatrix(){
    return _projectionMatrix;
}
glm::mat4 Camera::getViewMatrix(){
    return _viewMatrix;
}

それらはチュートリアルから作成されましたが、テストできないため、機能するかどうかはわかりません。私がやりたいのは、OpenGLにビューと投影行列を使用してカメラをシミュレートさせることです。モデルの変換とは別にカメラを適切にシミュレートするために、これらの投影行列とビュー行列を使用するようにOpenGLにどのように正確に指示しますか?OpenGLがデフォルトでglm行列を受け入れないことは知っていますが、いくつかのチュートリアルでこのタイプのことを見てきました。

glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = getViewMatrix();
glm::mat4 ModelMatrix = glm::mat4(1.0);
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

しかし、glUniformMatrix4fv(これはカメラ変換を適用すると思いますか?)は私には意味がありません。それは常にシェーダーと関係がありますが、私にはありません。私は現在、ワイヤーフレームテストメッシュを持っています。誰かがこの問題のコードスニペットを教えてもらえますか?

4

3 に答える 3

2

シェーダーを使用していない場合はglLoadMatrixf()を使用し、現在のマトリックスを乗算するだけの場合はglMultMatrixf()を使用し、現在のマトリックスモードはglMatrixMode(GL_PROJECTIONまたはGL_MODELVIEW)を使用して切り替えることができます。たとえば(これはあなたのコードです):

lm::mat4 ProjectionMatrix = getProjectionMatrix();

//setup projection matrix for opengl
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMultMatrixf(glm::value_ptr(ProjectionMatrix));
or:
glMultMatrixf(&ProjectionMatrix[0][0]);

編集:

モデルに変換を適用する場合:(model_viewは固定関数で結合されます)

glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(&viewMatrix[0][0]); 
glMultMatrixf(&modelTransform[0][0]);   //model * view
Draw_your_model();

次のように変換を設定する必要がある場合があります。glm::translate(modelTransform、-10、-10、-10); したがって、モデルは(10,10,10)になります

于 2012-12-10T08:45:03.697 に答える
1

GLMの使用についてはわかりませんが、通常のOpenGLの部分を手伝うことができます。

glUniformMatrix4fvは、特定のシェーダープログラムのMatrixIDで指定された場所で4x4の均一なマトリックスを更新します。

リファレンスとガイドの両方として優れている、Learning Modern 3DGraphicsProgrammingを使用することをお勧めします。

これらのユニフォームがGLSLシェーダープログラム内でどのように使用されるかについては、「 最新の3Dグラフィックスプログラミングの学習-第3章」を参照してください。

于 2012-12-10T01:53:19.770 に答える
0

コードに基づいて、次のことを行う必要があります。

glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = inverse(getViewMatrix());//view(camera) must be inverse(if you don't already do it)
glm::mat4 ModelMatrix = glm::mat4(1.0);
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, value_ptr(MVP));//use value_ptr method to pass matrix pointer

また、適切なカメラマトリックスを設定するには、lookAt()GLM組み込みメソッドを使用して、eye、dir、upを計算し、それらを最終的なマトリックスに構成することをお勧めします。

于 2012-12-10T09:45:22.363 に答える