2015-03-19 2 views
0

в настоящее время я масштабирование матрицы следующим образом:Масштаб матрицы вместо

public void scale(float aw, float ah){ 
    Matrix.scaleM(modelMatrix, 0, aw, ah, 1f); 
    updateMVP(); 
} 

private void updateMVP(){ 
    Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, modelMatrix, 0); 
} 

И с помощью: gl_Position = u_Matrix * a_Position; в моих вершинных шейдерах, u_Matrix будучи mvpMatrix. Камера я использую по умолчанию и projectionMatrix создано:

ASPECT_RATIO = (float) height/(float) width; 
orthoM(projectionMatrix, 0, -1f, 1f, -ASPECT_RATIO, ASPECT_RATIO, -1f, 1f); 

Теперь я могу масштабировать свой объект правильно, но единственная проблема в том, что каждый раз, когда я масштабировать матрицу, объект перемещается немного. Мне было интересно, как я могу масштабировать матрицу, сохраняя центральную точку и не переставляя объект. Кто-нибудь знает, как я могу это сделать в OpenGL ES 2.0 на Android? Спасибо

+0

Из показанного кода я могу только догадываться: вы держите матрицы для перемещения, поворота и масштабирования отдельный? Если нет, вы можете масштабировать уже преобразованный объект/матрицу – Felk

+0

В настоящее время у меня есть только модельМатрица, которую я сначала переводил, а затем масштабировал ее несколько раз. – TameHog

+0

Масштабирование относительно начала координат. Обычно вы сначала масштабируетесь (относительно пространства объекта), а затем переводите. Если вы хотите изменить масштабирование, вам нужно создать новую модельMatrix, а не умножаться на текущую, а затем применить все снова. – Felk

ответ

1

Есть ли у вас какие-либо другие матрицы (ротация/перевод)?

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

(надлежащий порядок умножить справа налево) Перевести * Вращение * Масштаб

Ваша ошибка звучит как один описано здесь:

Вы перевести корабль (10,0,0). Его центр теперь находится в 10 единицах происхождения. Вы масштабируете корабль на 2. Каждая координата умножается на 2 относительно начала координат, что далеко ... Таким образом, вы получаете большой корабль , но с центром в 2 * 10 = 20. Который вам не нужен.

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/

+0

. Итак, скажите, мне нужно сбросить мою модельную матрицу, масштабировать ее, повернуть он затем переводит его каждый раз, когда мне нужно его масштабировать? – TameHog

+0

Или вы говорите, что мне нужно иметь три матрицы для каждой операции, а затем умножить их вместе, чтобы получить матрицу модели? – TameHog

+0

Масштабирование должно быть в начале координат для правильной работы, так что да, вы должны снова выполнить вычисления перевода. Я не думаю, что вращение мешает масштабированию, но я не уверен на 100%. Вы можете объединить все матрицы вместе, если вы хотите сделать все это за один расчет, но они все равно должны быть в правильном порядке. –

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