JAVA 3D

0

witam

potrzebuje pomocy w temacie oswietlania sceny w java 3d.
po prostu obiekty znajdujace sie dalej od obserwatora niz pewna wartosc zanikaja
o co to chodzi? jak temu zaradzic? z gory dzieki

marcin

0

Proszę o kod. Bez tego ani rusz :)

0
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

import java.awt.GraphicsConfiguration;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.util.*;
import java.util.Locale;

import com.sun.j3d.utils.behaviors.mouse.MouseBehavior;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Text2D;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;


import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import javax.swing.JOptionPane;

import javax.vecmath.*;

import java.awt.Graphics;
 
  



public class ModelViewer extends JFrame 
{
    int x,y;
    QuadArray quadArray;
    Group grupa;
    private OffScreenCanvas3D offScreenCanvas3D;
    private KeyBehavior keybehavior = null;
    private Blok[] blok;
    public Shape3D[] shape=new Shape3D[10000];
    SimpleUniverse u=null;
    TransformGroup objRotate=null;
    Transform3D transform3D=null; 
    int j=0;
    Canvas3D myCanvas3D ;
    PickBehavior pick=null;
    BranchGroup scene = null;
    private AmbientLight ambientLight=new AmbientLight();
   
    private DirectionalLight lightA=new DirectionalLight();
    private DirectionalLight lightB=new DirectionalLight();
    private DirectionalLight lightC=new DirectionalLight();
    public JLabel l_metryki=new JLabel("Aktywne metryki:");
    public JTextArea tekst =new JTextArea(4,15);
    public JPanel panel = new JPanel();
    double promien_maks=0;
   
    JLabel etykieta=new JLabel();
    JFrame ramka =new JFrame();
          
   
    
    //*************************************************************************
    public class CheckBoxy extends JPanel {
    	JCheckBox chb_DIT;
    	JCheckBox chb_CBO;
    	JCheckBox chb_LCOM;
    	JCheckBox chb_CC;
    	JCheckBox chb_WMC;
    	
    	public CheckBoxy() {
//    	 Utworzenie check boxes
    	chb_DIT = new JCheckBox("DIT");
    	chb_DIT.setSelected(true);
    	chb_CBO = new JCheckBox("CBO");
       	chb_CBO.setSelected(true);
    	chb_LCOM = new JCheckBox("LCOM");
    	chb_LCOM.setSelected(true);
    	chb_CC = new JCheckBox("CC");
    	chb_CC.setSelected(true);
    	chb_WMC = new JCheckBox("WMC");
    	chb_WMC.setSelected(true);
//    	 Rejestracja słuchacza
    	CheckBoxListener myListener = new CheckBoxListener();
    	chb_CBO.addItemListener(myListener);
    	chb_DIT.addItemListener(myListener);
    	chb_CC.addItemListener(myListener);
    	chb_LCOM.addItemListener(myListener);
    	chb_WMC.addItemListener(myListener);
   	
    	JPanel checkPanel = new JPanel();
    	checkPanel.setLayout(new GridLayout(0, 1));
    	checkPanel.add(chb_CBO);
    	checkPanel.add(chb_CC);
    	checkPanel.add(chb_DIT);
    	checkPanel.add(chb_LCOM);
    	checkPanel.add(chb_WMC);
    	setLayout(new BorderLayout());
    	add(checkPanel, BorderLayout.WEST);
    	setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
    	}
    	
    	
    	/** Implementacja słuchacza. */
    	class CheckBoxListener implements ItemListener {
    	public void itemStateChanged(ItemEvent e) {
    	int index = 0; char c = '-';
    	Object source = e.getItemSelectable();
    	if (source == chb_DIT) {
    	index = 0; c = 'c'; 
    	tekst.setText("c");
    	} else if (source == chb_CBO) {
    	index = 1; c = 'g';
    	tekst.setText("g");
    	} else if (source == chb_CC) {
    	index = 2; c = 'h';
    	tekst.setText("h");
    	} else if (source == chb_LCOM) {
    	index = 3; c = 't';
    	tekst.setText("t");
    	} else if (source == chb_WMC) {
        	index = 3; c = 't';
        	tekst.setText("t");
        	}
    	if ((e.getStateChange() == ItemEvent.DESELECTED) && source==chb_DIT)
    	{
    	//dit
    	} else if((e.getStateChange() == ItemEvent.DESELECTED) && source==chb_CBO){
    	//	wylaczenie CBO
    	}else if((e.getStateChange() == ItemEvent.DESELECTED) && source==chb_LCOM){
    		//wylaczenie LCOM
    	}else if((e.getStateChange() == ItemEvent.DESELECTED) && source==chb_WMC){
    		//wylaczenie WMC
    	}else if((e.getStateChange() == ItemEvent.DESELECTED) && source==chb_CC){
    		//wylaczenie CC
    		
    	}
    	}
    	
    	}
    	}
    
    	
    	 	
    	
    
    
    
    
    //*************************************************************************
    
   
    
    
 
