2015-05-06 8 views
2

наблюдения для: Calculating world coordinates from camera coordinatesВыполнение умножения матриц в обратном

Я умножая 2D вектор с матрицей трансформации (модель-представление матрицы OpenGL), чтобы получить мировые координаты с координатами моей камеры.

я этот расчет, как это:

private Vector2f toWorldCoordinates(Vector2f position) { 

    glPushMatrix(); 
    glScalef(this.zoom, this.zoom, 1); 
    glTranslatef(this.position.x, this.position.y, 0); 
    glRotatef(ROTATION, 0, 0, 1); 

    ByteBuffer m = ByteBuffer.allocateDirect(64); 
    m.order(ByteOrder.nativeOrder()); 
    glGetFloatv(GL_MODELVIEW_MATRIX, m); 

    float x = (position.x * m.getFloat(0)) + (position.y * m.getFloat(4)) + m.getFloat(12); 
    float y = (position.x * m.getFloat(16)) + (position.y * m.getFloat(20)) + m.getFloat(28); 

    glPopMatrix(); 
    return new Vector2f(x, y); 
} 

Теперь я хочу, чтобы это сделать наоборот: вычислить координаты камеры для позиции в мире. Как я могу отменить этот расчет?

+2

Если я читаю это правильно, вам нужно только вычислить обратную матрицу преобразования и применить ее к вашим мировым координатам. – andand

ответ

2

Чтобы создать матрицу, представляющую обратное преобразование к одному выше, применяются преобразования в обратном направлении, с отрицательными величинами для вращения и перевода и обратной величины для увеличения:

glRotatef(-ROTATION, 0, 0, 1); 
glTranslatef(-this.position.x, -this.position.y, 0); 
glScalef(1.0f/this.zoom, 1.0f/this.zoom, 1); 

затем умножить на как и раньше.

Альтернативой является вычисление inverse matrix, но этот способ намного проще.

+0

Хорошее и чистое решение, спасибо большое. Гораздо проще, чем вычислять обратные матрицы наверняка :) – maxdev

Смежные вопросы