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
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
Proszę o kod. Bez tego ani rusz :)
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;
}
}
}
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...