要求用Graphics画一个立方体,可以根据x,y,z轴进行旋转。
我这里有资料,但是老做不出来,希望专家能给点建议
package GUI;import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;import javax.swing.JPanel;import utilTool.Math3D;
import utilTool.Point2D;
import utilTool.Point3D;public class Rec3D extends JPanel{
//立方体的端点
Vector<Point3D> p;
Vector<Point2D> p2d;
//矩阵
double[][] martrix = new double[4][4];
//空间向量
double[][] spacemartrix = new double[8][4];
double[][] cspacemartrix = new double[8][4];
Graphics g;


public Rec3D(){
martrix[0] = new double[4];
martrix[1] = new double[4];
martrix[2] = new double[4];
martrix[3] = new double[4];
initPoint3D();
Math3D m3d = new Math3D();
p2d = m3d.compute3Dto2D(p);
this.setFocusable(true);
this.addKeyListener(new ListenKeyBord());
}



public void test(){
martrix[0] = new double[4];
martrix[1] = new double[4];
martrix[2] = new double[4];
martrix[3] = new double[4];
initPoint3D();
Math3D m3d = new Math3D();
p2d = m3d.compute3Dto2D(p);
this.setFocusable(true);
this.addKeyListener(new ListenKeyBord());
// for(int i=0;i<p2d.size();i++){
// Point2D temp = p2d.get(i);//?
// System.out.println("after compute x = "+temp.getX()+" y = "+temp.getY());
// }
}

public Vector<Point3D> initPoint3D(){
p = new Vector();
p.add(new Point3D(300,600,300));
p.add(new Point3D(400,600,300));
p.add(new Point3D(400,600,400));
p.add(new Point3D(300,600,400));
p.add(new Point3D(300,700,300));
p.add(new Point3D(400,700,300));
p.add(new Point3D(400,700,400));
p.add(new Point3D(300,700,400));
return p;
}

//空间坐标点转向量
public void point3DtoMartrix(Vector<Point3D> p3){
for(int i=0;i<p3.size();i++){
spacemartrix[i][0] = p3.get(i).x;
spacemartrix[i][1] = p3.get(i).y;
spacemartrix[i][2] = p3.get(i).z;
spacemartrix[i][3] = 1;
}

}


//向量转空间坐标
public void martrixtoPoint3D(double[][] a){
Point3D p3dTemp = new Point3D();
for (int i = 0; i < a.length; i++) {
p3dTemp.x = a[i][0];
p3dTemp.y = a[i][1];
p3dTemp.z = a[i][2];
p.set(i,p3dTemp);
}
}




public void paint(Graphics g){
drawRec3D(g,p2d);
}

public void drawRec3D(Graphics g,Vector<Point2D> p2D){
//在8个端点上画圆
// System.out.println(p.size()/2);
// for(int i=0;i<p.size();i++){
// Point2D p2Ds = p2D.get(i);
// g.drawOval((int)p2Ds.getX()-5,(int)p2Ds.getY()-5,10,10);
// System.out.println("point"+i+".x = "+p2Ds.getX()+" point"+i+".y = "+p2Ds.getY());
// }

for(int i=0; i<p.size()-1;i++){
Point2D p2Ds = p2D.get(i);
Point2D p2De = p2D.get(i+1);
if(i==p.size()/2-1){
p2Ds = p2D.get(i);
p2De = p2D.get(i-3);
g.drawLine((int)p2Ds.getX(),(int)p2Ds.getY(),(int)p2De.getX(),(int)p2De.getY());
}
else{
g.drawLine((int)p2Ds.getX(),(int)p2Ds.getY(),(int)p2De.getX(),(int)p2De.getY());
}
if(i+1==p.size()-1){
p2Ds = p2D.get(i+1);
p2De = p2D.get(i-2);
g.drawLine((int)p2Ds.getX(),(int)p2Ds.getY(),(int)p2De.getX(),(int)p2De.getY());
}
}

for(int i=p.size()/2;i<p.size();i++){
Point2D p2Ds = p2D.get(i-p.size()/2);
Point2D p2De = p2D.get(i);
g.drawLine((int)p2Ds.getX(),(int)p2Ds.getY(),(int)p2De.getX(),(int)p2De.getY());
} }




//初始化矩阵
public void clearmartix(){
  martrix[0][1] = 0;
  martrix[0][2] = 0;
  martrix[0][3] = 0;
  martrix[1][0] = 0;
  martrix[1][1] = 1;
  martrix[1][2] = 0;
  martrix[2][0] = 0;
  martrix[2][1] = 0;
  martrix[2][3] = 0;
  martrix[3][0] = 0;
  martrix[3][1] = 0;
  martrix[3][2] = 0;
  martrix[3][3] = 1;
}

//设置旋转矩阵,用于计算向量
public void setMartrix(String cmd,float degree){
if(cmd == "z"){
clearmartix();
this.martrix[0][0] = Math.cos(degree);
this.martrix[0][1] = -Math.sin(degree);
this.martrix[1][0] = Math.sin(degree);
this.martrix[1][1] = Math.cos(degree);
}
}

//获得修改后的3D坐标
private Vector rework3DPoints(Vector<Point3D> point,double[][] martrix){
Vector<Point3D> p = new Vector();
for(int i=0;i<point.size();i++){
//空间坐标转向量
double[] a = {point.get(i).x,point.get(i).y,point.get(i).z,1};
Point3D ptemp = new Point3D();
                        //计算向量,并重新转回空间坐标
ptemp.x = a[0]*martrix[0][0]+a[1]*martrix[1][0]+a[2]*martrix[2][0]+a[3]*martrix[3][0];
ptemp.y = a[0]*martrix[0][1]+a[1]*martrix[1][1]+a[2]*martrix[2][1]+a[3]*martrix[3][1];
ptemp.z = a[0]*martrix[0][2]+a[1]*martrix[1][2]+a[2]*martrix[2][2]+a[3]*martrix[3][2];
p.add(ptemp);
}
return p;
} //空间坐标转向量
double[][] transPointToMarix(Vector<Point3D> v){
double[][] d = new double[8][4];
for(int i=0;i<v.size();i++){
d[i][0] = v.get(i).x;
d[i][1] = v.get(i).y;
d[i][2] = v.get(i).z;
d[i][3] = 1;
}
return d;
}

private class ListenKeyBord implements KeyListener{ public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

} int num = 0;
float xdu,ydu,zdu;
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==e.VK_LEFT){
System.out.println("<-");
num+=1;
zdu = (float) 30.0*num;

// circumvolveByZ();//初始化矩阵
Vector<Point3D> p3d = initPoint3D();//初始3D坐标点
setMartrix("z",zdu);

  Vector<Point3D> p3dt = rework3DPoints(p3d,martrix);//获得修改后的3D坐标
for(int i=0;i<p3dt.size();i++){
System.out.println("p3dt["+i+"].x="+p3dt.get(i).x+"p3dt["+i+"].y="+p3dt.get(i).y+"p3dt["+i+"].z="+p3dt.get(i).z);
}
Math3D m3d = new Math3D();//
p2d = m3d.compute3Dto2D(p);
g = getGraphics();
drawRec3D(g,p2d);


}else if(e.getKeyCode()==e.VK_RIGHT){
int num = 1;
System.out.println("->");
Vector<Point3D> p3d = initPoint3D();//初始3D坐标点
removeRec();//平移Rec
Vector<Point3D> p3dt = rework3DPoints(p3d,martrix);//获得修改后的3D坐标
for(int i=0;i<p3dt.size();i++){
System.out.println("p3dt["+i+"].x="+p3dt.get(i).x+"p3dt["+i+"].y="+p3dt.get(i).y+"p3dt["+i+"].z="+p3dt.get(i).z);
}
Math3D m3d = new Math3D();//
p2d = m3d.compute3Dto2D(p);
g = getGraphics();
repaint();
drawRec3D(g,p2d);
}
} public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}
}
}这个的算法好像是 x轴旋转矩阵*y轴旋转矩阵*z轴旋转矩阵*平移向量*坐标向量=新的坐标向量我这里没有x,y和平移向量。  只是想按照z轴旋转下。希望有强人能帮我解决一下这个问题,万分感谢了!!!

