Использование матрицы. Повернуть в OpenGL ES 2.0

Изменить – добавлен код

Имея много проблем, пытающихся правильно повернуть мой квад, используя OpenGL ES 2.0.

Кажется, что он вращается вокруг центра экрана. Я пытаюсь заставить его вращаться вокруг собственного центра (для 2d, поэтому только для оси z).

Я экспериментировал с Matrix.translate как показано ниже. Тем не менее, изменение x или y pos здесь просто рисует квадроцикл в другом месте на экране, но когда он вращается, он снова вращается вокруг центра экрана. Пожалуйста, может кто-нибудь объяснить, как заставить его вращаться вокруг собственной оси z (например, колеса)?

Спасибо, вот соответствующие строки кода – если вам нужно больше, спросите, я отправлю. (Обратите внимание, что я рассмотрел множество подобных вопросов о SO и более широком Интернете, но до сих пор мне не удалось найти ответ).

Благодарю.

//Set rotation Matrix.setRotateM(mRotationMatrix, 0, -angle, 0, 0, 1.0f); //Testing translation Matrix.translateM(mRotationMatrix, 0, -.5f, .5f, 0f); // Combine the rotation matrix with the projection and camera view Matrix.multiplyMM(mvpMatrix, 0, mRotationMatrix, 0, mvpMatrix, 0); 

Мои шейдеры (объявленные на уровне класса)

 private final String vertexShaderCode = "uniform mat4 uMVPMatrix;" + "attribute vec4 vPosition;" + "void main() {" + " gl_Position = uMVPMatrix * vPosition;" + "}"; private final String fragmentShaderCode = "precision mediump float;" + "uniform vec4 vColor;" + "void main() {" + " gl_FragColor = vColor;" + "}"; 

От onSurfaceChanged

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

В методе My onDrawFrame

 // Set the camera position (View matrix) Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); //Calculate the projection and view transformation Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 

Я столкнулся с теми же проблемами (замеченные странные искажения и все остальное), мое решение основано на Android Training> Отображение графики с OpenGL ES> Добавление движения ниже.

(Перейдите к моему подробному сообщению для при необходимости: OpenGL ES Android Matrix Transformations .)

  1. Установите mModelMatrix для идентификации Matrix

     Matrix.setIdentityM(mModelMatrix, 0); // initialize to identity matrix 
  2. Применить перевод к mModelMatrix

     Matrix.translateM(mModelMatrix, 0, -0.5f, 0, 0); // translation to the left 
  3. Примените поворот к mRotationMatrix (углы в градусах)

     Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f); 
  4. Объединение вращения и перевода через Matrix.multiplyMM

     mTempMatrix = mModelMatrix.clone(); Matrix.multiplyMM(mModelMatrix, 0, mTempMatrix, 0, mRotationMatrix, 0); 
  5. Объедините матрицу модели с представлением проекции и камеры

     mTempMatrix = mMVPMatrix.clone(); Matrix.multiplyMM(mMVPMatrix, 0, mTempMatrix, 0, mModelMatrix, 0); 

Вот прохождение игры. Предположим, вы должны были нарисовать чайник … модельMatrix была бы идентичной для начала. Форма сосредоточена на происхождении следующим образом:

Предварительно повернуть и перевести

Убедитесь, что это то, что у вас есть, прежде чем продолжить …

После этого вы должны применить поворот к матрице модели, скомпилировать + запустить – вы получите повернутую копию …

повернутый

После этого вы можете перевести:

Повернуть и перевести

Итак, для вас все, что вам нужно сделать, похоже, проверяет, является ли матрица вращения, например Matrix.setIdentityM (mRotationMatrix, 0); Что форма находится в центре. Если он не перемещает его в центр.

Когда он находится в центре, примените поворот, например

  Matrix.setIdentityM( mRotationMatrix,0); <as needed movement to center> Matrix.rotate(mRotationMatrix, 0, -angle, 0, 0, 1.0f); <any other translation you want> 

Сделайте это поэтапно, чтобы сделать вашу жизнь легкой, чтобы вы видели, что происходит.

Вращение обычно происходит вокруг начала координат, поэтому вы хотите повернуть свой квад прежде, чем перевести его. Если вы перевернете после перевода, квадрат сначала будет удален от начала координат, а затем повернут вокруг начала координат.

Не зная, как реализована функция Matrix, мы не можем сообщить, правильно ли вы используете их. Все, что вы показали нам в интерфейсе функций.

Но в общем, поверните, прежде чем переводить.

Примените свои операции назад:

1st-Matrix.translateM (mRotationMatrix, 0, -.5f, .5f, 0f);

2nd-Matrix.setRotateM (mRotationMatrix, 0, -angle, 0, 0, 1.0f);

Он будет вращаться вокруг своего центра