	protected BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,
		      0.0), 10000.0);
	 
       GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
     
    public static void main(String[] args)
    {
    	new ModelViewer().setVisible(true);
    }

 


       
    private Canvas3D createCanvas3D(GraphicsConfiguration config) {
    
    	getContentPane().setLayout(new BorderLayout());
    
        Canvas3D canvas3D = new Canvas3D(config);
       
        setTitle("SCENA ");
        setSize(1000, 800);
        setLayout(new BorderLayout());
        
       
       
    
        panel.add(l_metryki);
        panel.add(new CheckBoxy());
        panel.add(etykieta);
        etykieta.setText("Właściwości bloczka:");
        panel.add(tekst);
        tekst.setText("");
        tekst.setEditable(false);
        tekst.setLineWrap(true);
        tekst.setWrapStyleWord(true);
        tekst.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
        JScrollPane scrollingResult = new JScrollPane(tekst);
        panel.add(scrollingResult);
        
        
        
        
        
   

      

        JOptionPane.showMessageDialog(null,"Sterowanie :\nstrzalki: gora,dol,lewa,prawa\nlub       A S D W\nzmiana trybu: alt,ctrl\nzmiana predkosci : shift\n R - RESET \n T- zapis do JPG");
        add(BorderLayout.CENTER, canvas3D);
     
        add(BorderLayout.SOUTH,panel);
       
        getContentPane().add(canvas3D);
               	
        return canvas3D;
      }

  
    
    
    public ModelViewer()
    {
    	
    	
		Canvas3D myCanvas3D = createCanvas3D(config);
		System.out.println("raz\n");
		rysuj_scene(myCanvas3D);
		
	
		
			
    }

 public void rysuj_scene(Canvas3D myCanvas3D)
 {
	 scene = createSceneGraph(myCanvas3D,tekst);
		SimpleUniverse u = new SimpleUniverse(myCanvas3D);
		u.getViewingPlatform().setNominalViewingTransform();
		scene.compile();
		u.addBranchGraph(scene);
		offScreenCanvas3D = new OffScreenCanvas3D(config, true);
		Screen3D sOn =myCanvas3D.getScreen3D();
		Screen3D sOff = offScreenCanvas3D.getScreen3D();
		Dimension dim = sOn.getSize();
		
		
		sOff.setSize(dim);
		sOff.setPhysicalScreenWidth(sOn.getPhysicalScreenWidth()) ;
		sOff.setPhysicalScreenHeight(sOn.getPhysicalScreenHeight());


		u.getViewer().getView().addCanvas3D(offScreenCanvas3D);

     
		ViewingPlatform viewpoint = u.getViewingPlatform();
		viewpoint.setNominalViewingTransform();

	  
		PlatformGeometry pg = new PlatformGeometry();
		viewpoint.setPlatformGeometry( pg );

		keybehavior = new KeyBehavior(this,myCanvas3D,offScreenCanvas3D,promien_maks);
		keybehavior.setViewingPlatform( viewpoint );
		keybehavior.setSchedulingBounds(bounds);
		
		
		viewpoint.setViewPlatformBehavior(keybehavior);
		keybehavior.doStart(-25);
		
}
    



    public BranchGroup createSceneGraph(Canvas3D canvas,  JTextArea text)
    {
		
		BranchGroup objRoot = new BranchGroup();
		addLights(objRoot);
		objRoot.setCapability( BranchGroup.ALLOW_DETACH );		

		Transform3D leftGroupXfm = new Transform3D();
		
		

		
		TransformGroup objRotate = new TransformGroup(leftGroupXfm);
	    objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
	    objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
	    objRoot.addChild(objRotate);
	    
	    
		
    	Rozmieszczenie algorytmRozmieszczenia = new Rozmieszczenie ("c:\\konfiguracja.txt");
    	algorytmRozmieszczenia.rozmiescObiekty();
    	
    	    
    	for (int i = 0; i < algorytmRozmieszczenia.iloscZajetychBlokow; i++) {
    		algorytmRozmieszczenia.tablicaBlokow[i].dodajDoTransformGroup(objRotate);
    		algorytmRozmieszczenia.tablicaBlokow[i].inicjalizujQuadArray();
    		shape[i]=new Shape3D(algorytmRozmieszczenia.tablicaBlokow[i].dom.quadArray);
    		objRoot.addChild(shape[i]);
    		
    		
    	}
    	
    	
    	
   	for(int j = 0; j < algorytmRozmieszczenia.iloscZajetychObszarow; j++)
    	{
    		
    		linie(objRoot,algorytmRozmieszczenia.tablicaObszarow[j][0],algorytmRozmieszczenia.tablicaObszarow[j][1]);
    		linie(objRoot,algorytmRozmieszczenia.tablicaObszarow[j][2],algorytmRozmieszczenia.tablicaObszarow[j][3]);
    		System.out.println("poczatkowy: "+algorytmRozmieszczenia.tablicaKatowPoczatkowych[j]+" koncowy: "+algorytmRozmieszczenia.tablicaKatowKoncowych[j]+"");
    		
    		
    		luczek(objRoot,algorytmRozmieszczenia.tablicaKatowPoczatkowych[j],
algorytmRozmieszczenia.tablicaKatowKoncowych[j],algorytmRozmieszczenia.tablicaPromieniPoczatkowych[j]);
    		luczek(objRoot,algorytmRozmieszczenia.tablicaKatowPoczatkowych[j],
algorytmRozmieszczenia.tablicaKatowKoncowych[j],algorytmRozmieszczenia.tablicaPromieniKoncowych[j]);
    	
    		
    	}
    
    	
    	luczek(objRoot,0.0,0.0,3.0);	
    	
    	
    	
    	
    	for (int i = 0; i < algorytmRozmieszczenia.tablicaPromieniKoncowych.length; i++) {
    					if(algorytmRozmieszczenia.tablicaPromieniKoncowych[i]>promien_maks)
    					{
    						promien_maks=algorytmRozmieszczenia.tablicaPromieniKoncowych[i];
    					}
		}
    	
    	 
        panel.add(new JLabel("Mapowanie: "));
        JTextArea pole_map = new JTextArea(4,10);
        pole_map.setText("DIT: "+algorytmRozmieszczenia.tablicaBlokow[0].zwrocMapowanieDIT()+"\nCBO: "+algorytmRozmieszczenia.tablicaBlokow[0].zwrocMapowanieCBO()+"\nLCOM: "+algorytmRozmieszczenia.tablicaBlokow[0].zwrocMapowanieLCOM()+"\nCC: "+algorytmRozmieszczenia.tablicaBlokow[0].zwrocMapowanieCC()+"\n WMC: "+algorytmRozmieszczenia.tablicaBlokow[0].zwrocMapowanieWMC()+"");
        JScrollPane scrollingResult = new JScrollPane(pole_map);
        pole_map.setEditable(false);
        panel.add(pole_map);
	    objRoot.addChild(new PickBehavior(objRoot, canvas,bounds,shape,tekst,
algorytmRozmieszczenia.tablicaBlokow));//dodac blok[]

	    
	    
	    
		objRoot.compile();
		return objRoot;
    }

  
    
    protected void linie(BranchGroup b, Point3f x1, Point3f x2)
    {
//    	 Plain line
        Point3f[] plaPts = new Point3f[2];
        plaPts[0] = new Point3f(x1);
        plaPts[1] = new Point3f(x2);       
        
        LineArray pla = new LineArray(2, LineArray.COORDINATES);
        pla.setCoordinates(0, plaPts);
       
        Shape3D plShape = new Shape3D(pla);
        b.addChild(plShape);

    	
    }

    protected void luczek(BranchGroup b, double kat1, double kat2, double R)
    {
    	Point3f zero = new Point3f();
    	Point3f tmp1 = new Point3f();
    	Point3f tmp2 = new Point3f();
    	
    	if(kat2==0)
    	{
    		kat2=6.28;    		
    	}
    	
    	zero.set(0.0f,0.0f,0.0f);
    	    	
     	double alpha0=kat1;
    	
     //	System.out.println("alpha 1: "+alpha_1%2+" Alpha2: "+alpha_2%2+"\n");
     	double szer_luku=kat2-kat1;
     	System.out.println("szerokosc luku: "+szer_luku+"");
    	float krok=0.01f;
    	
       	float segments = ((float)szer_luku/krok);
       	
       	int ile=(int)segments;
       	if((ile%2)!=0)
       	{
       		ile++;
       	}
       	System.out.println("ile: "+ile+"");
    	Point3f[] points = new Point3f[ile];
    	Point3f[] reszta = new Point3f[ile-2];
    	double alpha=alpha0;
    	float x,y,z;  
    	for (int i=0; i<ile; i++) {
    	alpha+=krok;
    	System.out.println("alpha: "+alpha+"");
    	x=(float)(R*Math.cos(alpha));
    	y=0.0f;
    	z=(float)(R*Math.sin(alpha));
    	points[i] = new Point3f(x,y,z);
       	}
    	
    	for(int d=0; d<reszta.length;d++)
    	{
    		reszta[d]=points[d+1];    		
    	}
    	   
     	System.out.println("dlugosc tablicy points: "+points.length+"");
    	
    	LineArray arc = new LineArray(points.length, LineArray.COORDINATES);
   
    	arc.setCoordinates(0, points);
    	Shape3D plShape = new Shape3D(arc);
        b.addChild(plShape);
        
        if(reszta.length>0)
        {
        	System.out.println("drugie luki\n");
        	LineArray arc1 = new LineArray(reszta.length, LineArray.COORDINATES);
        	arc1.setCoordinates(0, reszta);
        	Shape3D plShape1 = new Shape3D(arc1);
            b.addChild(plShape1);
        }
        
    }
  
    
    protected double okrag(float x, float promien)
    {
    	double z_k;
    	z_k=Math.pow(promien,2)-Math.pow(x,2);
    	//System.out.println("Z: "+z_k+"");
    	return z_k;
    }



    protected void addLights(BranchGroup b) {
    	// BoundingSphere bound=new BoundingSphere();
 	    
	       //Config the light
	       ambientLight.setInfluencingBounds(bounds);
	       
	       b.addChild(ambientLight);
	       b.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
	       
	       Vector3f directionA = new Vector3f(0.0f, 0.0f, 0.0f);
	       directionA.normalize();
	    /*   lightA.setDirection(directionA);
	       lightA.setBounds(bounds);
	       lightA.setColor(new Color3f(0.0f, 0.0f, 1.0f));
	       lightA.setInfluencingBounds(bounds);
	       b.addChild(lightA);
	    
	       Vector3f directionB = new Vector3f(1.0f, -1.0f, -0.5f);
	       directionB.normalize();
	       lightB.setDirection(directionB);
	       lightB.setBounds(bounds);
	    
	       lightB.setColor(new Color3f(1.0f, 0.0f, 0.0f));
	       lightB.setInfluencingBounds(bounds);
	       b.addChild(lightB);
	       */
	     
      }
    

    
    public class OffScreenCanvas3D extends Canvas3D {

    	public OffScreenCanvas3D(GraphicsConfiguration graphicsConfiguration,
    	boolean offScreen) {

    	super(graphicsConfiguration, offScreen);
    	}

    	public BufferedImage doRender(int width, int height) {

    	BufferedImage bImage =
    	new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    	ImageComponent2D buffer =
    	new ImageComponent2D(ImageComponent.FORMAT_RGB, bImage);

    	setOffScreenBuffer(buffer);
    	renderOffScreenBuffer();
    	waitForOffScreenRendering();
    	bImage = getOffScreenBuffer().getImage();

    	return bImage;
    	} 

    }

}
0

wiem ze duzo tego ale wolalem zeby wszystko bylo jasne
jest to okragla scena na ktorej rozlozone sa bloczki (prostopadlosciany)
(takie okragle miasto) i po prostu na pewnej odleglosci od obserwatora obiekty gina...

1 użytkowników online, w tym zalogowanych: 0, gości: 1