<?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%2F3D_Surface</id>
		<title>Java/3D/3D Surface - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F3D%2F3D_Surface"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/3D/3D_Surface&amp;action=history"/>
		<updated>2026-04-21T15:53:48Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/3D/3D_Surface&amp;diff=6499&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/3D/3D_Surface&amp;diff=6499&amp;oldid=prev"/>
				<updated>2010-06-01T06:15:53Z</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/3D_Surface&amp;diff=6498&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/3D_Surface&amp;diff=6498&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;== Triangulate a planar surface ==&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.GraphicsConfigTemplate;&lt;br /&gt;
import java.awt.GraphicsDevice;&lt;br /&gt;
import java.awt.GraphicsEnvironment;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&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.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.GraphicsConfigTemplate3D;&lt;br /&gt;
import javax.media.j3d.Group;&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.PolygonAttributes;&lt;br /&gt;
import javax.media.j3d.RotationInterpolator;&lt;br /&gt;
import javax.media.j3d.Shape3D;&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.Vector3d;&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.GeometryInfo;&lt;br /&gt;
import com.sun.j3d.utils.geometry.NormalGenerator;&lt;br /&gt;
import com.sun.j3d.utils.geometry.Triangulator;&lt;br /&gt;
/**&lt;br /&gt;
 * This example illustrates using the Java 3D Triangulator and NormalGenerator&lt;br /&gt;
 * to triangulate a planar surface with a hole in it.&lt;br /&gt;
 */&lt;br /&gt;
public class TriangulatorTest extends Java3dApplet implements ActionListener {&lt;br /&gt;
  private static int m_kWidth = 400;&lt;br /&gt;
  private static int m_kHeight = 400;&lt;br /&gt;
  private double[] m_VertexArray = { 1, 1, 0, //0&lt;br /&gt;
      0, 3, 0, //1&lt;br /&gt;
      1, 5, 0, //2&lt;br /&gt;
      2, 4, 0, //3&lt;br /&gt;
      4, 5, 0, //4&lt;br /&gt;
      3, 3, 0, //5&lt;br /&gt;
      4, 2, 0, //6&lt;br /&gt;
      4, 0, 0, //7&lt;br /&gt;
      3, 0, 0, //8&lt;br /&gt;
      2, 1, 0, //9&lt;br /&gt;
      // these are vertices for the hole&lt;br /&gt;
      1, 3, 0, //10&lt;br /&gt;
      2, 3, 0, //11&lt;br /&gt;
      3, 2, 0, //12&lt;br /&gt;
      3, 1, 0, //13&lt;br /&gt;
      2, 2, 0 };//14&lt;br /&gt;
  public TriangulatorTest() {&lt;br /&gt;
    initJava3d();&lt;br /&gt;
  }&lt;br /&gt;
  public void actionPerformed(ActionEvent event) {&lt;br /&gt;
  }&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;
    TransformGroup objTrans = new TransformGroup();&lt;br /&gt;
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);&lt;br /&gt;
    Transform3D yAxis = new Transform3D();&lt;br /&gt;
    Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0,&lt;br /&gt;
        4000, 0, 0, 0, 0, 0);&lt;br /&gt;
    RotationInterpolator rotator = new RotationInterpolator(rotationAlpha,&lt;br /&gt;
        objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);&lt;br /&gt;
    BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),&lt;br /&gt;
        100.0);&lt;br /&gt;
    rotator.setSchedulingBounds(bounds);&lt;br /&gt;
    objTrans.addChild(rotator);&lt;br /&gt;
    // triangulate the polygon&lt;br /&gt;
    GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);&lt;br /&gt;
    gi.setCoordinates(m_VertexArray);&lt;br /&gt;
    int[] stripCountArray = { 10, 5 };&lt;br /&gt;
    int[] countourCountArray = { stripCountArray.length };&lt;br /&gt;
    gi.setContourCounts(countourCountArray);&lt;br /&gt;
    gi.setStripCounts(stripCountArray);&lt;br /&gt;
    Triangulator triangulator = new Triangulator();&lt;br /&gt;
    triangulator.triangulate(gi);&lt;br /&gt;
    NormalGenerator normalGenerator = new NormalGenerator();&lt;br /&gt;
    normalGenerator.generateNormals(gi);&lt;br /&gt;
    // create an appearance&lt;br /&gt;
    Appearance ap = new Appearance();&lt;br /&gt;
    // render as a wireframe&lt;br /&gt;
    PolygonAttributes polyAttrbutes = new PolygonAttributes();&lt;br /&gt;
    polyAttrbutes.setPolygonMode(PolygonAttributes.POLYGON_LINE);&lt;br /&gt;
    polyAttrbutes.setCullFace(PolygonAttributes.CULL_NONE);&lt;br /&gt;
    ap.setPolygonAttributes(polyAttrbutes);&lt;br /&gt;
    // add both a wireframe and a solid version&lt;br /&gt;
    // of the triangulated surface&lt;br /&gt;
    Shape3D shape1 = new Shape3D(gi.getGeometryArray(), ap);&lt;br /&gt;
    Shape3D shape2 = new Shape3D(gi.getGeometryArray());&lt;br /&gt;
    objTrans.addChild(shape1);&lt;br /&gt;
    objTrans.addChild(shape2);&lt;br /&gt;
    objRoot.addChild(objTrans);&lt;br /&gt;
    return objRoot;&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    TriangulatorTest triTest = new TriangulatorTest();&lt;br /&gt;
    triTest.saveCommandLineArguments(args);&lt;br /&gt;
    new MainFrame(triTest, m_kWidth, m_kHeight);&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;
