Android OpenGL ES: вращение против произвольной оси? - PullRequest
1 голос
/ 29 июня 2011

У меня есть облако точек, которое я рендерил на Android OpenGL-ES. Я могу перевести это правильно (я думаю), но когда я поворачиваю его, я не могу заставить его работать так, как он хочет. Я хочу, чтобы он вращался вокруг центра облака точек (у меня есть эта трехмерная точка), но я не знаю, как это сделать.

public void onDrawFrame(GL10 gl) {
    // Clears the screen and depth buffer.
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    // Replace the current matrix with the identity matrix
    gl.glLoadIdentity();
    // Translates 4 units into the screen.

    GLU.gluLookAt(gl,   eyeX, eyeY, eyeZ, 
                        centerX, centerY, centerZ, 
                        upX, upY, upZ);

    // rotate
    gl.glRotatef(_xAngle, 1f, 0f, 0f);
    gl.glRotatef(_yAngle, 0f, 1f, 0f);
    gl.glRotatef(_zAngle, 0f, 0f, 1f);

    gl.glTranslatef(_xTranslate, _yTranslate, _zTranslate);

    // Draw things
    ptCloud.draw(gl);
    aBox.draw(gl);
}

Я изменяю переменные _translate и _angle в ответ на взаимодействие с пользователем, и в свою очередь OpenGl воздействует на них. Вы можете видеть, что я запускаю процедуру рисования на моем prCloud сразу после настройки моей перспективы. Я покажу вам, что:

public void draw(GL10 gl) {
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glPointSize(0.5f);
    gl.glDrawArrays(GL10.GL_POINTS, 0, numVertices);
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

Как и метод создания поверхности, потому что я не уверен, влияет ли он на что-либо:

public void onSurfaceChanged(GL10 gl, int width, int height) {
    // Sets the current view port to the new size.
    gl.glViewport(0, 0, width, height);
    // Select the projection matrix
    gl.glMatrixMode(GL10.GL_PROJECTION);
    // Reset the projection matrix
    gl.glLoadIdentity();
    // Calculate the aspect ratio of the window
    GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.001f,
            1000000.0f);

    // Select the modelview matrix
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    // Reset the modelview matrix
    gl.glLoadIdentity();
}

Вот мои переменные по умолчанию lookat:

private float eyeX = 20;
private float eyeY = -150; 
private float eyeZ = 60; 
private float centerX = 0;
private float centerY = 0;
private float centerZ = 0;
private float upX = 0;
private float upY = 0;
private float upZ = 1;

Точки были масштабированы, чтобы быть в диапазоне от (0,0,0) до (120,180,38). Я также не знаю, как найти положение глаза, которое покажет всю модель при условии случайных значений максимальной точки ...

Кто-нибудь может догадаться, почему он не будет вращаться так, как я ожидал?

1 Ответ

2 голосов
/ 29 июня 2011

Поворот после перевода!

Преобразование работает в том порядке, в котором вы говорите.Если вы поворачиваете перед переводом, то на перевод влияет вращение и т. Д. Если вы переводите перед вращением, вращение переводится до вращения, поэтому оно будет в центре вашего объекта.дополнительная информация:

http://www.3dcodingtutorial.com/Basic-OpenGL-functions/Translate-and-Rotate-functions.html

http://www.swiftless.com/tutorials/opengl/rotation.html

http://www.opengl.org/resources/faq/technical/transformations.htm

http://www.falloutsoftware.com/tutorials/gl/gl5.htm

...