<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F3D%2FInterpolator</id>
		<title>Java/3D/Interpolator - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F3D%2FInterpolator"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/3D/Interpolator&amp;action=history"/>
		<updated>2026-04-18T21:42:21Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/3D/Interpolator&amp;diff=6479&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/3D/Interpolator&amp;diff=6479&amp;oldid=prev"/>
				<updated>2010-06-01T06:15:15Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:15, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/3D/Interpolator&amp;diff=6478&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/3D/Interpolator&amp;diff=6478&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== A range of Interpolators and switches between ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********************************************************&lt;br /&gt;
 Copyright (C) 2001   Daniel Selman&lt;br /&gt;
 First distributed with the book &amp;quot;Java 3D Programming&amp;quot;&lt;br /&gt;
 by Daniel Selman and published by Manning Publications.&lt;br /&gt;
 http://manning.ru/selman&lt;br /&gt;
 This program is free software; you can redistribute it and/or&lt;br /&gt;
 modify it under the terms of the GNU General Public License&lt;br /&gt;
 as published by the Free Software Foundation, version 2.&lt;br /&gt;
 This program is distributed in the hope that it will be useful,&lt;br /&gt;
 but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 GNU General Public License for more details.&lt;br /&gt;
 The license can be found on the WWW at:&lt;br /&gt;
 http://www.fsf.org/copyleft/gpl.html&lt;br /&gt;
 Or by writing to:&lt;br /&gt;
 Free Software Foundation, Inc.,&lt;br /&gt;
 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.&lt;br /&gt;
 Authors can be contacted at:&lt;br /&gt;
 Daniel Selman: daniel@selman.org&lt;br /&gt;
 If you make changes you think others would like, please &lt;br /&gt;
 contact one of the authors or someone at the &lt;br /&gt;
 www.j3d.org web site.&lt;br /&gt;
 **************************************************************/&lt;br /&gt;
import java.applet.Applet;&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Font;&lt;br /&gt;
import java.awt.GraphicsConfigTemplate;&lt;br /&gt;
import java.awt.GraphicsDevice;&lt;br /&gt;
import java.awt.GraphicsEnvironment;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import javax.media.j3d.Alpha;&lt;br /&gt;
import javax.media.j3d.AmbientLight;&lt;br /&gt;
import javax.media.j3d.Appearance;&lt;br /&gt;
import javax.media.j3d.AudioDevice;&lt;br /&gt;
import javax.media.j3d.Background;&lt;br /&gt;
import javax.media.j3d.BoundingSphere;&lt;br /&gt;
import javax.media.j3d.Bounds;&lt;br /&gt;
import javax.media.j3d.BranchGroup;&lt;br /&gt;
import javax.media.j3d.Canvas3D;&lt;br /&gt;
import javax.media.j3d.ColorInterpolator;&lt;br /&gt;
import javax.media.j3d.DirectionalLight;&lt;br /&gt;
import javax.media.j3d.GraphicsConfigTemplate3D;&lt;br /&gt;
import javax.media.j3d.Group;&lt;br /&gt;
import javax.media.j3d.Interpolator;&lt;br /&gt;
import javax.media.j3d.Locale;&lt;br /&gt;
import javax.media.j3d.Material;&lt;br /&gt;
import javax.media.j3d.PhysicalBody;&lt;br /&gt;
import javax.media.j3d.PhysicalEnvironment;&lt;br /&gt;
import javax.media.j3d.PositionInterpolator;&lt;br /&gt;
import javax.media.j3d.RotPosScalePathInterpolator;&lt;br /&gt;
import javax.media.j3d.RotationInterpolator;&lt;br /&gt;
import javax.media.j3d.ScaleInterpolator;&lt;br /&gt;
import javax.media.j3d.Switch;&lt;br /&gt;
import javax.media.j3d.SwitchValueInterpolator;&lt;br /&gt;
import javax.media.j3d.Transform3D;&lt;br /&gt;
import javax.media.j3d.TransformGroup;&lt;br /&gt;
import javax.media.j3d.TransparencyAttributes;&lt;br /&gt;
import javax.media.j3d.TransparencyInterpolator;&lt;br /&gt;
import javax.media.j3d.View;&lt;br /&gt;
import javax.media.j3d.ViewPlatform;&lt;br /&gt;
import javax.media.j3d.VirtualUniverse;&lt;br /&gt;
import javax.vecmath.Color3f;&lt;br /&gt;
import javax.vecmath.Point3d;&lt;br /&gt;
import javax.vecmath.Point3f;&lt;br /&gt;
import javax.vecmath.Quat4f;&lt;br /&gt;
import javax.vecmath.Vector3d;&lt;br /&gt;
import javax.vecmath.Vector3f;&lt;br /&gt;
import com.sun.j3d.audioengines.javasound.JavaSoundMixer;&lt;br /&gt;
import com.sun.j3d.utils.applet.MainFrame;&lt;br /&gt;
import com.sun.j3d.utils.geometry.Primitive;&lt;br /&gt;
import com.sun.j3d.utils.geometry.Sphere;&lt;br /&gt;
import com.sun.j3d.utils.geometry.Text2D;&lt;br /&gt;
/**&lt;br /&gt;
 * This example creates a range of Interpolators and switches between them using&lt;br /&gt;
 * a SwitchInterpolator&lt;br /&gt;
 */&lt;br /&gt;