== TwistStripApp demonstrates back face culling ==&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;
 * TwistStripApp.java 1.0 98/12/30&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.&lt;br /&gt;
 * &lt;br /&gt;
 * Sun grants you (&amp;quot;Licensee&amp;quot;) a non-exclusive, royalty free, license to use,&lt;br /&gt;
 * modify and redistribute this software in source and binary code form,&lt;br /&gt;
 * provided that i) this copyright notice and license appear on all copies of&lt;br /&gt;
 * the software; and ii) Licensee does not utilize the software in a manner&lt;br /&gt;
 * which is disparaging to Sun.&lt;br /&gt;
 * &lt;br /&gt;
 * This software is provided &amp;quot;AS IS,&amp;quot; without a warranty of any kind. ALL&lt;br /&gt;
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY&lt;br /&gt;
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR&lt;br /&gt;
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE&lt;br /&gt;
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING&lt;br /&gt;
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS&lt;br /&gt;
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,&lt;br /&gt;
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER&lt;br /&gt;
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF&lt;br /&gt;
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY&lt;br /&gt;
 * OF SUCH DAMAGES.&lt;br /&gt;
 * &lt;br /&gt;
 * This software is not designed or intended for use in on-line control of&lt;br /&gt;
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in&lt;br /&gt;
 * the design, construction, operation or maintenance of any nuclear facility.&lt;br /&gt;
 * Licensee represents and warrants that it will not use or redistribute the&lt;br /&gt;
 * Software for such purposes.&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * Getting Started with the Java 3D API written in Java 3D&lt;br /&gt;
 * &lt;br /&gt;
 * TwistStripApp.java demonstrates back face culling. A &amp;quot;twisted strip&amp;quot; is a&lt;br /&gt;
 * continuous surface with a two twists in it. (A Mobius strip has one twist)&lt;br /&gt;
 * The Class Strip creates a surface using a TriangleStripArray. A twist strip&lt;br /&gt;
 * is placed in a scene graph with a RotationInterpolator so the strip spins. As&lt;br /&gt;
 * the strip spins, when the back faces of the individual triangles face the&lt;br /&gt;
 * image plate, they disappear.&lt;br /&gt;
 * &lt;br /&gt;
 * One twisted strip is created using the inner class (Twist). This visual&lt;br /&gt;
 * object is rendered as filled polygons. A second twist visual object is made&lt;br /&gt;
 * from the same Geometry with a different Appearance to render as lines (only).&lt;br /&gt;
 * The line-only strip helps to see where the filled polygon strip is.&lt;br /&gt;
 */&lt;br /&gt;