解决方案 »

  1.   

    只会OpenGL, 没看过Java中的3D, 感觉速度上有些慢, 就不想学了.
      

  2.   

    看看AffineTransform 对象,它好象能解决问题public class AffineTransform extends Objectimplements Cloneable, SerializableAffineTransform 类表示 2D 仿射变换,它执行从 2D 坐标到其他 2D 坐标的线性映射,保留了线的“直线性”和“平行性”。可以使用一系列平移、缩放、翻转、旋转和剪切来构造仿射变换。 这样的坐标变换可以使用一个 3 行乘 3 列的矩阵来表示,最后一行默认为 [ 0 0 1 ]。此矩阵将源坐标 (x, y) 变换为目标坐标 (x', y'),方法是将坐标视为列向量,并用矩阵乘以坐标向量,步骤如下:         [ x']   [  m00  m01  m02  ] [ x ]   [ m00x + m01y + m02 ]
            [ y'] = [  m10  m11  m12  ] [ y ] = [ m10x + m11y + m12 ]
            [ 1 ]   [   0    0    1   ] [ 1 ]   [         1         ]
      

  3.   

    Sun有专门的Java 3D API 
      

  4.   


    这个是专门的需求,不是简单的java3d...
      

  5.   

    你去找找这方面的书吧 Java图形学的   我有两本但是一直没看...