Добрый вечер! Перелопатил весь форум, перепробовал все варианты что только смог найти, а в итоге так и не сдвинулся с места. Пишу под Android, причем сравнительно недавно. Остановился на загрузке данных из SMD файла... а дальше просто ступор. Помогите пожалуйста, уже башка трещит...
В общем имеется класс для хранения данных Сустава:
class Joint { int JointIndex; int ParentJointIndex; float XTranslate; float YTranslate; float ZTranslate; float XRotate; float YRotate; float ZRotate; float[] LocalMatrix; float[] WorldMatrix; public Joint() { LocalMatrix = new float[16]; WorldMatrix = new float[16]; Matrix.setIdentityM(LocalMatrix, 0); Matrix.setIdentityM(WorldMatrix, 0); } public void ComputeLocalMatrix() { // матрицы float[] rotateX = new float[16]; float[] rotateY = new float[16]; float[] rotateZ = new float[16]; float[] rotate = new float[16]; float[] translate = new float[16]; Matrix.setIdentityM(rotateX, 0); Matrix.setIdentityM(rotateY, 0); Matrix.setIdentityM(rotateZ, 0); Matrix.setIdentityM(rotate, 0); Matrix.setIdentityM(translate, 0); Matrix.multiplyMM(rotate, 0, rotateX, 0, rotateY, 0); Matrix.multiplyMM(rotate, 0, rotate, 0, rotateZ, 0); Matrix.translateM(translate, 0, XTranslate, YTranslate, ZTranslate); Matrix.multiplyMM(LocalMatrix, 0, translate, 0, rotate, 0); } public void ComputeWorldMatrix(float[] parentJointWorldMatrix) { if(parentJointWorldMatrix == null) // т.е если сустав не имеет родительского WorldMatrix = LocalMatrix; // мировой будет его локальная матрица else Matrix.multiplyMM(WorldMatrix, 0, parentJointWorldMatrix, 0, LocalMatrix, 0); }
В самом парсере гружу данные и вызываю методы для расчета матриц:
int index = Integer.parseInt( m.group(1) ); Joints.get(index).XTranslate = Float.parseFloat( m.group(2) ); // x Joints.get(index).YTranslate = Float.parseFloat( m.group(4) ); // z Joints.get(index).ZTranslate = Float.parseFloat( m.group(3) ); // y Joints.get(index).XRotate = Float.parseFloat( m.group(5) ); // x rotate Joints.get(index).YRotate = Float.parseFloat( m.group(7) ); // z rotate Joints.get(index).ZRotate = Float.parseFloat( m.group(6) ); // y rotate Joints.get(index).ComputeLocalMatrix(); if(Joints.get(index).ParentJointIndex == -1) { Joints.get(index).ComputeWorldMatrix(null); } else { int ParentIndex = Joints.get(index).ParentJointIndex; Joints.get(index).ComputeWorldMatrix( Joints.get(ParentIndex).WorldMatrix ); }
Дальше какие только варианты не пробовал, что-бы применить эти трансформации к вершинам(
Статический мешь грузиться верно, и все остальные данные тоже...
Анимацию пока загружать не хочу, т.к предчуствую еще больший геморой....
Собственно подскажите пожалуйста, правильно ли я рассчитываю матрицы? И как эти матрицы применить к суставам, что бы они встали на свои места?
Пробовал через Matrix.multiplyMV умножать нулевой вектор на полученную матрицу, а потом рисовать точки, что-бы увидеть правильно ли построен скелет. Все тщетно.
С Opengl дела не имел, с анимацией тоже( Читал, искал...
Тема в архиве.