Я потратил много времени, работая над этим сегодня (столкнулся с той же проблемой), и придумал код ниже.
Ключевой момент, на который следует обратить внимание, вам нужно установить preTranslate () и postTranslate () в центр (или где-то еще) области Canvas. Кажется, это означает, что он использует центр изображения, чтобы применить преобразование, вместо верхнего левого угла (x = 0, y = 0) по умолчанию. Вот почему вы получите параллелограмм вместо того, что вы ожидаете, трапецию (спасибо, что научили меня их именам).
Другая важная вещь, которую я поднял, - это функции сохранения / восстановления на холсте / камере. По сути, если вы вызываете функции Поворот последовательно три раза, не восстанавливая состояние каждый раз, вы продолжаете вращать свой объект вокруг и вокруг каждый раз, когда рисуете. Это может быть то, что вы хотите, но я, конечно, не сделал в моем случае. То же самое относится и к холсту, поскольку вы в основном применяете матрицу из объекта «Камера» к холсту, и ее необходимо сбросить, иначе происходит то же самое.
Надеюсь, это кому-нибудь поможет, это плохо документировано для начинающих. Совет всем, кто читает это, проверьте папку APIDemos в SDK Samples. Существует файл Rotate3dAnimation.java, который также демонстрирует это.
//Snippet from a function used to handle a draw
mCanvas.save(); //save a 'clean' matrix that doesn't have any camera rotation in it's matrix
ApplyMatrix(); //apply rotated matrix to canvas
Draw(); //Does drawing
mCanvas.restore(); //restore clean matrix
//
public void ApplyMatrix() {
mCamera.save();
mCamera.rotateX(-66);
mCamera.rotateY(0);
mCamera.rotateZ(0);
mCamera.getMatrix(mMatrix);
int CenterX = mWidth / 2;
int CenterY = mHeight / 2;
mMatrix.preTranslate(-CenterX, -CenterY); //This is the key to getting the correct viewing perspective
mMatrix.postTranslate(CenterX, CenterY);
mCanvas.concat(mMatrix);
mCamera.restore();
}