我假设你只使用Swing/AWT框架进行图形处理。如果我的假设不正确,请更新你的问题。
如果你正在使用Swing和Graphics2D
类(这是Swing组件使用的类),那么你正在处理一个2D框架。这意味着高级的3D特效没有内置,你需要自己实现变换(或者开始抓取3D类来完成工作)。
所以,你已经在正确的轨道上 - 你必须先设置剪辑(使其适应你的形状),然后执行旋转(使其出现在正确的角度)。
话虽如此,进行基本的旋转变换并不太困难。这里有一个关于(基本)旋转的好概述。点击这里。当然,当你有不仅基于单一轴的旋转时,它会变得更加复杂。但正如文章后面解释的那样,如果你将矩阵(Rx)(Ry)(Rz)相乘,就可以使用得到的矩阵确定像素的位置。
我创建了一个在Y轴上旋转的快速示例。请注意,我想出了一个愚蠢的算法(奇幻消失点技术®),给了一个模糊的深度感。我假设你已经有了一些东西-这可能更正确。
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Rotation3D extends JPanel{
Image img;
BufferedImage rotatedImage;
final int ROTATION_DEGREES = 70;
int vanishX = 0;
int vanishY = 0;
int vanishZ = -1000;
public Rotation3D(){
try {
img = ImageIO.read(new File(System.getProperty("java.home") + "/lib/deploy/splash.gif"));
setPreferredSize(new Dimension(img.getWidth(this) * 2,img.getHeight(this) * 2));
BufferedImage shadedImage = new BufferedImage(img.getWidth(this), img.getWidth(this), BufferedImage.TYPE_INT_ARGB);
shadedImage.getGraphics().drawImage(img, 0, 0, this);
Raster r = shadedImage.getData();
vanishX = shadedImage.getWidth() /2;
vanishY = shadedImage.getHeight() /2;
WritableRaster wr = r.createCompatibleWritableRaster();
for(int i = 0; i < shadedImage.getWidth(); i++){
for(int j = 0; j < shadedImage.getHeight(); j++){
int[] result = r.getPixel(i, j, new int[4]);
Double radians = Math.toRadians(ROTATION_DEGREES);
Double newX, newY, newZ;
newX = i * Math.cos(radians);
newY = j * 1.0;
newZ= i * Math.sin(radians) * -1;
if(newZ < vanishZ){
newX = 0.0;
newY = 0.0;
}else if(newZ < 0){
double magicVanish = newZ / vanishZ;
newX += magicVanish * newX;
newY += magicVanish * newY;
}
if(newX > 0 && newX < shadedImage.getWidth() && newY > 0 && newY < shadedImage.getHeight())
wr.setPixel(newX.intValue(), newY.intValue(), result);
}
}
rotatedImage = new BufferedImage(img.getWidth(this), img.getWidth(this), BufferedImage.TYPE_INT_ARGB);
rotatedImage.setData(wr);
} catch (IOException e) {
e.printStackTrace();
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(rotatedImage, 0, 0, this);
}
public static void main(String[] args){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Rotation3D());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}