基于Java3D的工字钢三维显示

package chen;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GraphicsConfiguration;
import java.awt.Toolkit;
import com.sun.j3d.utils.universe.*;

import javax.media.j3d.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.vecmath.*;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.mouse.*;

public class Gzg extends Applet{
 /**
  *
  */
 private static final long serialVersionUID = 1L;
 private JFrame jFrame = null;
 private JPanel jPanel=null;
 private JButton jButton = null;
 public BranchGroup createBranchGroupSceneGraph(float ha,float ba,float t1a,float t2a,float ra){  
  BranchGroup BranchGroupRoot = new BranchGroup();
  
  BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
  
  Color3f bgColor = new Color3f(0.76f,0.82f,0.88f);
  Background bg = new Background(bgColor);
  bg.setApplicationBounds(bounds);
  BranchGroupRoot.addChild(bg);
  
  Color3f directionalColor = new Color3f(1.0f, 1.0f, 1.0f);
  Vector3f vec = new Vector3f(-1.0f, -1.0f, -1.0f);
  DirectionalLight directionalLight = new DirectionalLight(directionalColor, vec);
  directionalLight.setInfluencingBounds(bounds);
  BranchGroupRoot.addChild(directionalLight);
  
  TransformGroup transformgroup = new TransformGroup();  
  
  transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  BranchGroupRoot.addChild(transformgroup);
  
  MouseRotate mouserotate = new MouseRotate();
  mouserotate.setTransformGroup(transformgroup);
  mouserotate.setSchedulingBounds(bounds);
  BranchGroupRoot.addChild(mouserotate);
  
  MouseZoom mousezoom = new MouseZoom();
  mousezoom.setTransformGroup(transformgroup);
  mousezoom.setSchedulingBounds(bounds);
  BranchGroupRoot.addChild(mousezoom);
  
  MouseTranslate mousetranslate = new MouseTranslate();
  mousetranslate.setTransformGroup(transformgroup);
  mousetranslate.setSchedulingBounds(bounds);
  BranchGroupRoot.addChild(mousetranslate);
  
  //System.out.println("二:"+h+b+d);
  //Shape3D shapelinepoints=new ShapeLinesPoints();
  
  Shape3D gzg=new ShapeQuadArray( ha, ba, t1a, t2a, ra);  
  transformgroup.addChild(gzg);
  
  transformgroup.addChild(shapelines());//坐标轴的生成 
  
  BranchGroupRoot.compile();
  return BranchGroupRoot;
 }
 private Shape3D shapelines() {
  // TODO Auto-generated method stub
  Shape3D shapelines0=new Shape3D();
  float vertexes[]=
  {
    //X
    -0.9f, 0.0f,0.0f, 0.9f,0.0f,0.0f,
     0.88f, 0.02f,0.0f, 0.9f,0.0f,0.0f,
     0.88f,-0.02f,0.0f, 0.9f,0.0f,0.0f,
    //Y
      0.0f,-0.8f,0.0f, 0.0f,0.8f,0.0f,
     -0.02f,0.78f,0.0f, 0.0f,0.8f,0.0f,
      0.02f,0.78f,0.0f, 0.0f,0.8f,0.0f,
    //Z
     0.0f,0.0f,-1.0f, 0.0f,0.0f,1.0f,
     0.0f,0.02f,0.98f, 0.0f,0.0f,1.0f,
     0.0f,-0.02f,0.98f, 0.0f,0.0f,1.0f
  };
  float colors[]=
  {
    1.0f,0.0f,0.0f, 1.0f,0.0f,0.0f,
    1.0f,0.0f,0.0f, 1.0f,0.0f,0.0f,
    1.0f,0.0f,0.0f, 1.0f,0.0f,0.0f,
    
    0.0f,1.0f,0.0f, 0.0f,1.0f,0.0f,
    0.0f,1.0f,0.0f, 0.0f,1.0f,0.0f,
    0.0f,1.0f,0.0f, 0.0f,1.0f,0.0f,
    
    0.0f,0.0f,1.0f, 0.0f,0.0f,1.0f,
    0.0f,0.0f,1.0f, 0.0f,0.0f,1.0f,
    0.0f,0.0f,1.0f, 0.0f,0.0f,1.0f
  };
  LineArray lines=new LineArray(18,LineArray.COORDINATES|LineArray.COLOR_3);
  lines.setCoordinates(0, vertexes);
  lines.setColors(0, colors);
  
  LineAttributes lineattributes=new LineAttributes();
  lineattributes.setLineWidth(0.5f);
  lineattributes.setLineAntialiasingEnable(true);
  lineattributes.setLinePattern(0);  
  Appearance app=new Appearance();
  app.setLineAttributes(lineattributes);
  shapelines0.setGeometry(lines);
  shapelines0.setAppearance(app);
  
  return shapelines0;
 }
 
