Class TransformedPortrayal3D

java.lang.Object
sim.portrayal3d.SimplePortrayal3D
sim.portrayal3d.simple.TransformedPortrayal3D
All Implemented Interfaces:
Portrayal, Portrayal3D

public class TransformedPortrayal3D extends SimplePortrayal3D
A wrapper for other Portrayal3Ds which transforms them with an underlying Transform3D: meaning that you can rotate them, translate them, scale them, etc. When you create this TransformedPortrayal3D, you will pass in an underlying Portrayal3D which is supposed to represent the actual object; TransformedPortrayal3D will then transform it as requested. If the object will draw itself (it's its own Portrayal3D), you can signify this by passing in null for the underlying Portrayal3D.

You can provide a Transform3D with the child if you like. Otherwise a default Transform3D (which does nothing) will be provided. From there you can further rotate, translate, or scale the underlying Transform3D using the provided functions. This is essentially equivalent to the similar features provided in FieldPortrayal3Ds and in Display3D for transforming Fields or the entire scene.

If you change the transform at any time through the provided functions, the underlying models will be updated appropriately.

  • Constructor Details

    • TransformedPortrayal3D

      public TransformedPortrayal3D(SimplePortrayal3D child, javax.media.j3d.Transform3D transform)
    • TransformedPortrayal3D

      public TransformedPortrayal3D(SimplePortrayal3D child)
  • Method Details

    • polygonAttributes

      public javax.media.j3d.PolygonAttributes polygonAttributes()
      Description copied from interface: Portrayal3D
      Provides a PolygonAttributes which can be modified to change the underlying model's attributes (culling, vertex versus point versus fill). This is an optional function: you are free to return null
      Specified by:
      polygonAttributes in interface Portrayal3D
      Overrides:
      polygonAttributes in class SimplePortrayal3D
    • getInspector

      public Inspector getInspector(LocationWrapper wrapper, GUIState state)
      Description copied from interface: Portrayal
      Provide an inspector for an object.
      Specified by:
      getInspector in interface Portrayal
      Overrides:
      getInspector in class SimplePortrayal3D
    • getName

      public String getName(LocationWrapper wrapper)
      Description copied from interface: Portrayal
      Returns a static, one-line name for the given object that is useful for a human to distinguish it from other objects. A simple default would be just to return "" + object.
      Specified by:
      getName in interface Portrayal
      Overrides:
      getName in class SimplePortrayal3D
    • setCurrentDisplay

      public void setCurrentDisplay(Display3D display)
      Sets the current display both here and in the child.
      Specified by:
      setCurrentDisplay in interface Portrayal3D
      Overrides:
      setCurrentDisplay in class SimplePortrayal3D
    • setCurrentFieldPortrayal

      public void setCurrentFieldPortrayal(FieldPortrayal3D p)
      Sets the current field portrayal both here and in the child.
      Overrides:
      setCurrentFieldPortrayal in class SimplePortrayal3D
    • setSelected

      public boolean setSelected(LocationWrapper wrapper, boolean selected)
      Description copied from class: SimplePortrayal3D
      If the object is selected, adds it to a hash table of selected objects for which this SimplePortrayal3D's isSelected() method will return TRUE. If the object is deselected, removes it from the hash table. Always returns TRUE. The hash table doesn't exist until this method is first called.

      There are two implications to this approach. First, it means that after you've selected an object, there's a hash table attached to its portrayal. If you're using the same portrayal for lots of stuff, that's no big deal. But if you've got per-object portrayals and a lot of objects (or if the objects are themselves SimplePortrayal3D subclasses) then that's a fair number of hash tables. This is a minor memory issue but if you don't care about testing for whether you've been selected or not, you could just override this method to always return TRUE (and don't call super.selected(...) ) and the hash table will never be created. Note that isSelected will always return FALSE for your portrayal in this situation.

      Second, though you can test for selection with the isSelected() method, if you want to, say, change the look of your portrayal based on whether or not it's selected, you will need to test isSelected() each time getModel() is called and modify the model accordingly. This could be a bit expensive. We're working on an approach for you to be able to test if the object was RECENTLY selected or deselected so you could only test then, but it's nontrivial to do without using up a lot of memory.

      Specified by:
      setSelected in interface Portrayal
      Overrides:
      setSelected in class SimplePortrayal3D
    • getChild

      public SimplePortrayal3D getChild(Object object)
    • getModel

      public javax.media.j3d.TransformGroup getModel(Object obj, javax.media.j3d.TransformGroup previousTransformGroup)
      Description copied from interface: Portrayal3D
      Provides a TransformGroup which defines the node(s) to place in the scenegraph. This is the Portrayal3D equivalent of Portrayal2D's draw(object, graphics, drawinfo) method.

      You should hang your model off of the TransformGroup provided. You should not transform that TransformGroup in any way -- it is used elsewhere. Instead if you wish to transform your model (rotate it etc.) you should add your own additional TransformGroup as necessary.

      The provided TransformGroup can be null; in this case you need to create and return the outer TransformGroup for the object. If the provided TransformGroup is non-null, you should modify it and return the same.

      SimplePortrayals should assume the following contract: at the point that getModel(...) is called, the field portrayal and display will have already been set if it exists, else it will be null.

      Specified by:
      getModel in interface Portrayal3D
      Overrides:
      getModel in class SimplePortrayal3D
    • setTransform

      public void setTransform(javax.media.j3d.Transform3D transform)
      Sets the TransformedPortrayal3D's internal Transform. This is a user-modifiable transform which should be used primarily to adjust the location of the TransformedPortrayal3D relative to other TransformedPortrayal3D objects. If null is provided, then the value of getDefaultTransform() is used.
    • getDefaultTransform

      public javax.media.j3d.Transform3D getDefaultTransform()
      Returns the default internal transform suggested for this TransformedPortrayal3D.
    • getTransform

      public javax.media.j3d.Transform3D getTransform()
      Returns a copy of the current internal transform for the TransformedPortrayal3D.
    • transform

      public void transform(javax.media.j3d.Transform3D transform)
      Changes the internal transform of the TransformedPortrayal3D by appending to it the provided transform operation.
    • resetTransform

      public void resetTransform()
      Resets the internal transform to the value of getDefaultTransform()
    • rotateX

      public void rotateX(double degrees)
      Modifies the internal transform by rotating along the current X axis the provided number of degrees.
    • rotateY

      public void rotateY(double degrees)
      Modifies the internal transform by rotating along the current Y axis the provided number of degrees.
    • rotateZ

      public void rotateZ(double degrees)
      Modifies the internal transform by rotating along the current Z axis the provided number of degrees.
    • translate

      public void translate(double dx, double dy, double dz)
      Modifies the internal transform by translating in the provided x, y, and z amounts.
    • scale

      public void scale(double value)
      Modifies the internal transform by uniformly scaling it in all directions by the provided amount.
    • scale

      public void scale(double sx, double sy, double sz)
      Modifies the internal transform by scaling it in a nonuniform fashion. Note that this is less efficient than a uniform scale