2014-09-29 3 views
1

Я работаю с OpenGL ES 2.0 и пытаюсь создать класс объектов с помощью некоторых методов, чтобы повернуть/перевести/масштабировать их.Масштаб, повернуть, перевести w. матрицы в openGl ES 2.0

Я просто установил свой объект в 0,0,0 и переместил его в нужное положение на экране. Ниже приведены мои методы для его перемещения отдельно. После этого я запустил buildObjectModelMatrix, чтобы передать все матрицы в одну objectMatrix, поэтому я могу взять вершины и размножить их с помощью modelMatrix/objectMatrix и затем вынести их.

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

[Масштаб] х [вращение] х [перевод]

->

[Темп] х [ перевод]

->

[objectMatrix]

Я мы нашли некоторую литературу. Может быть, я получу его за несколько минут, если я захочу, я его обновлю.

Beginning Android 3D

http://gamedev.stackexchange.com

setIdentityM(scaleMatrix, 0); 
    setIdentityM(translateMatrix, 0); 
    setIdentityM(rotateMatrix, 0); 
public void translate(float x, float y, float z) { 
    translateM(translateMatrix, 0, x, y, z); 
    buildObjectModelMatrix(); 
} 

public void rotate(float angle, float x, float y, float z) { 
    rotateM(rotateMatrix, 0, angle, x, y, z); 
    buildObjectModelMatrix(); 
} 

public void scale(float x, float y,float z) { 
    scaleM(scaleMatrix, 0, x, y, z); 
    buildObjectModelMatrix(); 
} 

private void buildObjectModelMatrix() { 
    multiplyMM(tempM, 0, scaleMatrix, 0, rotateMatrix, 0); 
    multiplyMM(objectMatrix, 0, tempM, 0, translateMatrix, 0); 
} 

РЕШИТЬ: Проблема в целом вещь, если масштаб, прежде чем перевести вы получите разницу в расстоянии вы переводите ! правильный код для умножения ваших матриц должны быть (поправьте меня, если я ошибаюсь)

private void buildObjectModelMatrix() { 
    multiplyMM(tempM, 0, translateMatrix, 0, rotateMatrix, 0); 
    multiplyMM(objectMatrix, 0, tempM, 0, scaleMatrix, 0); 
} 

с этим вы переводите и вращать первый. Впоследствии вы можете масштабировать объект.

Испытано с несколькими объектами ... так что я надеюсь, что это помогло :)

ответ

0

Вы знаете, это самая распространенная проблема с большинством людей, когда начинают заниматься с матричными операциями. Как работает матричное умножение, как если бы вы смотрели с первого взгляда лица на объекты, получая некоторые команды: например, если вы начали с (0,0,0), обратившись к положительной оси X, а up были бы положительной осью Y, тогда перевести (a,0,0) означало бы «идти вперед», переводить (0,0,a) бы означало бы «пойти налево», поворот (a, 0, 1, 0) будет означать «повернуть налево» ...

Так что если в вашем случае масштабируется 3 единиц, повернутых 90 градусов, а затем переведенного (2,0,0), что происходит, вы первый увеличить по шкале от 3, затем поверните 90 градусов, чтобы теперь вы оказались на позитиве Z все еще довольно большой. Затем вы идете вперед по 2 единицам, измеренным в вашей собственной системе координат, что означает, что вы действительно перейдете на (0,0,2*3). Таким образом, вы попадаете на (0,0,6), глядя в сторону положительного Z оси.

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

Вы должны знать, что, хотя эта матрица работает нормально, когда вы начинаете с 3D-сцены, вы должны как можно скорее перейти к лучшей системе. В основном я использую структуру объектов/класс, которая содержит 3 вектора: position, forward и up (это очень похоже на использование glLookAt, но не полностью такое же). Поэтому, имея эти 3 вектора, вы можете просто установить определенную позицию или поворот с помощью тригонометрии или ваших матричных инструментов, умножив векторы с матрицами вместо матриц с матрицами. Или вы можете работать с ними внутренне (первый человек), где, например, «идти вперед» будет сделано как position = position + position*forward*scale, поворот влево будет вращать вектор forward вокруг up вектор. В любом случае, я надеюсь, что вы поймете, как манипулировать этими 3 векторами, чтобы получить желаемый эффект ... Итак, что вам нужно сделать, чтобы восстановить матрицу из этих трех векторов, необходимо создать другой вектор right, который является перекрестным продуктом up и forward, тогда модельная матрица состоит из:

right.x, right.y, right.z, .0 
up.x,  up.y,  up.z, .0 
forward.x, forward.y, forward.z, .0 
position.x, position.y, position.z, 1.0 

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

Надеюсь, это даст вам некоторое понимание ...

+0

спасибо, да, это было сделано – LordSmith

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