2010-05-10 5 views
2

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

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

+0

Обратите внимание, что для 2D-игр нередко предварительно хранить все повернутые версии вашего спрайта. Обычно это делалось по двум причинам: вращение ** используется **, чтобы быть дорогостоящей операцией, и небольшие 2D спрайты, как правило, не выглядят так здорово, как только они вращаются. Таким образом, обычный способ сделать это «назад в дни» состоял в том, чтобы повернуть программный спрайт, а затем графический художник ретушировать каждое повернутое положение. Обычно это делалось на симметричных спрайтах, поэтому вам просто пришлось вращать, скажем, от 0 до 90 градусов, а затем в других положениях, где X/Y перевернулся, чтобы генерировать все обороты от 0 до 360. – SyntaxT3rr0r

+0

Да, но я не смог повернуть вокруг оси Y в gimp. –

ответ

0

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

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

3D Volume Rotation Using Shear Transformations

Покажем, что произвольное 3D вращение можно разложить на четыре 2D ножницы пучка.

+0

Ах. Я еще не пробовал, но я думаю, что это именно то, что мне нужно. –

0

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

+0

AffineTransform может выполнять только вращения в плоскости x-y. Я не пытаюсь вращаться в плоскости x-y. –

0

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

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

0

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

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); 
} 

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

Смежные вопросы