Проблема с рисованием растрового изображения на повернутом холсте вокруг оси X - PullRequest
0 голосов
/ 28 июля 2011

Добрый день,

У меня странная проблема с рисованием изображения.Код и картинки говорят больше, чем слова.

mCamera.save();
mCamera.rotateX(rotateX);
mCamera.getMatrix(mMatrix);
mCamera.restore();

canvas.save();
canvas.setMatrix(mMatrix);

// here I draw images
...

canvas.restore();

и результаты на рисунках ниже.Первая картинка имеет угол 0, вторая около 45 градусов и последняя что-то большее.Это зависит от размера области (количества растровых изображений), которую я хочу нарисовать.Я замечаю, что когда я рисую растровые изображения, которые в целом соответствуют границам холста, это работает отлично.Но проблема в основном, когда я рисую изображения с чем-то вроде (например, с частью вне холста)

canvas.drawBitmap(image, -100, -100, null)

и изображениями (хм, потому что я новичок здесь, я не могу публиковать изображения напрямую ...)

ttp: //locus.asamm.cz/data/_temp/1311873666794.png

http://locus.asamm.cz/data/_temp/1311873695945.png

http://locus.asamm.cz/data/_temp/1311873782054.png

Так что вопрос,если есть какой-либо рабочий раствор или хотя бы какой-нибудь совет.Также, если кто-то опытный может сказать, может ли рисование с OpenGL помочь с этим, и если так, пожалуйста, укажите мне любой источник информации, который может помочь мне с рисованием растровых изображений, которые сильно меняются (это приложение карты, поэтому пользователь перемещается с картой), потому что я все ещене могу найти простой и понятный источник информации.

Спасибо всем большое

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

Я ожидаю, что вы пытаетесь создать эффект наклона / поворота карт Google, который я успешно выполнил для карт Google, поскольку они не думают, что нам нужно обновление ;-), и мне оно понадобилось для моего приложения, даже если выиспользуя ваши собственные плитки это в основном то же самое.

Одна вещь, которая помогает, это понять, что повороты для матрицы камеры выполняются в верхнем левом углу.

Таким образом, вы должны преобразоваться в соответствующее место (в зависимости от оси вращения и ожидаемых результатов), а затем обратно, что-то вроде ... эффекты, которые вы получаете, были очень похожи на мои, прежде чем я прочитал документы ипонял это.

camera.save();
    camera.rotateX(tilt);  // tilt forward or backward
    camera.rotateY(0);
    camera.rotateZ(angle); // Rotate around Z access (similar to canvas.rotate)                                 

     camera.getMatrix(cameraMatrix);

     // This moves the center of the view into the upper left corner (0,0) 
     // which is necessary because Matrix always uses 0,0, as it's transform point
     // use the center of the canvas, or the bottom center dependent on your results 
     cameraMatrix.preTranslate(-centerX, -centerY);

     // NOTE: Camera Rotations logically happen here when the canvas has the matrix applied  
     // This happens after the camera rotations are applied, moving the view back to 
     // where it belongs, allowing us to rotate around the center or any point we choose 

     // Move it back after the rotations are applied
     cameraMatrix.postTranslate(centerX, centerY);

camera.restore();

canvas.concat(cameraMatrix);

Другая вещь, которую нужно сделать, это увеличить размер контейнера, чтобы у вас не было пустого пространства (или, по крайней мере, ограничить его) после операций наклона / поворота, вы можете сделать это, рассчитав необходимый размер.диагональ вашего дисплея работает для базового поворота, + процент в зависимости от наклона, если вы используете это.

Игра с pre / postTranslate может дать вам интересные результаты.

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

Обновление

Вот как я увеличил размер холста, я попытался использовать LayoutParams, чтобы сделать это, но мне не очень повезло с этим, поэтому Мера была для меня способом.

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    if (!isInEditMode())
        super.onMeasure(View.MeasureSpec.makeMeasureSpec(scaledDimensionsW,
        View.MeasureSpec.EXACTLY),
        View.MeasureSpec.makeMeasureSpec(scaledDimensionsH,
        View.MeasureSpec.EXACTLY));
   else
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
0 голосов
/ 28 июля 2011

Это ограничение API 2D-рисования.Для создания настоящего 3D вы должны использовать OpenGL.

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