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