jotto

Untitled

Jun 10th, 2014
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.94 KB | None | 0 0
  1. import java.applet.Applet;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import com.sun.j3d.utils.applet.MainFrame;
  5. import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
  6. import com.sun.j3d.utils.geometry.GeometryInfo;
  7. import com.sun.j3d.utils.geometry.Cylinder;
  8. import com.sun.j3d.utils.geometry.Sphere;
  9. import com.sun.j3d.utils.geometry.NormalGenerator;
  10. import com.sun.j3d.utils.universe.*;
  11. import java.util.Enumeration;
  12. import javax.media.j3d.*;
  13. import javax.vecmath.*;
  14. import java.util.Timer;
  15. import java.util.TimerTask;
  16. import javax.swing.JLabel;
  17.  
  18.  
  19. /**
  20. * Klasa główna 'Main' zawiera deklaracje zmiennych
  21. * @author
  22. */
  23. public final class Main extends Applet implements KeyListener{
  24.  
  25. final private static int Width = 900;
  26. final private static int Height = 600;
  27. final private OrbitBehavior obserwator;
  28. final private ViewingPlatform vPlatform;
  29. private RotationInterpolator punkt1; // arm sweep - baza robota
  30. private RotationInterpolator punkt2; // shoulder - ramie robota
  31. private RotationInterpolator punkt3;
  32. final private Timer zegar = new Timer();
  33. final private SimpleUniverse universe;
  34. private double x = 0.0f;
  35. private double y = 0.65f;
  36. private double z = 0.5f;
  37. private boolean spacja = false;
  38. private boolean zatrzask = false;
  39. private boolean inCollision = false;
  40. JLabel label = new JLabel("Ramię Robota:");
  41. private TransformGroup objTrans;
  42. private TransformGroup objTrans2;
  43. private TransformGroup objTrans3;
  44. private TransformGroup objTrans4;
  45. final private Transform3D trans = new Transform3D();
  46. final private Transform3D trans2 = new Transform3D();
  47. final private Transform3D trans3 = new Transform3D();
  48. final private Transform3D trans4 = new Transform3D();
  49. final private Transform3D commonRotation = new Transform3D();
  50.  
  51.  
  52. /**
  53. * W metodzie tworzymy scenę oraz elementy, które będą w niej zawarte - tj.
  54. * elementy manipulatora cylindrycznego (cylinder, cylinder2, chwytak i przedmiot),
  55. * oświetlenie sceny oraz podłoże służące jako punkt odniesienia.
  56. * @return obiekt 'scena' typu BranchGroup
  57. */
  58. public BranchGroup createSceneGraph() {
  59.  
  60. Alpha alpha1 = new Alpha(-1, 5000); // arm sweep
  61.  
  62. BranchGroup scena = new BranchGroup(); // scena główna - swiatla, podloga
  63. BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  64.  
  65. Transform3D tmp = new Transform3D();
  66.  
  67.  
  68. objTrans = new TransformGroup();
  69. objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  70. objTrans2 = new TransformGroup();
  71. objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  72.  
  73. //statyw
  74. scena.addChild(objTrans);
  75. Cylinder cylinder1 = new Cylinder(0.1f, 1.5f);
  76. objTrans = new TransformGroup();
  77. objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  78. Transform3D pos1 = new Transform3D();
  79. pos1.setTranslation(new Vector3f(0.0f, 0.25f, 0.0f));
  80. objTrans.setTransform(pos1);
  81. objTrans.addChild(cylinder1);
  82. //scena.addChild(objTrans);
  83.  
  84. //ramie
  85. scena.addChild(objTrans2);
  86. Cylinder cylinder2 = new Cylinder(0.05f, 1.25f);
  87. objTrans2 = new TransformGroup();
  88. objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  89. objTrans2.addChild(cylinder2);
  90.  
  91. //kulka
  92. scena.addChild(objTrans3);
  93. Sphere chwytak = new Sphere(0.08f);
  94. objTrans3 = new TransformGroup();
  95. objTrans3.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  96. objTrans3.addChild(chwytak);
  97. scena.addChild(objTrans3);
  98.  
  99. //kulka
  100. scena.addChild(objTrans4);
  101. Appearance app = new Appearance();
  102. app.setColoringAttributes(new ColoringAttributes(1.0f, 0.0f, 0.0f,ColoringAttributes.ALLOW_COLOR_WRITE));
  103. app.setCapability(app.ALLOW_COLORING_ATTRIBUTES_WRITE);
  104. Sphere przedmiot = new Sphere(0.1f, app);
  105. objTrans4 = new TransformGroup();
  106. objTrans4.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  107. Transform3D kulka2 = new Transform3D();
  108. kulka2.setTranslation(new Vector3f(0.0f, 0.0f, 1.0f));
  109. objTrans4.setTransform(kulka2);
  110. objTrans4.addChild(przedmiot);
  111. scena.addChild(objTrans4);
  112.  
  113. // podłoże
  114. Appearance ap = new Appearance();
  115. Color3f black = new Color3f(.0f,.0f,.0f);
  116. Color3f white = new Color3f(0.8f,.8f,.8f);
  117. ap.setMaterial(new Material(white,black,white,black,80f));
  118. podloga ob = new podloga();
  119. ob.setAppearance(ap);
  120. scena.addChild(ob);
  121.  
  122. // światło kierunkowe
  123. Color3f light1Color = new Color3f(1.0f, 1.0f, 1.0f);
  124. Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
  125. DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
  126. light1.setInfluencingBounds(bounds);
  127. scena.addChild(light1);
  128.  
  129. // światło
  130. Color3f ambientColor = new Color3f(1.0f, 1.0f, 1.0f);
  131. AmbientLight ambientLightNode = new AmbientLight(ambientColor);
  132. ambientLightNode.setInfluencingBounds(bounds);
  133. scena.addChild(ambientLightNode);
  134.  
  135. //objTrans2.addChild(objTrans3);
  136. objTrans.addChild(objTrans2);
  137. scena.addChild(objTrans);
  138.  
  139. // Create a new Behavior object that will perform the collision
  140. // detection on the specified object, and add it into
  141. // the scene graph.
  142. CollisionDetector cd = new CollisionDetector(przedmiot);
  143. BoundingSphere boundy = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
  144. 1.0);
  145. cd.setSchedulingBounds(boundy);
  146. objTrans3.addChild(cd);
  147.  
  148. scena.compile();
  149. return scena;
  150. }
  151.  
  152.  
  153. /**
  154. * Konstruktor bezparametrowy klasy 'Main'. Ustawia on wygląd okna programu
  155. * (BorderLayout()), tworzy w nim podstawowe obiekty Java3D (SimpleUniverse).
  156. * Ustawia pozycję i zachowanie kamery oraz uruchamia zegar.
  157. */
  158. public Main() {
  159. setLayout(new BorderLayout());
  160.  
  161. GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
  162. Canvas3D canvas3D = new Canvas3D(config);
  163. add("Center", canvas3D);
  164. canvas3D.addKeyListener(this);
  165. add("South",label);
  166.  
  167. // Create a simple scene and attach it to the virtual universe
  168. BranchGroup scene = createSceneGraph();
  169. universe = new SimpleUniverse(canvas3D);
  170. universe.addBranchGraph(scene);
  171. obserwator = new OrbitBehavior(canvas3D);
  172. BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  173. obserwator.setSchedulingBounds(bounds);
  174. vPlatform = universe.getViewingPlatform();
  175. Transform3D temp = new Transform3D();
  176. temp.set(new Vector3f(0f,0f,7.0f));
  177. vPlatform.getViewPlatformTransform().setTransform(temp);
  178. vPlatform.setViewPlatformBehavior(obserwator);
  179. zegar.scheduleAtFixedRate(new Ruch(), 20, 25);
  180. }
  181.  
  182. /**
  183. * Funkcja tworzy okno typu MainFrame o zadanych wymiarach Width i Height.
  184. * Konstruktor okna wywołuje konstruktor klasy Main().
  185. * @param args
  186. */
  187. public static void main(String[] args) {
  188. //Main bb = new Main();
  189. MainFrame mf = new MainFrame(new Main(),Width, Height);
  190. }
  191.  
  192. /******************************************************************************/
  193.  
  194. class CollisionDetector extends Behavior {
  195. private final Color3f highlightColor = new Color3f(0.0f, 1.0f, 0.0f);
  196.  
  197. private final ColoringAttributes highlight = new ColoringAttributes(
  198. highlightColor, ColoringAttributes.SHADE_GOURAUD);
  199.  
  200. private Sphere sferka;
  201.  
  202. private ColoringAttributes shapeColoring;
  203.  
  204. private Appearance shapeAppearance;
  205.  
  206. private WakeupOnCollisionEntry wEnter;
  207.  
  208. private WakeupOnCollisionExit wExit;
  209.  
  210. public CollisionDetector(Sphere s) {
  211. sferka = s;
  212. shapeAppearance = sferka.getAppearance();
  213. shapeColoring = shapeAppearance.getColoringAttributes();
  214. inCollision = false;
  215. }
  216.  
  217. public void initialize() {
  218. wEnter = new WakeupOnCollisionEntry(sferka);
  219. wExit = new WakeupOnCollisionExit(sferka);
  220. wakeupOn(wEnter);
  221. }
  222.  
  223. public void processStimulus(Enumeration criteria) {
  224. inCollision = !inCollision;
  225.  
  226. if (inCollision) {
  227. shapeAppearance.setColoringAttributes(highlight);
  228. wakeupOn(wExit);
  229. } else {
  230. shapeAppearance.setColoringAttributes(shapeColoring);
  231. wakeupOn(wEnter);
  232. }
  233. }
  234. }
  235.  
  236. /******************************************************************************/
  237.  
  238. public static float round (double f)
  239.  
  240. { float temp = (float)(f*(Math.pow(10, 0)));
  241.  
  242. temp = (Math.round(temp));
  243.  
  244. temp = temp/(int)(Math.pow(10, 0));
  245.  
  246. return temp;
  247.  
  248. }
  249. /**
  250. * Funkcja wychwytuje zdarzenie wciśniecią przycisku na klawiaturze.
  251. * Zawiera obsługę przycisków służących do manipulacji robotem.
  252. * UP, DOWN - przesuw ramienia w pionie
  253. * LEFT, RIGHT - obrót ramienia wokół jego osi pionowej
  254. * A, S - przesuw ramienia w poziomie (wysuwanie, wsuwanie)
  255. * Z - standardowe ustawienie kamery
  256. * @param e (KeyEvent)
  257. */
  258. @Override
  259. public void keyPressed(KeyEvent e) {
  260. if(e.getKeyCode() == KeyEvent.VK_Z){
  261. vPlatform.setNominalViewingTransform();
  262. }
  263. if (Math.round(Math.toDegrees(x))==360) x=Math.toRadians(0);
  264. if (Math.toDegrees(x)==-1) x=Math.toRadians(358.9999999999974);
  265. switch(e.getKeyCode()){
  266. case KeyEvent.VK_UP:
  267. if(y < 0.65f) {
  268. y += 0.05;
  269. }
  270. break;
  271. case KeyEvent.VK_DOWN:
  272. if(y > -0.6f) {
  273. y -= 0.05;
  274. }
  275. break;
  276. case KeyEvent.VK_LEFT:
  277. x -= Math.PI/180;
  278. break;
  279. case KeyEvent.VK_RIGHT:
  280. x += Math.PI/180;
  281. break;
  282. case KeyEvent.VK_A:
  283. if(z > -0.3f) {
  284. z -= 0.05;
  285. }
  286. break;
  287. case KeyEvent.VK_S:
  288. if(z < 0.5f) {
  289. z += 0.05;
  290. }
  291. break;
  292. case KeyEvent.VK_SPACE:
  293. spacja = !spacja;
  294. zatrzask = true;
  295. }
  296. }
  297.  
  298. /**
  299. * Funkcja wychwytująca puszczenie przycisku klawiatury - nie używana.
  300. * @param e
  301. */
  302. @Override
  303. public void keyReleased(KeyEvent e){
  304. switch(e.getKeyCode()){
  305. case KeyEvent.VK_SPACE:
  306. zatrzask = false;
  307. break;
  308. }
  309. }
  310.  
  311. /**
  312. * Funkcja wychwytująca sygnał przycisku klawiatury - nie używana.
  313. * @param e
  314. */
  315. @Override
  316. public void keyTyped(KeyEvent e){
  317. }
  318.  
  319.  
  320. // @Override
  321. // public void mouseMoved(MouseEvent e) {
  322. // // x = (float)(e.getX())/Width-.5f;
  323. // //y = -(float)(e.getY())/Height+.5f;
  324. // }
  325.  
  326. /**
  327. * Klasa dziedzicząca po klasie TimerTask.
  328. * Zawiera funkcję run().
  329. */
  330. private class Ruch extends TimerTask{
  331. /**
  332. * Zadaniem funkcji jest przekształcanie
  333. * sceny w zależności od parametrów (zmienne globalne) oraz wyświetlanie
  334. * informacji o aktualnych wartościach parametrów w dolnym pasku
  335. * informacyjnym.
  336. */
  337. @Override
  338. public void run() {
  339. commonRotation.rotY(x);
  340.  
  341. trans2.rotX(Math.PI/2);
  342. trans2.setTranslation(new Vector3d(0.0f, y, z));
  343. trans2.mul(commonRotation, trans2);
  344. objTrans2.setTransform(trans2);
  345.  
  346. trans3.setTranslation(new Vector3d(0.0f,y+0.25,z+0.6));
  347. trans3.mul(commonRotation, trans3);
  348. objTrans3.setTransform(trans3);
  349.  
  350. trans4.setTranslation(new Vector3d(0.0f, y+0.25, z+0.64));
  351. trans4.mul(commonRotation, trans4);
  352. if (spacja==true && inCollision==true) {
  353. objTrans4.setTransform(trans4);
  354. }
  355. label.setText("Współrzędne: " + Math.round(Math.toDegrees(x)) + " , "+ y + " , " + z);
  356. }
  357. }
  358.  
  359. /**
  360. * Klasa 'podloga' dziedzicząca po klasie 'Shape3D'.
  361. */
  362. public class podloga extends Shape3D{ // podłoże robota
  363. final private Point3f A= new Point3f(-5.0f, -0.5f, -5.0f);
  364. final private Point3f B= new Point3f(-5.0f, -0.5f, 5.0f);
  365. final private Point3f C= new Point3f(5.0f, -0.5f, 5.0f);
  366. final private Point3f D= new Point3f(5.0f, -0.5f, -5.0f);
  367. final private Point3f[] pts = new Point3f[8];
  368. int[] stripCounts= new int[2];
  369. int[] contourCount=new int[2];
  370.  
  371. /**
  372. * Konstruktor bezparametrowy klasy 'podloga'. Tworzy punkt odniesienia
  373. * dla manipulatora.
  374. */
  375. public podloga(){
  376. // front
  377. pts[0]=C;
  378. pts[1]=D;
  379. pts[2]=A;
  380. pts[3]=B;
  381. //back
  382. pts[4]=C;
  383. pts[5]=B;
  384. pts[6]=A;
  385. pts[7]=D;
  386.  
  387. stripCounts[0]=4;
  388. stripCounts[1]=4;
  389. contourCount[0]=1;
  390. contourCount[1]=1;
  391. GeometryInfo gInf = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
  392. gInf.setCoordinates(pts);
  393. gInf.setStripCounts(stripCounts);
  394. gInf.setContourCounts(contourCount);
  395. NormalGenerator ng= new NormalGenerator();
  396. ng.setCreaseAngle ((float) Math.toRadians(30));
  397. ng.generateNormals(gInf);
  398. this.setGeometry(gInf.getGeometryArray());
  399. }
  400. }
  401.  
  402. }
Advertisement
Add Comment
Please, Sign In to add comment