 public Gzg(){
  setLayout(new BorderLayout());
  GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
  Canvas3D c=new Canvas3D(config);
  add("Center",c);
  BranchGroup BranchGroupScene=createBranchGroupSceneGraph(100f,68f,4.5f,4.5f,4.5f);
  SimpleUniverse u=new SimpleUniverse(c);
  u.getViewingPlatform().setNominalViewingTransform();
  u.addBranchGraph(BranchGroupScene);
 }
 
 public Gzg(float ha,float ba,float t1a,float t2a,float ra){
  //System.out.println("一:"+h+b+d);//check
  jFrame = new JFrame();
  jFrame.setTitle("工字钢三维显示");
  jFrame.getContentPane().setLayout(new BorderLayout());  
  jPanel = new JPanel(new BorderLayout());
  jPanel.setBackground(new Color(255, 255, 255));
  jButton=new JButton("OK");
  jFrame.getContentPane().add("Center",jPanel);
  jFrame.getContentPane().add("West",jButton);
  jFrame.setSize(500,500);
  //窗口居中
  double width = Toolkit.getDefaultToolkit().getScreenSize().getWidth(); // 得到窗体的宽
  double height = Toolkit.getDefaultToolkit().getScreenSize().getHeight();// 得到窗体的高
  jFrame.setLocation((int) (width - jFrame.getWidth()) / 2, (int) (height - jFrame
    .getHeight()) / 2);
  
  jFrame.setVisible(true);
  //setLayout(new BorderLayout());
  GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration();
  Canvas3D c=new Canvas3D(config);
  jFrame.getContentPane().add("Center",c);
  BranchGroup BranchGroupScene=createBranchGroupSceneGraph( ha, ba, t1a, t2a, ra);
  SimpleUniverse u=new SimpleUniverse(c);
  u.getViewingPlatform().setNominalViewingTransform();
  u.addBranchGraph(BranchGroupScene);
 }
 public static void main(String[] args){
  //new Gzg(100f,68f,4.5f,4.5f);
  new MainFrame(new Gzg(),500,500);
 }
}

class ShapeQuadArray extends Shape3D{
 public ShapeQuadArray(float ha,float ba,float t1a,float t2a,float ra){
  super();
  float h = ha / 150.0f;
  float b = ba / 150.0f;
  float t1 = t1a / 150.0f;
  float t2 = t2a / 150.0f;
  float r = ra / 150.0f;
  float halflen = 0.8f;
  double theta = Math.PI / 8.0;
  
  float halfh = h / 2.0f;
  float halfb = b / 2.0f;
  
  float vertexes[]={
    //-----------------------------正面-----------------------------
    //顶部的右边    
    halfb, halfh, halflen,
    t1 / 2 + r, halfh, halflen,
    t1 / 2 + r, halfh - t2, halflen,
    halfb, halfh - t2, halflen,
    
    t1 / 2 + r, halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), halflen,
    t1 / 2 + r, halfh - t2, halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh, halflen,
    t1 / 2, halfh, halflen,
    t1 / 2, halfh - t2 - r, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), halflen,
    
