Повернуть изображение вокруг оси Y в Java? - PullRequest
2 голосов
/ 11 мая 2010

Мне нужно повернуть 2d спрайт вокруг оси y. Например, у меня есть 2-й вид спрайта самолета. Когда пользователь поворачивает самолет, крылья должны наклоняться (или выходить) из экрана, чтобы показать, что он поворачивается.

Есть ли способ поместить изображение в java3d, повернуть его, а затем вернуть обратно в буферизованное изображение? Или, может быть, каким-то образом знает, как должны изменяться пиксели, когда они выходят на экран или удаляются от него, и я могу просто поиграться с растрами, чтобы добиться этого. Я знаю, как получить результирующие x-позиции каждого пикселя после поворота вокруг оси y, но, разумеется, просто имея это знание, изображение выглядит как сжатое, поскольку пиксели перекрываются после поворота.

Ответы [ 5 ]

0 голосов
/ 23 июня 2010

Я полагаю, что вы можете добиться вращения YZ с помощью сдвиговых преобразований, что-то похожее, используется для рисования объектов в изометрической перспективе в приложениях дизайна, таких как Adobe Illustrator.

Возможно, этот документ поможет вам, PDF-файл, кажется, не в сети, но в кеше Google есть копия.

трехмерное вращение объема с использованием сдвиговых преобразований

Покажем, что произвольное трехмерное вращение можно разложить на четыре 2D-сдвига пучка.

0 голосов
/ 08 июня 2010

Что ж, если вам нужно повернуть изображение, то вам нужно преобразование, как сказал Том. Если вы работаете с векторной графикой, это просто небольшая математика. В этом примере самолет представляет собой просто треугольник с дополнительной линией, указывающей его направление:

public void rotateRight() {
    heading = (heading + vectorIncrement);
}

public void rotateLeft() {
    heading = (heading - vectorIncrement);
}

public synchronized void render(Graphics2D g) {
    g.setColor(COLOR_SHIP);            

    // Main line ship
    g.drawLine((int)xPos, (int)yPos, (int)(xPos+Math.cos(heading) * width), (int)(yPos+Math.sin(heading) * height) );
    g.drawLine((int)xPos, (int)yPos, (int)(xPos-Math.cos(heading) * width/2), (int)(yPos-Math.sin(heading) * height/2) );        

    // Wings
    p = new Polygon();
    p.reset();
    p.addPoint((int)(xPos+Math.cos(heading) * width), (int)(yPos+Math.sin(heading) * height) );
    p.addPoint((int)(xPos+Math.cos((heading+90)%360) * width), (int)(yPos+Math.sin((heading+90)%360) * height) );
    p.addPoint((int)(xPos+Math.cos((heading-90)%360) * width), (int)(yPos+Math.sin((heading-90)%360) * height) );
    g.drawPolygon(p);
}

Этот вид интерполяции также может применяться к изображениям для получения желаемого поворота.

0 голосов
/ 14 мая 2010

Я полагаю, что вы могли бы сделать что-то подобное, используя перспективную деформацию или трансформацию. JAI (Java Advanced Imaging) обладает этой возможностью.

http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/Geom-image-manip.doc.html#58571

0 голосов
/ 27 мая 2010

Возможно, немного не по теме, но почему бы не заглянуть в Game Engine для Java? Возможно, они уже решили это (и другие проблемы, с которыми столкнутся в будущем, например, двойная буферизация, звук, ввод). Вы можете обнаружить, что уже есть хорошо протестированный API для того, что вы хотите.

http://en.wikipedia.org/wiki/List_of_game_engines

0 голосов
/ 11 мая 2010

Если у вас есть формат BufferedImage, вы можете использовать AffineTransform для его поворота. См. Проблемы с вращением BufferedImage для примера.

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