0

注:リンク/画像がテキストにすぎないことをお詫びします。新しいユーザーとして、画像を投稿したり、2つ以上のハイパーリンクを投稿したりすることはできません。

そのため、私は非推奨のOpenGLをしばらく使用しており、数週間前に最終的に最新の方法にジャンプすることを決定しました。Open.glをリソースとして使用して(LWJGLチュートリアルは一貫性がなく、まばらであることがわかりました)、かなり遠くまで到達し、このチュートリアルの最後の画像までレンダリングすることができます。しかし、次のページ(立方体のレンダリング)でいくつかの深刻な問題が発生しました。

私はこの問題について多くの調査を行い、すべてのコンポーネントの目的を完全に理解し、基本的なもの(バッファーの反転を忘れるなど)を見逃さないように、コードを何度も改良/再編成しました。エラーが発生している可能性がある領域を絞り込むため。

したがって、私の基本的な目標は、次のサンプルコードを使用して、立方体をレンダリングすることです。http://open.gl/content/code/c5_cube.txt 比較のためのコードは次のとおりです。http://pastie.org/5864112#241

コードから得られる結果は次のとおりです。

ビューマトリックスをZ方向にのみ変換すると、最後のチュートリアルの最後の画像とまったく同じになります。https://dl.dropbox.com/u/38489921/vbo11.png

//set up view matrix - TODO: problem 1?
    Matrix4f view = new Matrix4f();
    view.setIdentity();
    view.translate(new Vector3f(0.0f, 0.0f, -2f)); 
    view.m13 = 1f;
    FloatBuffer viewSend = BufferUtils.createFloatBuffer(16);
    view.store(viewSend);
    viewSend.flip();
    int uniView = glGetUniformLocation(shaderProgram, "view");
    glUniformMatrix4(uniView, false, viewSend);

これは実際にはここでの私の問題である可能性があります-サンプルコードはアクセスできないglm::lookAt()を使用しているため、マトリックスで完全に間違ったことをしている可能性があります。

次に、ビューマトリックスをY方向に任意の量だけ移動すると(画像の下のコード)、一種の歪んだ立方体が得られます。https://dl.dropbox.com/u/38489921/vbo12.png

//set up view matrix - TODO: problem 1?
    Matrix4f view = new Matrix4f();
    view.setIdentity();
    view.translate(new Vector3f(0.0f, 1.0f, -2f)); 
    view.m13 = 1f;
    FloatBuffer viewSend = BufferUtils.createFloatBuffer(16);
    view.store(viewSend);
    viewSend.flip();
    int uniView = glGetUniformLocation(shaderProgram, "view");
    glUniformMatrix4(uniView, false, viewSend);

これにより、遠近法の投影に問題があると思いました。そこで、もう少し調査を行い、perspective()関数が正しいことを確認しました。投影の実装にほとんど変更を加えても視覚的な結果は変わらないので、代わりに関数とその使用方法をここで強調します。

//set up projection matrix //TODO: problem 2?
    Matrix4f proj = perspective(90f, 600f / 800f, 1f, 10f);
    FloatBuffer projSend = BufferUtils.createFloatBuffer(16);
    proj.store(projSend);
    projSend.flip();
    int uniPersp = glGetUniformLocation(shaderProgram, "proj");
    glUniformMatrix4(uniPersp, false, projSend);

private Matrix4f perspective(float fov, float aspectRatio, float zNear, float zFar) {
    float zm = zFar - zNear;
    float zp = zFar + zNear;

    Matrix4f persp = new Matrix4f();

    persp.m00 = (1 / (float)Math.tan(Math.toRadians(fov / 2))) / aspectRatio;
    persp.m11 = 1 / (float)Math.tan(Math.toRadians(fov / 2));
    persp.m22 = -zp / zm;
    persp.m23 = -1;
    persp.m32 = -((2 * zNear * zFar) / zm);

    return persp;
}

私の意見では、これは非常に奇妙なエラーであり、私はそれを完全に理解することができません。自分で直そうと研究を重ねた結果、正直脳が痛くなるところまで来たので、助けを求めたいと思いました。

ここでの私の目標は、このエラーの原因、理由、および修正方法を確認することです(必要に応じて、このタイプのエラーが再発しないようにするために使用できる特別なヒントやコツ)。私はどんな助けにも感謝しており、必要なさらなる情報を提供します。

どうもありがとう、-ジョンノ。

4

1 に答える 1

1

あなたの問題が何であるかを完全に理解することはできません。ビューマトリックスを翻訳すると、予期しない動作が発生すると言います...そうですか?

マトリックスの設定にエラーは見られないので、GLSLシェーダーコードと、画像の頂点情報を宣言する瞬間(テクスチャとしての画像ではなく、空間内の3Dオブジェクトとしての画像)を提供してください。それには何か問題があると思います(頂点が4つしかないのに立方体を取得することはできないので、もっと多くの頂点があるかもしれません)。

また、あなたを助けるために、これは「ModerngluLookAt」のコードです

public Matrix4f set(float cameraX, float cameraY, float cameraZ, 
float lookX, float lookY, float lookZ){

//My advice to you: you shouldn't create new matrix everytime, 
//it will give you little glitches. 
//Create some new class containing this method, change type to void 
//and declare "matrix" as a field - make your own "camera" object (java object)

Matrix4f matrix = new Matrix4f();
Matrix4f aux = new Matrix4f();

Vector3f dir = new Vector3f(lookX - cameraX, lookY - cameraY, lookZ - cameraZ);
Vector3f up = new Vector3f(0, 1f, 0);
Vector3f right = new Vector3f();
dir.normalise();

Vector3f.cross(dir,up,right);
right.normalise();

Vector3f.cross(right,dir,up);
up.normalise();

matrix.m00 = right.getX();
matrix.m01 = right.getY();
matrix.m02 = right.getZ();
matrix.m03 = 0.0f;

matrix.m10 = up.getX();
matrix.m11 = up.getY();
matrix.m12 = up.getZ();
matrix.m13 = 0.0f;

matrix.m20 = -dir.getX();
matrix.m21 = -dir.getY();
matrix.m22 = -dir.getZ();
matrix.m23 =  0.0f;

matrix.m30 = 0.0f;
matrix.m31 = 0.0f;
matrix.m32 = 0.0f;
matrix.m33 = 1.0f;

//setup aux as a translation matrix by placing positions in the last column
aux.m30 = -cameraX;
aux.m31 = -cameraY;
aux.m32 = -cameraZ;

//multiplication(in fact translation) viewMatrix with aux
Matrix4f.mul(matrix, aux, matrix);

return matrix;
}

私はあなたの問題を見つけました:

view.m13 = 1f;

これは、カメラが4番目のW次元にあることを意味します。したがって、ビューマトリックスを変換すると、画像もW方向に移動します。したがって、この行を削除します。

また、これはLWJGLのマトリックスをよりよく理解するためのヒントです。

m00 | m10 | m20 | m30 ||| _ ||| Xx | Yx | Zx | Wx

m01 | m11 | m21 | m31 ||| _ ||| Xy | Yy | Zy | ワイ

m02 | m12 | m22 | m32 ||| _ ||| Xz | Yz | Zz | Wz

m03 | m13 | m23 | m33 ||| _ ||| Xw | Yw | Zw | うわぁ

m03、m13、m23はほとんどの場合0でなければならず、m33=1です。

よろしく。

于 2013-01-28T19:33:57.707 に答える