1

そこで、gluProject を使用して 3D 座標を取得し、レンダリングされた画面上の場所を教えてくれます。問題は、gluProject で同じ座標が得られず、実際にレンダリングされた場所が得られないことです。奇妙な部分は、カメラの x、y、z とテストしているポイントの差が等しい場合 (たとえば、カメラが 5,3,4 でポイントが 2,0,1 の場合)、正しい値が得られることです。値。カメラの変換に gluLookAt() を使用しています。レンダリングに使用するのと同じ行列が gluProject に渡されていることを確認しました。以下は、私のレンダリング コード、camera.look()、および gluProject を使用した私の部分です。

レンダリング:

glEnable(GL_LIGHTING);
glEnable(GL_NORMAL_ARRAY);
glViewport(0, 0, Display.getHeight(), Display.getHeight());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0f, 1, .1f, 1000f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
cam.look();
for (Cube cube : cubes) {
    cube.draw();
}
grid.draw();

Camera.look():

void look() {
    calcPoints(xAng, yAng);
    gluLookAt(x, y, z, x + dx, y + dy, z + dz, 0, 1, 0);
}

gluProject の部分:

glViewport(0, 0, Display.getHeight(), Display.getHeight());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0f, 1, .1f, 1000f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
cam.look();

modelview = BufferUtils.createFloatBuffer(16); //floatbuffers, defined earlier
projection = BufferUtils.createFloatBuffer(16);
viewport = BufferUtils.createIntBuffer(16);
FloatBuffer result = BufferUtils.createFloatBuffer(3);

glGetFloat(GL_MODELVIEW_MATRIX, modelview);
glGetFloat(GL_PROJECTION_MATRIX, projection);
glGetInteger(GL_VIEWPORT, viewport);

gluProject(1f, 0f, 0f, modelview, projection, viewport, result);
//Utils.printFloatBuffer(projection);
//Utils.printFloatBuffer(modelview);
System.out.println(result.get(0) + " " + result.get(1) + " " + result.get(2));
4

1 に答える 1

0

アップ ベクトルを常に (0, 1, 0) ではなく、カメラの方向と位置に対して直角に設定してみてください。

于 2013-03-07T00:17:25.450 に答える