import java.applet.Applet;&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Frame;&lt;br /&gt;
import javax.media.j3d.Alpha;&lt;br /&gt;
import javax.media.j3d.Appearance;&lt;br /&gt;
import javax.media.j3d.Background;&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.Geometry;&lt;br /&gt;
import javax.media.j3d.PolygonAttributes;&lt;br /&gt;
import javax.media.j3d.RotationInterpolator;&lt;br /&gt;
import javax.media.j3d.Shape3D;&lt;br /&gt;
import javax.media.j3d.TransformGroup;&lt;br /&gt;
import javax.media.j3d.TriangleStripArray;&lt;br /&gt;
import javax.vecmath.Color3f;&lt;br /&gt;
import javax.vecmath.Point3d;&lt;br /&gt;
import com.sun.j3d.utils.applet.MainFrame;&lt;br /&gt;
import com.sun.j3d.utils.universe.SimpleUniverse;&lt;br /&gt;
public class TwistStripApp extends Applet {&lt;br /&gt;
  /////////////////////////////////////////////////&lt;br /&gt;
  //&lt;br /&gt;
  // create Twist visual object&lt;br /&gt;
  //&lt;br /&gt;
  public class Twist extends Shape3D {&lt;br /&gt;
    ////////////////////////////////////////////&lt;br /&gt;
    //&lt;br /&gt;
    // create twist subgraph&lt;br /&gt;
    //&lt;br /&gt;
    public Twist() {&lt;br /&gt;
      this.setGeometry(createGeometry());&lt;br /&gt;
      this.setAppearance(createAppearance());&lt;br /&gt;
    } // end of twist constructor&lt;br /&gt;
    Geometry createGeometry() {&lt;br /&gt;
      TriangleStripArray twistStrip;&lt;br /&gt;
      Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);&lt;br /&gt;
      // create triangle strip for twist&lt;br /&gt;
      int N = 80;&lt;br /&gt;
      int stripCounts[] = { N };&lt;br /&gt;
      twistStrip = new TriangleStripArray(&lt;br /&gt;
          N,&lt;br /&gt;
          TriangleStripArray.COORDINATES | TriangleStripArray.COLOR_3,&lt;br /&gt;
          stripCounts);&lt;br /&gt;
      double a;&lt;br /&gt;
      int v;&lt;br /&gt;
      for (v = 0, a = 0.0; v &amp;lt; N; v += 2, a = v * 2.0 * Math.PI / (N - 2)) {&lt;br /&gt;
        twistStrip.setCoordinate(v, new Point3d(0.7 * Math.sin(a) + 0.2&lt;br /&gt;
            * Math.cos(a), 0.3 * Math.sin(a), 0.7 * Math.cos(a)&lt;br /&gt;
            + 0.2 * Math.cos(a)));&lt;br /&gt;
        twistStrip.setCoordinate(v + 1, new Point3d(0.7 * Math.sin(a)&lt;br /&gt;
            - 0.2 * Math.cos(a), -0.3 * Math.sin(a), 0.7&lt;br /&gt;
            * Math.cos(a) - 0.2 * Math.cos(a)));&lt;br /&gt;
        twistStrip.setColor(v, blue);&lt;br /&gt;
        twistStrip.setColor(v + 1, blue);&lt;br /&gt;
      }&lt;br /&gt;
      return twistStrip;&lt;br /&gt;
    }&lt;br /&gt;
    // create Appearance for Twist Strip&lt;br /&gt;
    //&lt;br /&gt;
    // this method creates the default Appearance for the&lt;br /&gt;
    // twist strip. The commented line of code containting&lt;br /&gt;
    // the setCullFace will fix the problem of half of the&lt;br /&gt;
    // Twisted Strip disappearing.&lt;br /&gt;
    Appearance createAppearance() {&lt;br /&gt;
      Appearance twistAppear = new Appearance();&lt;br /&gt;
      PolygonAttributes polyAttrib = new PolygonAttributes();&lt;br /&gt;
      // polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);&lt;br /&gt;
      twistAppear.setPolygonAttributes(polyAttrib);&lt;br /&gt;
      return twistAppear;&lt;br /&gt;
    }&lt;br /&gt;
  } // end of class Twist&lt;br /&gt;
  /////////////////////////////////////////////////&lt;br /&gt;
  //&lt;br /&gt;
  // create scene graph branch group&lt;br /&gt;
  //&lt;br /&gt;
  public BranchGroup createSceneGraph() {&lt;br /&gt;
    BranchGroup contentRoot = new BranchGroup();&lt;br /&gt;
    // Create the transform group node and initialize it to the&lt;br /&gt;
    // identity. Add it to the root of the subgraph.&lt;br /&gt;
    TransformGroup objSpin = new TransformGroup();&lt;br /&gt;
    objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);&lt;br /&gt;
    contentRoot.addChild(objSpin);&lt;br /&gt;
    Shape3D twist = new Twist();&lt;br /&gt;
    objSpin.addChild(twist);&lt;br /&gt;
    // Duplicate the twist strip geometry and set the&lt;br /&gt;
    // appearance of the new Shape3D object to line mode&lt;br /&gt;
    // without culling.&lt;br /&gt;
    // Add the POLYGON_FILLED and POLYGON_LINE strips&lt;br /&gt;
    // in the scene graph at the same point.&lt;br /&gt;
    // This will show the triangles of the original Mobius strip that&lt;br /&gt;
    // are clipped. The PolygonOffset is set to prevent stitching.&lt;br /&gt;
    PolygonAttributes polyAttrib = new PolygonAttributes();&lt;br /&gt;
    polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);&lt;br /&gt;
    polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);&lt;br /&gt;
    polyAttrib.setPolygonOffset(0.001f);&lt;br /&gt;
    Appearance polyAppear = new Appearance();&lt;br /&gt;
    polyAppear.setPolygonAttributes(polyAttrib);&lt;br /&gt;
    objSpin.addChild(new Shape3D(twist.getGeometry(), polyAppear));&lt;br /&gt;
    Alpha rotationAlpha = new Alpha(-1, 16000);&lt;br /&gt;
    RotationInterpolator rotator = new RotationInterpolator(rotationAlpha,&lt;br /&gt;
        objSpin);&lt;br /&gt;
    // a bounding sphere specifies a region a behavior is active&lt;br /&gt;
    // create a sphere centered at the origin with radius of 1&lt;br /&gt;
    BoundingSphere bounds = new BoundingSphere();&lt;br /&gt;
    rotator.setSchedulingBounds(bounds);&lt;br /&gt;
    objSpin.addChild(rotator);&lt;br /&gt;
    // make background white&lt;br /&gt;
    Background background = new Background(1.0f, 1.0f, 1.0f);&lt;br /&gt;
    background.setApplicationBounds(bounds);&lt;br /&gt;
    contentRoot.addChild(background);&lt;br /&gt;
    // Let Java 3D perform optimizations on this scene graph.&lt;br /&gt;
    contentRoot.rupile();&lt;br /&gt;
    return contentRoot;&lt;br /&gt;
  } // end of CreateSceneGraph method of TwistStripApp&lt;br /&gt;
  // Create a simple scene and attach it to the virtual universe&lt;br /&gt;
  public TwistStripApp() {&lt;br /&gt;
    setLayout(new BorderLayout());&lt;br /&gt;
    Canvas3D canvas3D = new Canvas3D(null);&lt;br /&gt;
    add(&amp;quot;Center&amp;quot;, canvas3D);&lt;br /&gt;
    BranchGroup scene = createSceneGraph();&lt;br /&gt;
    // SimpleUniverse is a Convenience Utility class&lt;br /&gt;
    SimpleUniverse simpleU = new SimpleUniverse(canvas3D);&lt;br /&gt;
    // This will move the ViewPlatform back a bit so the&lt;br /&gt;
    // objects in the scene can be viewed.&lt;br /&gt;
    simpleU.getViewingPlatform().setNominalViewingTransform();&lt;br /&gt;
    simpleU.addBranchGraph(scene);&lt;br /&gt;
  } // end of TwistStripApp constructor&lt;br /&gt;
  //  The following method allows this to be run as an application&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    System.out.println(&amp;quot;TwistStripApp - Java 3D API version 1.1&amp;quot;);&lt;br /&gt;
    System.out.print(&amp;quot;See \&amp;quot;Getting Started with the Java 3D API\&amp;quot;&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; (section 2.6)&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;This program demonstrates back face culling.&amp;quot;);&lt;br /&gt;
    System.out.print(&amp;quot;In this program two visual objects rotate, &amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;one wireframe and one solid surface.&amp;quot;);&lt;br /&gt;
    System.out.print(&amp;quot;The wire frame is visible only when components&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; of the surface are culled.&amp;quot;);&lt;br /&gt;
    Frame frame = new MainFrame(new TwistStripApp(), 256, 256);&lt;br /&gt;
  } // end of main method of TwistStripApp&lt;br /&gt;
} // end of class TwistStripApp&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>