public class InterpolatorTest extends Java3dApplet {&lt;br /&gt;
  private static int m_kWidth = 400;&lt;br /&gt;
  private static int m_kHeight = 400;&lt;br /&gt;
  public InterpolatorTest() {&lt;br /&gt;
    initJava3d();&lt;br /&gt;
  }&lt;br /&gt;
  // scale eveything up so that moving from 0 to 1&lt;br /&gt;
  // is significant&lt;br /&gt;
  protected double getScale() {&lt;br /&gt;
    return 10.0;&lt;br /&gt;
  }&lt;br /&gt;
  // we want a black background&lt;br /&gt;
  protected Background createBackground() {&lt;br /&gt;
    return null;&lt;br /&gt;
  }&lt;br /&gt;
  protected BranchGroup createSceneBranchGroup() {&lt;br /&gt;
    BranchGroup objRoot = super.createSceneBranchGroup();&lt;br /&gt;
    // create a root TG in case we need to scale the scene&lt;br /&gt;
    TransformGroup objTrans = new TransformGroup();&lt;br /&gt;
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);&lt;br /&gt;
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);&lt;br /&gt;
    // create the Appearance for the Shape3D&lt;br /&gt;
    Appearance app = new Appearance();&lt;br /&gt;
    // create a Material, modified by the ColorInterpolator&lt;br /&gt;
    Color3f objColor = new Color3f(1.0f, 0.7f, 0.8f);&lt;br /&gt;
    Color3f black = new Color3f(0.0f, 0.0f, 0.0f);&lt;br /&gt;
    Material mat = new Material(objColor, black, objColor, black, 80.0f);&lt;br /&gt;
    mat.setCapability(Material.ALLOW_COMPONENT_WRITE);&lt;br /&gt;
    app.setMaterial(mat);&lt;br /&gt;
    // create a TransparencyAttributes, modified by the&lt;br /&gt;
    // TransparencyInterpolator&lt;br /&gt;
    TransparencyAttributes transparency = new TransparencyAttributes();&lt;br /&gt;
    transparency.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);&lt;br /&gt;
    transparency.setTransparencyMode(TransparencyAttributes.NICEST);&lt;br /&gt;
    app.setTransparencyAttributes(transparency);&lt;br /&gt;
    // create a Switch Node and set capabilities&lt;br /&gt;
    Switch switchNode = new Switch();&lt;br /&gt;
    switchNode.setCapability(Switch.ALLOW_SWITCH_WRITE);&lt;br /&gt;
    // create a Alpha object for the Interpolators&lt;br /&gt;
    Alpha alpha = new Alpha(-1, Alpha.INCREASING_ENABLE&lt;br /&gt;
        | Alpha.DECREASING_ENABLE, 500, 100, 5000, 2000, 1000, 5000,&lt;br /&gt;
        2000, 500);&lt;br /&gt;
    // add each BG and Interpolator as a child of the Switch Node&lt;br /&gt;
    TransformGroup tg = createSharedGroup(app);&lt;br /&gt;
    switchNode.addChild(createBranchGroup(tg, new ColorInterpolator(alpha,&lt;br /&gt;
        app.getMaterial())));&lt;br /&gt;
    tg = createSharedGroup(app);&lt;br /&gt;
    switchNode.addChild(createBranchGroup(tg, new PositionInterpolator(&lt;br /&gt;
        alpha, tg)));&lt;br /&gt;
    tg = createSharedGroup(app);&lt;br /&gt;
    switchNode.addChild(createBranchGroup(tg, new RotationInterpolator(&lt;br /&gt;
        alpha, tg)));&lt;br /&gt;
    tg = createSharedGroup(app);&lt;br /&gt;
    switchNode.addChild(createBranchGroup(tg, new ScaleInterpolator(alpha,&lt;br /&gt;
        tg)));&lt;br /&gt;
    tg = createSharedGroup(app);&lt;br /&gt;
    switchNode.addChild(createBranchGroup(tg, new TransparencyInterpolator(&lt;br /&gt;
        alpha, app.getTransparencyAttributes(), 0, 0.8f)));&lt;br /&gt;
    // define the data for the RotPosScalePathInterpolator&lt;br /&gt;
    float[] knots = { 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.6f, 0.8f, 0.9f, 1.0f };&lt;br /&gt;
    float[] scales = { 0.2f, 0.5f, 0.8f, 2.3f, 5.4f, 0.6f, 0.4f, 0.2f, 0.1f };&lt;br /&gt;
    Quat4f[] quats = new Quat4f[9];&lt;br /&gt;
    Point3f[] positions = new Point3f[9];&lt;br /&gt;
    quats[0] = new Quat4f(0.3f, 1.0f, 1.0f, 0.0f);&lt;br /&gt;
    quats[1] = new Quat4f(1.0f, 0.0f, 0.0f, 0.3f);&lt;br /&gt;
    quats[2] = new Quat4f(0.2f, 1.0f, 0.0f, 0.0f);&lt;br /&gt;
    quats[3] = new Quat4f(0.0f, 0.2f, 1.0f, 0.0f);&lt;br /&gt;
    quats[4] = new Quat4f(1.0f, 0.0f, 0.4f, 0.0f);&lt;br /&gt;
    quats[5] = new Quat4f(0.0f, 1.0f, 1.0f, 0.2f);&lt;br /&gt;
    quats[6] = new Quat4f(0.3f, 0.3f, 0.0f, 0.0f);&lt;br /&gt;
    quats[7] = new Quat4f(1.0f, 0.0f, 1.0f, 1.0f);&lt;br /&gt;
    quats[8] = quats[0];&lt;br /&gt;
    positions[0] = new Point3f(0.0f, 0.0f, -1.0f);&lt;br /&gt;
    positions[1] = new Point3f(1.0f, -2.0f, -2.0f);&lt;br /&gt;
    positions[2] = new Point3f(-2.0f, 2.0f, -3.0f);&lt;br /&gt;
    positions[3] = new Point3f(1.0f, 1.0f, -4.0f);&lt;br /&gt;
    positions[4] = new Point3f(-4.0f, -2.0f, -5.0f);&lt;br /&gt;
    positions[5] = new Point3f(2.0f, 0.3f, -6.0f);&lt;br /&gt;
    positions[6] = new Point3f(-4.0f, 0.5f, -7.0f);&lt;br /&gt;
    positions[7] = new Point3f(0.0f, -1.5f, -4.0f);&lt;br /&gt;
    positions[8] = positions[0];&lt;br /&gt;
    tg = createSharedGroup(app);&lt;br /&gt;
    // create the Interpolator&lt;br /&gt;
    RotPosScalePathInterpolator rotPosScalePathInterplator = new RotPosScalePathInterpolator(&lt;br /&gt;
        alpha, tg, new Transform3D(), knots, quats, positions, scales);&lt;br /&gt;
    // add a BG for the Interpolator&lt;br /&gt;
    switchNode.addChild(createBranchGroup(tg, rotPosScalePathInterplator));&lt;br /&gt;
    // create a RandomAlpha object to control a SwitchInterpolator&lt;br /&gt;
    // to set the Switches active child node randomly&lt;br /&gt;
    RandomAlpha randomAlpha = new RandomAlpha();&lt;br /&gt;
    // create the interpolator&lt;br /&gt;
    SwitchValueInterpolator switchInterpolator = new SwitchValueInterpolator(&lt;br /&gt;
        randomAlpha, switchNode);&lt;br /&gt;
    switchInterpolator.setSchedulingBounds(getApplicationBounds());&lt;br /&gt;
    // connect the scenegraph&lt;br /&gt;
    objTrans.addChild(switchNode);&lt;br /&gt;
    objTrans.addChild(switchInterpolator);&lt;br /&gt;
    // Set up the global lights&lt;br /&gt;
    Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);&lt;br /&gt;
    Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);&lt;br /&gt;
    Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);&lt;br /&gt;
    AmbientLight aLgt = new AmbientLight(alColor);&lt;br /&gt;
    aLgt.setInfluencingBounds(getApplicationBounds());&lt;br /&gt;
    DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);&lt;br /&gt;
    lgt1.setInfluencingBounds(getApplicationBounds());&lt;br /&gt;
    // add the lights&lt;br /&gt;
    objRoot.addChild(aLgt);&lt;br /&gt;
    objRoot.addChild(lgt1);&lt;br /&gt;
    // connect&lt;br /&gt;
    objRoot.addChild(objTrans);&lt;br /&gt;
    return objRoot;&lt;br /&gt;
  }&lt;br /&gt;
  // creates a BG containing:&lt;br /&gt;
  //  - a Link to the SharedGroup&lt;br /&gt;
  //  - The Interpolator&lt;br /&gt;
  //  - a Text2D label of the name of the Interpolator&lt;br /&gt;
  private BranchGroup createBranchGroup(TransformGroup bgShared,&lt;br /&gt;
      Interpolator interpolator) {&lt;br /&gt;
    BranchGroup bg = new BranchGroup();&lt;br /&gt;
    bg.addChild(bgShared);&lt;br /&gt;
    bg.addChild(interpolator);&lt;br /&gt;
    interpolator.setSchedulingBounds(getApplicationBounds());&lt;br /&gt;
    // strip the package name from szClass (everything before the final &amp;quot;.&amp;quot;)&lt;br /&gt;
    String szClass = interpolator.getClass().getName();&lt;br /&gt;
    int nIndex = szClass.lastIndexOf(&amp;quot;.&amp;quot;);&lt;br /&gt;
    String szTrimedClass = szClass;&lt;br /&gt;
    if (nIndex &amp;gt; -1)&lt;br /&gt;
      szTrimedClass = szClass.substring(nIndex + 1, szClass.length());&lt;br /&gt;
    Text2D text = new Text2D(szTrimedClass, new Color3f(1, 1, 1),&lt;br /&gt;
        &amp;quot;SansSerif&amp;quot;, 20, Font.PLAIN);&lt;br /&gt;
    bg.addChild(text);&lt;br /&gt;
    return bg;&lt;br /&gt;
  }&lt;br /&gt;
  // create a SharedGroup and populate with some child nodes&lt;br /&gt;
  private TransformGroup createSharedGroup(Appearance app) {&lt;br /&gt;
    TransformGroup tg = new TransformGroup();&lt;br /&gt;
    tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);&lt;br /&gt;
    tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);&lt;br /&gt;
    tg.addChild(createGeometry(app, -0.5, -0.5, 0));&lt;br /&gt;
    tg.addChild(createGeometry(app, -0.5, 0.5, 0));&lt;br /&gt;
    tg.addChild(createGeometry(app, 0.5, 0.5, 0));&lt;br /&gt;
    tg.addChild(createGeometry(app, 0.5, -0.5, 0));&lt;br /&gt;
    return tg;&lt;br /&gt;
  }&lt;br /&gt;
  // create and position a Sphere using a parent TransformGroup&lt;br /&gt;
  TransformGroup createGeometry(Appearance app, double x, double y, double z) {&lt;br /&gt;
    Transform3D t3d = new Transform3D();&lt;br /&gt;
    t3d.setTranslation(new Vector3d(x, y, z));&lt;br /&gt;
    TransformGroup tg = new TransformGroup(t3d);&lt;br /&gt;
    tg.addChild(new Sphere(0.1f, Primitive.GENERATE_NORMALS, app));&lt;br /&gt;
    return tg;&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    InterpolatorTest interpolatorTest = new InterpolatorTest();&lt;br /&gt;
    interpolatorTest.saveCommandLineArguments(args);&lt;br /&gt;
    new MainFrame(interpolatorTest, m_kWidth, m_kHeight);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
//this class defines an Alpha class that returns a random&lt;br /&gt;
//value every N milliseconds.&lt;br /&gt;
class RandomAlpha extends Alpha {&lt;br /&gt;
  protected long m_LastQueryTime = 0;&lt;br /&gt;
  protected float m_Alpha = 0;&lt;br /&gt;
  protected final int m_kUpdateInterval = 10000;&lt;br /&gt;
  public RandomAlpha() {&lt;br /&gt;
  }&lt;br /&gt;
  // core method override&lt;br /&gt;
  // returns the Alpha value for a given time&lt;br /&gt;
  public float value(long time) {&lt;br /&gt;
    if (System.currentTimeMillis() - m_LastQueryTime &amp;gt; m_kUpdateInterval) {&lt;br /&gt;
      m_LastQueryTime = System.currentTimeMillis();&lt;br /&gt;
      m_Alpha = (float) Math.random();&lt;br /&gt;
    }&lt;br /&gt;
    return m_Alpha;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/*******************************************************************************&lt;br /&gt;
 * Copyright (C) 2001 Daniel Selman&lt;br /&gt;
 * &lt;br /&gt;
 * First distributed with the book &amp;quot;Java 3D Programming&amp;quot; by Daniel Selman and&lt;br /&gt;
 * published by Manning Publications. http://manning.ru/selman&lt;br /&gt;
 * &lt;br /&gt;
 * This program is free software; you can redistribute it and/or modify it under&lt;br /&gt;
 * the terms of the GNU General Public License as published by the Free Software&lt;br /&gt;
 * Foundation, version 2.&lt;br /&gt;
 * &lt;br /&gt;
 * This program is distributed in the hope that it will be useful, but WITHOUT&lt;br /&gt;
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS&lt;br /&gt;
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more&lt;br /&gt;
 * details.&lt;br /&gt;
 * &lt;br /&gt;
 * The license can be found on the WWW at: http://www.fsf.org/copyleft/gpl.html&lt;br /&gt;
 * &lt;br /&gt;
 * Or by writing to: Free Software Foundation, Inc., 59 Temple Place - Suite&lt;br /&gt;
 * 330, Boston, MA 02111-1307, USA.&lt;br /&gt;
 * &lt;br /&gt;
 * Authors can be contacted at: Daniel Selman: daniel@selman.org&lt;br /&gt;
 * &lt;br /&gt;
 * If you make changes you think others would like, please contact one of the&lt;br /&gt;
 * authors or someone at the www.j3d.org web site.&lt;br /&gt;
 ******************************************************************************/&lt;br /&gt;
//*****************************************************************************&lt;br /&gt;
/**&lt;br /&gt;
 * Java3dApplet&lt;br /&gt;
 * &lt;br /&gt;
 * Base class for defining a Java 3D applet. Contains some useful methods for&lt;br /&gt;
 * defining views and scenegraphs etc.&lt;br /&gt;
 * &lt;br /&gt;
 * @author Daniel Selman&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
//*****************************************************************************&lt;br /&gt;
abstract class Java3dApplet extends Applet {&lt;br /&gt;
  public static int m_kWidth = 300;&lt;br /&gt;
  public static int m_kHeight = 300;&lt;br /&gt;
  protected String[] m_szCommandLineArray = null;&lt;br /&gt;
  protected VirtualUniverse m_Universe = null;&lt;br /&gt;
  protected BranchGroup m_SceneBranchGroup = null;&lt;br /&gt;
  protected Bounds m_ApplicationBounds = null;&lt;br /&gt;
  //  protected com.tornadolabs.j3dtree.Java3dTree m_Java3dTree = null;&lt;br /&gt;
  public Java3dApplet() {&lt;br /&gt;
  }&lt;br /&gt;
  public boolean isApplet() {&lt;br /&gt;
    try {&lt;br /&gt;
      System.getProperty(&amp;quot;user.dir&amp;quot;);&lt;br /&gt;
      System.out.println(&amp;quot;Running as Application.&amp;quot;);&lt;br /&gt;
      return false;&lt;br /&gt;
    } catch (Exception e) {&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;Running as Applet.&amp;quot;);&lt;br /&gt;
    return true;&lt;br /&gt;
  }&lt;br /&gt;
  public URL getWorkingDirectory() throws java.net.MalformedURLException {&lt;br /&gt;
    URL url = null;&lt;br /&gt;
    try {&lt;br /&gt;
      File file = new File(System.getProperty(&amp;quot;user.dir&amp;quot;));&lt;br /&gt;
      System.out.println(&amp;quot;Running as Application:&amp;quot;);&lt;br /&gt;
      System.out.println(&amp;quot;   &amp;quot; + file.toURL());&lt;br /&gt;
      return file.toURL();&lt;br /&gt;
    } catch (Exception e) {&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;Running as Applet:&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;   &amp;quot; + getCodeBase());&lt;br /&gt;
    return getCodeBase();&lt;br /&gt;
  }&lt;br /&gt;
  public VirtualUniverse getVirtualUniverse() {&lt;br /&gt;
    return m_Universe;&lt;br /&gt;
  }&lt;br /&gt;
  //public com.tornadolabs.j3dtree.Java3dTree getJ3dTree() {&lt;br /&gt;
  //return m_Java3dTree;&lt;br /&gt;
  //  }&lt;br /&gt;
  public Locale getFirstLocale() {&lt;br /&gt;
    java.util.Enumeration e = m_Universe.getAllLocales();&lt;br /&gt;
    if (e.hasMoreElements() != false)&lt;br /&gt;
      return (Locale) e.nextElement();&lt;br /&gt;
    return null;&lt;br /&gt;
  }&lt;br /&gt;
  protected Bounds getApplicationBounds() {&lt;br /&gt;
    if (m_ApplicationBounds == null)&lt;br /&gt;
      m_ApplicationBounds = createApplicationBounds();&lt;br /&gt;
    return m_ApplicationBounds;&lt;br /&gt;
  }&lt;br /&gt;
  protected Bounds createApplicationBounds() {&lt;br /&gt;
    m_ApplicationBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),&lt;br /&gt;
        100.0);&lt;br /&gt;
    return m_ApplicationBounds;&lt;br /&gt;
  }&lt;br /&gt;
  protected Background createBackground() {&lt;br /&gt;
    Background back = new Background(new Color3f(0.9f, 0.9f, 0.9f));&lt;br /&gt;
    back.setApplicationBounds(createApplicationBounds());&lt;br /&gt;
    return back;&lt;br /&gt;
  }&lt;br /&gt;
  public void initJava3d() {&lt;br /&gt;
    //  m_Java3dTree = new com.tornadolabs.j3dtree.Java3dTree();&lt;br /&gt;
    m_Universe = createVirtualUniverse();&lt;br /&gt;
    Locale locale = createLocale(m_Universe);&lt;br /&gt;
    BranchGroup sceneBranchGroup = createSceneBranchGroup();&lt;br /&gt;
    ViewPlatform vp = createViewPlatform();&lt;br /&gt;
    BranchGroup viewBranchGroup = createViewBranchGroup(&lt;br /&gt;
        getViewTransformGroupArray(), vp);&lt;br /&gt;
    createView(vp);&lt;br /&gt;
    Background background = createBackground();&lt;br /&gt;
    if (background != null)&lt;br /&gt;
      sceneBranchGroup.addChild(background);&lt;br /&gt;
    //    m_Java3dTree.recursiveApplyCapability(sceneBranchGroup);&lt;br /&gt;
    //  m_Java3dTree.recursiveApplyCapability(viewBranchGroup);&lt;br /&gt;
    locale.addBranchGraph(sceneBranchGroup);&lt;br /&gt;
    addViewBranchGroup(locale, viewBranchGroup);&lt;br /&gt;
    onDoneInit();&lt;br /&gt;
  }&lt;br /&gt;
  protected void onDoneInit() {&lt;br /&gt;
    //  m_Java3dTree.updateNodes(m_Universe);&lt;br /&gt;
  }&lt;br /&gt;
  protected double getScale() {&lt;br /&gt;
    return 1.0;&lt;br /&gt;
  }&lt;br /&gt;
  public TransformGroup[] getViewTransformGroupArray() {&lt;br /&gt;
    TransformGroup[] tgArray = new TransformGroup[1];&lt;br /&gt;
    tgArray[0] = new TransformGroup();&lt;br /&gt;
    // move the camera BACK a little...&lt;br /&gt;
    // note that we have to invert the matrix as&lt;br /&gt;
    // we are moving the viewer&lt;br /&gt;
    Transform3D t3d = new Transform3D();&lt;br /&gt;
    t3d.setScale(getScale());&lt;br /&gt;
    t3d.setTranslation(new Vector3d(0.0, 0.0, -20.0));&lt;br /&gt;
    t3d.invert();&lt;br /&gt;
    tgArray[0].setTransform(t3d);&lt;br /&gt;
    return tgArray;&lt;br /&gt;
  }&lt;br /&gt;
  protected void addViewBranchGroup(Locale locale, BranchGroup bg) {&lt;br /&gt;
    locale.addBranchGraph(bg);&lt;br /&gt;
  }&lt;br /&gt;
  protected Locale createLocale(VirtualUniverse u) {&lt;br /&gt;
    return new Locale(u);&lt;br /&gt;
  }&lt;br /&gt;
  protected BranchGroup createSceneBranchGroup() {&lt;br /&gt;
    m_SceneBranchGroup = new BranchGroup();&lt;br /&gt;
    return m_SceneBranchGroup;&lt;br /&gt;
  }&lt;br /&gt;
  protected View createView(ViewPlatform vp) {&lt;br /&gt;
    View view = new View();&lt;br /&gt;
    PhysicalBody pb = createPhysicalBody();&lt;br /&gt;
    PhysicalEnvironment pe = createPhysicalEnvironment();&lt;br /&gt;
    AudioDevice audioDevice = createAudioDevice(pe);&lt;br /&gt;
    if (audioDevice != null) {&lt;br /&gt;
      pe.setAudioDevice(audioDevice);&lt;br /&gt;
      audioDevice.initialize();&lt;br /&gt;
    }&lt;br /&gt;
    view.setPhysicalEnvironment(pe);&lt;br /&gt;
    view.setPhysicalBody(pb);&lt;br /&gt;
    if (vp != null)&lt;br /&gt;
      view.attachViewPlatform(vp);&lt;br /&gt;
    view.setBackClipDistance(getBackClipDistance());&lt;br /&gt;
    view.setFrontClipDistance(getFrontClipDistance());&lt;br /&gt;
    Canvas3D c3d = createCanvas3D();&lt;br /&gt;
    view.addCanvas3D(c3d);&lt;br /&gt;
    addCanvas3D(c3d);&lt;br /&gt;
    return view;&lt;br /&gt;
  }&lt;br /&gt;
  protected PhysicalBody createPhysicalBody() {&lt;br /&gt;
    return new PhysicalBody();&lt;br /&gt;
  }&lt;br /&gt;
  protected AudioDevice createAudioDevice(PhysicalEnvironment pe) {&lt;br /&gt;
    JavaSoundMixer javaSoundMixer = new JavaSoundMixer(pe);&lt;br /&gt;
    if (javaSoundMixer == null)&lt;br /&gt;
      System.out.println(&amp;quot;create of audiodevice failed&amp;quot;);&lt;br /&gt;
    return javaSoundMixer;&lt;br /&gt;
  }&lt;br /&gt;
  protected PhysicalEnvironment createPhysicalEnvironment() {&lt;br /&gt;
    return new PhysicalEnvironment();&lt;br /&gt;
  }&lt;br /&gt;
  protected float getViewPlatformActivationRadius() {&lt;br /&gt;
    return 100;&lt;br /&gt;
  }&lt;br /&gt;
  protected ViewPlatform createViewPlatform() {&lt;br /&gt;
    ViewPlatform vp = new ViewPlatform();&lt;br /&gt;
    vp.setViewAttachPolicy(View.RELATIVE_TO_FIELD_OF_VIEW);&lt;br /&gt;
    vp.setActivationRadius(getViewPlatformActivationRadius());&lt;br /&gt;
    return vp;&lt;br /&gt;
  }&lt;br /&gt;
  protected Canvas3D createCanvas3D() {&lt;br /&gt;
    GraphicsConfigTemplate3D gc3D = new GraphicsConfigTemplate3D();&lt;br /&gt;
    gc3D.setSceneAntialiasing(GraphicsConfigTemplate.PREFERRED);&lt;br /&gt;
    GraphicsDevice gd[] = GraphicsEnvironment.getLocalGraphicsEnvironment()&lt;br /&gt;
        .getScreenDevices();&lt;br /&gt;
    Canvas3D c3d = new Canvas3D(gd[0].getBestConfiguration(gc3D));&lt;br /&gt;
    c3d.setSize(getCanvas3dWidth(c3d), getCanvas3dHeight(c3d));&lt;br /&gt;
    return c3d;&lt;br /&gt;
  }&lt;br /&gt;
  protected int getCanvas3dWidth(Canvas3D c3d) {&lt;br /&gt;
    return m_kWidth;&lt;br /&gt;
  }&lt;br /&gt;
  protected int getCanvas3dHeight(Canvas3D c3d) {&lt;br /&gt;
    return m_kHeight;&lt;br /&gt;
  }&lt;br /&gt;
  protected double getBackClipDistance() {&lt;br /&gt;
    return 100.0;&lt;br /&gt;
  }&lt;br /&gt;
  protected double getFrontClipDistance() {&lt;br /&gt;
    return 1.0;&lt;br /&gt;
  }&lt;br /&gt;
  protected BranchGroup createViewBranchGroup(TransformGroup[] tgArray,&lt;br /&gt;
      ViewPlatform vp) {&lt;br /&gt;
    BranchGroup vpBranchGroup = new BranchGroup();&lt;br /&gt;
    if (tgArray != null &amp;amp;&amp;amp; tgArray.length &amp;gt; 0) {&lt;br /&gt;
      Group parentGroup = vpBranchGroup;&lt;br /&gt;
      TransformGroup curTg = null;&lt;br /&gt;
      for (int n = 0; n &amp;lt; tgArray.length; n++) {&lt;br /&gt;
        curTg = tgArray[n];&lt;br /&gt;
        parentGroup.addChild(curTg);&lt;br /&gt;
        parentGroup = curTg;&lt;br /&gt;
      }&lt;br /&gt;
      tgArray[tgArray.length - 1].addChild(vp);&lt;br /&gt;
    } else&lt;br /&gt;
      vpBranchGroup.addChild(vp);&lt;br /&gt;
    return vpBranchGroup;&lt;br /&gt;
  }&lt;br /&gt;
  protected void addCanvas3D(Canvas3D c3d) {&lt;br /&gt;
    setLayout(new BorderLayout());&lt;br /&gt;
    add(c3d, BorderLayout.CENTER);&lt;br /&gt;
    doLayout();&lt;br /&gt;
  }&lt;br /&gt;
  protected VirtualUniverse createVirtualUniverse() {&lt;br /&gt;
    return new VirtualUniverse();&lt;br /&gt;
  }&lt;br /&gt;
  protected void saveCommandLineArguments(String[] szArgs) {&lt;br /&gt;
    m_szCommandLineArray = szArgs;&lt;br /&gt;
  }&lt;br /&gt;
  protected String[] getCommandLineArguments() {&lt;br /&gt;
    return m_szCommandLineArray;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== This creates a rotation interpolator and applies it to a shape ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Essential Java 3D Fast&lt;br /&gt;
Ian Palmer&lt;br /&gt;
Publisher: Springer-Verlag&lt;br /&gt;
ISBN: 1-85233-394-4&lt;br /&gt;
*/&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Button;&lt;br /&gt;
import java.awt.Frame;&lt;br /&gt;
import java.awt.Panel;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import javax.media.j3d.AmbientLight;&lt;br /&gt;
import javax.media.j3d.BoundingSphere;&lt;br /&gt;
import javax.media.j3d.BranchGroup;&lt;br /&gt;
import javax.media.j3d.Canvas3D;&lt;br /&gt;
import javax.media.j3d.DirectionalLight;&lt;br /&gt;
import javax.media.j3d.Locale;&lt;br /&gt;
import javax.media.j3d.PhysicalBody;&lt;br /&gt;
import javax.media.j3d.PhysicalEnvironment;&lt;br /&gt;
import javax.media.j3d.Transform3D;&lt;br /&gt;
import javax.media.j3d.TransformGroup;&lt;br /&gt;
import javax.media.j3d.View;&lt;br /&gt;
import javax.media.j3d.ViewPlatform;&lt;br /&gt;
import javax.media.j3d.VirtualUniverse;&lt;br /&gt;
import javax.vecmath.Color3f;&lt;br /&gt;
import javax.vecmath.Point3d;&lt;br /&gt;
import javax.vecmath.Vector3f;&lt;br /&gt;
/**&lt;br /&gt;
 * This creates a rotation interpolator and applies it to a shape.&lt;br /&gt;
 * &lt;br /&gt;
 * @author I.J.Palmer&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class SimpleRotator extends Frame implements ActionListener {&lt;br /&gt;
  protected Canvas3D myCanvas3D = new Canvas3D(null);&lt;br /&gt;
  protected Button exitButton = new Button(&amp;quot;Exit&amp;quot;);&lt;br /&gt;
  /**&lt;br /&gt;
   * This function builds the view branch of the scene graph. It creates a&lt;br /&gt;
   * branch group and then creates the necessary view elements to give a&lt;br /&gt;
   * useful view of our content.&lt;br /&gt;
   * &lt;br /&gt;
   * @param c&lt;br /&gt;
   *            Canvas3D that will display the view&lt;br /&gt;
   * @return BranchGroup that is the root of the view elements&lt;br /&gt;
   */&lt;br /&gt;
  protected BranchGroup buildViewBranch(Canvas3D c) {&lt;br /&gt;
    BranchGroup viewBranch = new BranchGroup();&lt;br /&gt;
    Transform3D viewXfm = new Transform3D();&lt;br /&gt;
    viewXfm.set(new Vector3f(0.0f, 0.0f, 10.0f));&lt;br /&gt;
    TransformGroup viewXfmGroup = new TransformGroup(viewXfm);&lt;br /&gt;
    ViewPlatform myViewPlatform = new ViewPlatform();&lt;br /&gt;
    PhysicalBody myBody = new PhysicalBody();&lt;br /&gt;
    PhysicalEnvironment myEnvironment = new PhysicalEnvironment();&lt;br /&gt;
    viewXfmGroup.addChild(myViewPlatform);&lt;br /&gt;
    viewBranch.addChild(viewXfmGroup);&lt;br /&gt;
    View myView = new View();&lt;br /&gt;
    myView.addCanvas3D(c);&lt;br /&gt;
    myView.attachViewPlatform(myViewPlatform);&lt;br /&gt;
    myView.setPhysicalBody(myBody);&lt;br /&gt;
    myView.setPhysicalEnvironment(myEnvironment);&lt;br /&gt;
    return viewBranch;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Add some lights so that we can illuminate the scene. This adds one&lt;br /&gt;
   * ambient light to bring up the overall lighting level and one directional&lt;br /&gt;
   * shape to show the shape of the objects in the scene.&lt;br /&gt;
   * &lt;br /&gt;
   * @param b&lt;br /&gt;
   *            BranchGroup that the lights are to be added to.&lt;br /&gt;
   */&lt;br /&gt;
  protected void addLights(BranchGroup b) {&lt;br /&gt;
    BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),&lt;br /&gt;
        100.0);&lt;br /&gt;
    Color3f ambLightColour = new Color3f(0.5f, 0.5f, 0.5f);&lt;br /&gt;
    AmbientLight ambLight = new AmbientLight(ambLightColour);&lt;br /&gt;
    ambLight.setInfluencingBounds(bounds);&lt;br /&gt;
    Color3f dirLightColour = new Color3f(1.0f, 1.0f, 1.0f);&lt;br /&gt;
    Vector3f dirLightDir = new Vector3f(-1.0f, -1.0f, -1.0f);&lt;br /&gt;
    DirectionalLight dirLight = new DirectionalLight(dirLightColour,&lt;br /&gt;
        dirLightDir);&lt;br /&gt;
    dirLight.setInfluencingBounds(bounds);&lt;br /&gt;
    b.addChild(ambLight);&lt;br /&gt;
    b.addChild(dirLight);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * This builds the content branch of our scene graph. The root of the shapes&lt;br /&gt;
   * supplied as a parameter is slightly tilted to reveal its 3D shape. It&lt;br /&gt;
   * also uses the addLights function to add some lights to the scene. We also&lt;br /&gt;
   * create the alpha generator and the rotation interpolator to perform the&lt;br /&gt;
   * animation.&lt;br /&gt;
   * &lt;br /&gt;
   * @param shape&lt;br /&gt;
   *            Node that represents the geometry for the content&lt;br /&gt;
   * @return BranchGroup that is the root of the content branch / protected&lt;br /&gt;
   *         BranchGroup buildContentBranch(Node shape) { BranchGroup&lt;br /&gt;
   *         contentBranch = new BranchGroup(); //Create the transform and&lt;br /&gt;
   *         group used for the rotation Transform3D rotateCube = new&lt;br /&gt;
   *         Transform3D( ); TransformGroup rotationGroup = new&lt;br /&gt;
   *         TransformGroup(rotateCube); //Set the capability so we can write&lt;br /&gt;
   *         the transform rotationGroup.setCapability(&lt;br /&gt;
   *         TransformGroup.ALLOW_TRANSFORM_WRITE); //Create the alpha&lt;br /&gt;
   *         generator Alpha rotationAlpha = new Alpha(&lt;br /&gt;
   *         -1,Alpha.INCREASING_ENABLE,0,0,4000,0,0,0,0,0); //Build the&lt;br /&gt;
   *         interpolator Transform3D yAxis = new Transform3D();&lt;br /&gt;
   *         RotationInterpolator rotator = new&lt;br /&gt;
   *         RotationInterpolator(rotationAlpha, rotationGroup, yAxis, 0.0f,&lt;br /&gt;
   *         (float) Math.PI*2.0f); BoundingSphere bounds = new&lt;br /&gt;
   *         BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);&lt;br /&gt;
   *         rotator.setSchedulingBounds(bounds); //Put all this together&lt;br /&gt;
   *         contentBranch.addChild(rotationGroup);&lt;br /&gt;
   *         rotationGroup.addChild(shape); rotationGroup.addChild(rotator);&lt;br /&gt;
   *         addLights(contentBranch); return contentBranch; } /** This&lt;br /&gt;
   *         creates the shape used in the program.&lt;br /&gt;
   * @return Node that is the switch node / protected Node buildShape() {&lt;br /&gt;
   *         Appearance app = new Appearance(); Color3f ambientColour = new&lt;br /&gt;
   *         Color3f(1.0f,0.0f,0.0f); Color3f emissiveColour = new&lt;br /&gt;
   *         Color3f(0.0f,0.0f,0.0f); Color3f specularColour = new&lt;br /&gt;
   *         Color3f(1.0f,1.0f,1.0f); Color3f diffuseColour = new&lt;br /&gt;
   *         Color3f(1.0f,0.0f,0.0f); float shininess = 20.0f;&lt;br /&gt;
   *         app.setMaterial(new Material(ambientColour,emissiveColour,&lt;br /&gt;
   *         diffuseColour,specularColour,shininess)); return new Box(2.0f,&lt;br /&gt;
   *         2.0f, 2.0f, app); } /** Process the button action to exit the&lt;br /&gt;
   *         program.&lt;br /&gt;
   */&lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    if (e.getSource() == exitButton) {&lt;br /&gt;
      dispose();&lt;br /&gt;
      System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public SimpleRotator() {&lt;br /&gt;
    VirtualUniverse myUniverse = new VirtualUniverse();&lt;br /&gt;
    Locale myLocale = new Locale(myUniverse);&lt;br /&gt;
    myLocale.addBranchGraph(buildViewBranch(myCanvas3D));&lt;br /&gt;
    //  myLocale.addBranchGraph(buildContentBranch(buildShape()));&lt;br /&gt;
    setTitle(&amp;quot;SimpleRotator&amp;quot;);&lt;br /&gt;
    setSize(400, 400);&lt;br /&gt;
    setLayout(new BorderLayout());&lt;br /&gt;
    Panel bottom = new Panel();&lt;br /&gt;
    bottom.add(exitButton);&lt;br /&gt;
    add(BorderLayout.CENTER, myCanvas3D);&lt;br /&gt;
    add(BorderLayout.SOUTH, bottom);&lt;br /&gt;
    exitButton.addActionListener(this);&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    SimpleRotator sr = new SimpleRotator();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>