    //顶部左边:
    - halfb, halfh, halflen,
    - halfb, halfh - t2, halflen,
    - t1 / 2 - r, halfh - t2, halflen,
    - t1 / 2 - r, halfh, halflen,
    
    - t1 / 2 - r, halfh, halflen,
    - t1 / 2 - r, halfh - t2, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh, halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh, halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh, halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), halflen,
    - t1 / 2, halfh - t2 - r, halflen,
    - t1 / 2, halfh, halflen,
    
    //底部左边:
    - halfb, - halfh, halflen,
    - t1 / 2 - r, - halfh, halflen,
    - t1 / 2 - r, - halfh + t2, halflen,
    - halfb, - halfh + t2, halflen,
    
    - t1 / 2 - r, - halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), halflen,
    - t1 / 2 - r, - halfh + t2, halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh, halflen,
    - t1 / 2, - halfh, halflen,
    - t1 / 2, - halfh + t2 + r, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), halflen,
    
    //底部右边:
    halfb, - halfh, halflen,
    halfb, - halfh + t2, halflen,
    t1 / 2 + r, - halfh + t2, halflen,
    t1 / 2 + r, - halfh, halflen,
    
    t1 / 2 + r, - halfh, halflen,
    t1 / 2 + r, - halfh + t2, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh, halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh, halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh, halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), halflen,
    t1 / 2, - halfh + t2 + r, halflen,
    t1 / 2, - halfh, halflen,
    
    //中间:
    t1 / 2, halfh, halflen,
    - t1 / 2, halfh, halflen,
    - t1 / 2, - halfh, halflen,
    t1 / 2, - halfh, halflen,
    
    //-----------------------------反面-----------------------------
    //顶部右边:
    halfb, halfh, - halflen,
    halfb, halfh - t2, - halflen,
    t1 / 2 + r, halfh - t2, - halflen,
    t1 / 2 + r, halfh, - halflen,
    
    t1 / 2 + r, halfh, - halflen,
    t1 / 2 + r, halfh - t2, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh, - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh, - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh, - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), - halflen,
    t1 / 2, halfh - t2 - r, - halflen,
    t1 / 2, halfh, - halflen,
    
    //顶部左边:
    - halfb, halfh, - halflen,
    - t1 / 2 - r, halfh, - halflen,
    - t1 / 2 - r, halfh - t2, - halflen,
    - halfb, halfh - t2, - halflen,
    
    - t1 / 2 - r, halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), - halflen,
    - t1 / 2 - r, halfh - t2, - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh, - halflen,
    - t1 / 2, halfh, - halflen,
    - t1 / 2, halfh - t2 - r, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), - halflen,
    
    //底部左边:
    - halfb, - halfh, - halflen,
    - halfb, - halfh + t2, - halflen,
    - t1 / 2 - r, - halfh + t2, - halflen,
    - t1 / 2 - r, - halfh, - halflen,
    
    - t1 / 2 - r, - halfh, - halflen,
    - t1 / 2 - r, - halfh + t2, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh, - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh, - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh, - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), - halflen,
    - t1 / 2, - halfh + t2 + r, - halflen,
    - t1 / 2, - halfh, - halflen,
    
    //底部右边:
    halfb, - halfh, - halflen,
    t1 / 2 + r, - halfh, - halflen,
    t1 / 2 + r, - halfh + t2, - halflen,
    halfb, - halfh + t2, - halflen,
    
    t1 / 2 + r, - halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), - halflen,
    t1 / 2 + r, - halfh + t2, - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh, - halflen,
    t1 / 2, - halfh, - halflen,
    t1 / 2, - halfh + t2 + r, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), - halflen,
    
    //center:
    t1 / 2, halfh, - halflen,
    t1 / 2, - halfh, - halflen,
    - t1 / 2, - halfh, - halflen,
    - t1 / 2, halfh, - halflen,
    
    
    
    //-----------------------------侧面-----------------------------
    
    //顶部右边:
    halfb, halfh, halflen,
    halfb, halfh - t2, halflen,
    halfb, halfh - t2, - halflen,
    halfb, halfh, - halflen,
    
    halfb, halfh - t2, halflen,
    t1 / 2 + r, halfh - t2, halflen,
    t1 / 2 + r, halfh - t2, - halflen,
    halfb, halfh - t2, - halflen,
    
    t1 / 2 + r, halfh - t2, halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), - halflen,
    t1 / 2 + r, halfh - t2, - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), - halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), halflen,
    t1 / 2, halfh - t2 - r, halflen,
    t1 / 2, halfh - t2 - r, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), - halflen,
    
    //顶部左边:
    - halfb, halfh, halflen,
    - halfb, halfh, - halflen,
    - halfb, halfh - t2, - halflen,
    - halfb, halfh - t2, halflen,
    
    - halfb, halfh - t2, halflen,
    - halfb, halfh - t2, - halflen,
    - t1 / 2 - r, halfh - t2, - halflen,
    - t1 / 2 - r, halfh - t2, halflen,
    
    - t1 / 2 - r, halfh - t2, halflen,
    - t1 / 2 - r, halfh - t2, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), halfh - t2 - r * (1 - (float) Math.cos(theta)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), halfh - t2 - r * (1 - (float) Math.cos(theta * 2)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), halfh - t2 - r * (1 - (float) Math.cos(theta * 3)), - halflen,
    - t1 / 2, halfh - t2 - r, - halflen,
    - t1 / 2, halfh - t2 - r, halflen,
    
    //底部左边:
    - halfb, - halfh, halflen,
    - halfb, - halfh + t2, halflen,
    - halfb, - halfh + t2, - halflen,
    - halfb, - halfh, - halflen,
    
    - halfb, - halfh + t2, halflen,
    - t1 / 2 - r, - halfh + t2, halflen,
    - t1 / 2 - r, - halfh + t2, - halflen,
    - halfb, - halfh + t2, - halflen,
    
    - t1 / 2 - r, - halfh + t2, halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), - halflen,
    - t1 / 2 - r, - halfh + t2, - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), - halflen,
    
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), halflen,
    - t1 / 2, - halfh + t2 + r, halflen,
    - t1 / 2, - halfh + t2 + r, - halflen,
    - t1 / 2 - r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), - halflen,
    
    //底部右边:
    halfb, - halfh, halflen,
    halfb, - halfh, - halflen,
    halfb, - halfh + t2, - halflen,
    halfb, - halfh + t2, halflen,
    
    halfb, - halfh + t2, halflen,
    halfb, - halfh + t2, - halflen,
    t1 / 2 + r, - halfh + t2, - halflen,
    t1 / 2 + r, - halfh + t2, halflen,
    
    t1 / 2 + r, - halfh + t2, halflen,
    t1 / 2 + r, - halfh + t2, - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta)), - halfh + t2 + r * (1 - (float) Math.cos(theta)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 2)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 2)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), - halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), halflen,
    
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), halflen,
    t1 / 2 + r * (1 - (float) Math.sin(theta * 3)), - halfh + t2 + r * (1 - (float) Math.cos(theta * 3)), - halflen,
    t1 / 2, - halfh + t2 + r, - halflen,
    t1 / 2, - halfh + t2 + r, halflen,
        
    //顶部四边形:
    halfb, halfh, halflen,
    halfb, halfh, - halflen,
    - halfb, halfh, - halflen,
    - halfb, halfh, halflen,
    
    //底部四边形:
    halfb, - halfh, halflen,
    - halfb, - halfh, halflen,
    - halfb, - halfh, - halflen,
    halfb, - halfh, - halflen,
    
    //左边四边形:
    - t1 / 2, halfh - t2 - r, halflen,
    - t1 / 2, halfh - t2 - r, - halflen,
    - t1 / 2, - halfh + t2 + r, - halflen,
    - t1 / 2, - halfh + t2 + r, halflen,
    
    //右边四边形:
    t1 / 2, halfh - t2 - r, halflen,
    t1 / 2, - halfh + t2 + r, halflen,
    t1 / 2, - halfh + t2 + r, - halflen,
    t1 / 2, halfh - t2 - r, - halflen,
  };
  
  //0.8f,0.8f,0.9f
  float colors[]={
    //----------------------------------------正面
    //顶右
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    //顶左
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    //底左
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,    
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    //底右
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,    
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    //中间
    0.6f,0.6f,0.6f, 0.6f,0.6f,0.6f, 0.6f,0.6f,0.6f, 0.6f,0.6f,0.6f,
    //0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f,
    
    //----------------------------------------反面
    //顶右
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    //顶左
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    //底左
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,    
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    //底右
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,    
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    //中间
    0.6f,0.6f,0.6f, 0.6f,0.6f,0.6f, 0.6f,0.6f,0.6f, 0.6f,0.6f,0.6f,
    
    //----------------------------------------侧面
    //顶右
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    //顶左
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    //底左
    0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.42f,0.40f,0.45f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    //底右
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f,
    
    0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f, 0.42f,0.40f,0.45f,
    
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    
    0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f, 0.7f,0.7f,0.7f,
    
  };
  int num = vertexes.length;
  num /= 12;
  QuadArray quadarray=
   new QuadArray(num * 4,QuadArray.COORDINATES|
     QuadArray.NORMALS|QuadArray.COLOR_3|QuadArray.TEXTURE_COORDINATE_2);
  quadarray.setCoordinates(0, vertexes);
  quadarray.setColors(0, colors);
  
  //设置法向量
  Vector3d v = new Vector3d();
  Vector3f n = null;
  for(int i = 0; i < num; i ++){
   v.cross(new Vector3d(vertexes[i * 12 + 3] - vertexes[i * 12], vertexes[i * 12 + 4] - vertexes[i * 12 + 1], vertexes[i * 12 + 5] - vertexes[i * 12 + 2]),
     new Vector3d(vertexes[i * 12 + 6] - vertexes[i * 12], vertexes[i * 12 + 7] - vertexes[i * 12 + 1], vertexes[i * 12 + 8] - vertexes[i * 12 + 2]));
   v.normalize();
   n = new Vector3f(v);
   quadarray.setNormal(i * 4, n);
   quadarray.setNormal(i * 4 + 1, n);
   quadarray.setNormal(i * 4 + 2, n);
   quadarray.setNormal(i * 4 + 3, n);
  }
  this.setGeometry(quadarray);
  
  Appearance app=new Appearance();
  
  PolygonAttributes polygonattributes = new PolygonAttributes();  
  polygonattributes.setCullFace(PolygonAttributes.CULL_NONE);
  //polygonattributes.setCullFace(PolygonAttributes.CULL_BACK);  
  //polygonattributes.setCullFace(PolygonAttributes.CULL_FRONT);
  //polygonattributes.setPolygonMode(PolygonAttributes.POLYGON_FILL);  
  app.setPolygonAttributes(polygonattributes);
  
  Material material = new Material();
  material.setAmbientColor(0.5f, 0.5f, 0.6f);//0.5f, 0.5f, 0.6f
  material.setDiffuseColor(new Color3f(1.0f,1.0f,1.0f));//0.42f,0.40f,0.45f
  material.setSpecularColor(0.2f, 0.2f, 0.2f);
  material.setShininess(100.0f);
  material.setCapability(Material.ALLOW_COMPONENT_WRITE);
  app.setMaterial(material);  
  
  this.setAppearance(app);
 }
}

 

你可能感兴趣的:(java,vector,import,float,applet,colors)