Я работаю с OpenGL ES 2.0 и пытаюсь создать свой класс объектов с некоторыми методами для их поворота/перевода/масштабирования.
Я просто устанавливаю свой объект в 0,0,0 и затем перемещаю его в нужное место на экране. Ниже приведены мои методы перемещения его отдельно. После этого я запускаю buildObjectModelMatrix, чтобы передать все матрицы в одну objectMatrix, чтобы я мог взять вершины и умножить их на мою modelMatrix/objectMatrix, а затем визуализировать их.
Что я считаю правильным, я должен умножить свои матрицы в следующем порядке:
[масштаб]x[поворот]x[перевод]
->
[temp]x[перевод]
->
[объектная матрица]
Я нашла литературу. Может быть, я получу его через несколько минут, если я буду, я обновлю его.
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);
}
с этим вы сначала переводите и вращаете. После этого вы можете масштабировать объект.
Протестировано с несколькими объектами... надеюсь, это помогло :)