Применяете ортогональную проекцию или усеченный конус, воздействуя на нормализованные координаты

Я знаю, что нормализованные координаты должны быть -1 (слева) и +1 (справа) и -1 (снизу) и +1 (вверху)

как это:

введите описание изображения здесь

Но после применения этого:

Из моего метода onSurfaceChanged

GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

//The above line can be replaced with:
//Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
//But I get the same results with either frustumM or otrhoM

И это в моем методе onDrawFrame

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);

(Затем я передаю mMVPMatrix в метод рисования моего пользовательского класса, где он вращается и переводится).

Но мои координаты, похоже, меняются - примерно так и происходит:

введите описание изображения здесь

Как видите, координаты x несколько изменены, -1 и +1 больше не являются краями экрана (на устройстве, которое я сейчас использую, внешние края становятся -1.7 и +1.7)

Координаты Y остаются без изменений.

Был бы признателен, если бы кто-то мог указать, где я иду не так? Мне нужно, чтобы оно было от -1 до +1, как и должно быть.

Спасибо

1 ответ

Решение

На мой взгляд это кажется правильным. Если ваш экран не квадратный, то вы уверены, что хотите, чтобы ось x была растянута, чтобы она работала как квадратный экран? Потому что, если вы сделаете это, то если вы скажете OpenGL нарисовать квадрат, он будет отображаться в виде прямоугольника на экране, если у вас не будет краев оси x больше, чем краев оси y, когда ширина экрана шире, чем ваша высота экрана, как показано на рисунке. Вот почему вы передаете свой ratio в проекции, поэтому он знает, как правильно рисовать вещи.

Что происходит, когда вы рисуете обычный квадрат на экране? Это выглядит как квадрат или прямоугольник?

Другие вопросы по тегам