Перемещение сетки относительно начала координат - PullRequest
1 голос
/ 16 июня 2011

Noobie: я могу построить и нарисовать сетку (загруженную из файла STL), масштабировать ее соответствующим образом и центрировать сетку на экране, но я не могу переместить сетку относительно источника. Часто координаты сетки, скажем, все в октанте + ve, поэтому я хочу переместить его так, чтобы его центр находился в начале координат, и затем я мог бы повернуть его вокруг.

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

public void onSurfaceChanged(GL10 gl, int w, int h) {

    gl.glViewport(0, 0, w, h); 
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity(); 

    GLU.gluPerspective(gl, 45f, (float)w / (float)h, 0.1f, 5f * fMesh_Z_Extent;

    gl.glTranslatef(0, 0, 0 - (2.5f * fMesh_Z_Extent));

    float f1, f2, f3;

    // set f1, f2, f3 to move centre of model to sit on the origin
    // this works perfectly, but the origin has moved with the mesh! Grrrr. 

    gl.glTranslatef(f1, f2, f3);

    gl.glMatrixMode(GL10.GL_MODELVIEW);     //Select The Modelview Matrix
    gl.glLoadIdentity(); 
    }

public void onDrawFrame(GL10 gl) {

    gl.glClearColor(0f, 0f, 0f, 1f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    // initialise mesh here

    gl.glColor4f(8f, 255f, 128f, 1f);

    gl.glDrawElements(GL10.GL_TRIANGLES, Global.indices.length,
                  GL10.GL_UNSIGNED_SHORT, Global.indexBuffer);

    gl.glRotatef(3.0f, 0.0f, 1.0f, 0.0f);

    // Disable the vertices buffer.
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    }       

1 Ответ

3 голосов
/ 16 июня 2011

Вам просто нужно вращать и переводить в обратном порядке. Умножение матриц в OpenGL работает противоположно тому, как мы интуитивно думаем о них. Если вы хотите переместить ваш объект в начало координат, а затем повернуть его, вам нужно сначала glRotate, а затем glTranslate - да ... странно, ха.

Я бы поместил glTranslate в onDrawFrame и просто делал это каждый кадр.

edit: ах ... вы хотите, чтобы он отображался с углом в начале координат, но вращался вокруг 65,65,65? Затем вам нужно перевести -65, повернуть, затем перевести 65, чтобы вернуть его. Это сделает центр вращения вокруг центра объекта.

Вы также должны иметь glPushMatrix / glPopMatrix вокруг этих вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...