construction
Class Block

java.lang.Object
  extended byjavax.media.j3d.SceneGraphObject
      extended byjavax.media.j3d.Node
          extended byjavax.media.j3d.Group
              extended byconstruction.Block

public class Block
extends javax.media.j3d.Group

Ein Block ist ein n-eckiger Körper, wobei n eine gerade, ganzzahlige Zahl grösser 5 ist. Ein Block besteht aus einem Boden und einer Decke. Boden und Decke sind zwei ebene, nicht-konvexe Polygone. Beide Polygone haben die selbe Anzahl an Ecken. Zwischen den jeweiligen Kanten der beiden Polygone werden Vierecke aufgespannt, wobei alle vier Ecken in der selben Ebene liegen. Die Seiten eines Blocks schneiden sich nicht. Ein Block kann positiv oder negativ sein. Wenn ein Block positiv ist, so kann er von Außen betrachtet werden. Das Innere des Blocks ist also nicht sichtbar. Befindet man sich jedoch innerhalb des Blocks, kann man nach Außen blicken. Der Block selbst ist dann nicht sichtbar. Ist ein Block negativ, so kann man von Außen in ihn hineinblicken. Befindet man sich innerhalb des Blocks, so sieht man nur den Block. Alles außerhalb des Blocks ist nicht sichtbar. Mehrere Blöcke können miteinander verbunden werden, wobei sie jedoch unterschiedlich ausgerichtete (positiv/negativ) sein müssen. Auf diese Weise ist es z.B. möglich in einen positiven Block ein Loch zu schneiden, indem er mit einem negativen Block verbunden wird. Durch diese Methodik wird eine geringe CSG (Constructive Solid Geometry) Funktionalität ermöglicht.

Version:
1.0 (2005/01/31)
Author:
Martin Hedler

Field Summary
static int NEGATIVE
          Der Block ist negativ.
static int POSITIVE
          Der Block ist positiv.
 
Fields inherited from class javax.media.j3d.Group
ALLOW_CHILDREN_EXTEND, ALLOW_CHILDREN_READ, ALLOW_CHILDREN_WRITE, ALLOW_COLLISION_BOUNDS_READ, ALLOW_COLLISION_BOUNDS_WRITE
 
Fields inherited from class javax.media.j3d.Node
ALLOW_AUTO_COMPUTE_BOUNDS_READ, ALLOW_AUTO_COMPUTE_BOUNDS_WRITE, ALLOW_BOUNDS_READ, ALLOW_BOUNDS_WRITE, ALLOW_COLLIDABLE_READ, ALLOW_COLLIDABLE_WRITE, ALLOW_LOCAL_TO_VWORLD_READ, ALLOW_PICKABLE_READ, ALLOW_PICKABLE_WRITE, ENABLE_COLLISION_REPORTING, ENABLE_PICK_REPORTING
 
Constructor Summary
Block(javax.vecmath.Point3f[] floorPoint, javax.vecmath.Point3f[] ceilingPoint)
          Legt einen Block mit Boden, Decke und Wänden an.
 
Method Summary
 javax.media.j3d.Node cloneNode(boolean forceDuplicate)
           
 boolean connect(Block other, javax.media.j3d.Transform3D otherTransform)
          Verbindet zwei Blöcke miteinander.
 void duplicateNode(javax.media.j3d.Node orgNode, boolean forceDuplicate)
           
 Plane getPlane(int index)
          Gibt die Plane mit dem übergebenen Index zurück.
 java.util.Iterator getPlanes()
          Gibt einen Iterator zurück, der alle Planes des Blocks enthält.
 int getVolumeState()
          Gibt den Volumenstatus des Blocks zurück.
 boolean isContact(Block other, javax.media.j3d.Transform3D otherTransform)
          Ermittelt ob dieser Block mit dem übergebenen Block in Kontakt steht.
 int numPlanes()
          Gibt die Anzahl der Planes des Blocks zurück.
 void setPlaneTexture(javax.media.j3d.Texture[] texture)
          Setzt alle Texturen des Blocks.
 
Methods inherited from class javax.media.j3d.Group
addChild, getAllChildren, getAlternateCollisionTarget, getChild, getCollisionBounds, indexOfChild, insertChild, moveTo, numChildren, removeAllChildren, removeChild, removeChild, setAlternateCollisionTarget, setChild, setCollisionBounds
 
Methods inherited from class javax.media.j3d.Node
cloneTree, cloneTree, cloneTree, cloneTree, cloneTree, cloneTree, getBounds, getBoundsAutoCompute, getCollidable, getLocalToVworld, getLocalToVworld, getParent, getPickable, setBounds, setBoundsAutoCompute, setCollidable, setPickable
 
Methods inherited from class javax.media.j3d.SceneGraphObject
clearCapability, clearCapabilityIsFrequent, getCapability, getCapabilityIsFrequent, getUserData, isCompiled, isLive, setCapability, setCapabilityIsFrequent, setUserData, updateNodeReferences
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

POSITIVE

public static final int POSITIVE
Der Block ist positiv.

See Also:
Constant Field Values

NEGATIVE

public static final int NEGATIVE
Der Block ist negativ.

See Also:
Constant Field Values
Constructor Detail

Block

public Block(javax.vecmath.Point3f[] floorPoint,
             javax.vecmath.Point3f[] ceilingPoint)
      throws java.lang.IllegalArgumentException
Legt einen Block mit Boden, Decke und Wänden an. Ein Block ist definiert durch die Eckpunkte seines Bodens und seiner Decke. Die Richtung in der die Eckpunkte bei der Definition angeordnet sind, muss bei beiden Punktlisten übereinstimmen, also entweder beide im oder gegen den Uhrzeigersinn angeordnet sein. Sind die Punkte gegen den Uhrzeigersinn angeordnet, ist der Block negativ, sonst positiv. Diese Definition gilt, wenn der Block von oben betrachtet wird.

Boden und Decke künnen unterschiedlich geform sein, jedoch dürfen sich die beiden Polygone nicht schneiden, ebensowenig wie die Wände, die zwischen ihnen aufgespannt werden. Die Wände sind Vierecke, deren vier Punkte alle in der selben Ebene liegen müssen.

Parameters:
floorPoint - Punktarray, welche das Bodenpolygon beschreibt.
ceilingPoint - Punktarray, welche das Deckenpolygon beschreibt.
Throws:
java.lang.IllegalArgumentException - Wenn die Anzahl der Punkte in den beiden Listen nicht übereinstimmt.
Method Detail

getPlanes

public java.util.Iterator getPlanes()
Gibt einen Iterator zurück, der alle Planes des Blocks enthält.

Returns:
Der Iterator.

getPlane

public Plane getPlane(int index)
               throws java.lang.IndexOutOfBoundsException
Gibt die Plane mit dem übergebenen Index zurück. Die Plane mit dem Index 0 ist der Boden. Die Plane mit dem Index 1 ist die Decke. Alle nachfolgenden Planes sind Wände.

Parameters:
index - Index der gewündschten Plane.
Returns:
Die Plane mit dem angegebenen Index.
Throws:
java.lang.IndexOutOfBoundsException - Wenn der Index ausserhalb des zulässigen Bereichs ist.

getVolumeState

public int getVolumeState()
Gibt den Volumenstatus des Blocks zurück.

Returns:
POSITIVE, wenn der Block von Außen sichtbar oder NEGATIVE, wenn der Block von Innen sichtbar ist.

setPlaneTexture

public void setPlaneTexture(javax.media.j3d.Texture[] texture)
Setzt alle Texturen des Blocks. Alle bereits gesetzten Texturen werden überschrieben. Um die Texturen für einzelne Planes zu setzen, können die Funktionen getPlanes() und getPlane(int) verwendet werden.

Parameters:
texture - Array von Texturen. Die Anzahl der Texturen im Array bestimmt für was die Texturen verwendet werden:
  • Befindet sich nur eine Textur im Array, so wird die Textur für alle Wände, den Boden und die Decke verwendet.
  • Befinden sich zwei Texturen im Array, so wird die erste Textur für den Boden und die Decke verwendet und die zweite Textur für alle Wände.
  • Bei drei Texturen, wird die erste Textur für den Boden, die zweite Textur für die Decke und die dritte Textur für alle Wände verwendet.
Bei mehr als drei Texturen, findet der dritte Fall Anwendung und alle weiteren Texturen werden ignoriert.
See Also:
getPlanes(), getPlane(int)

connect

public boolean connect(Block other,
                       javax.media.j3d.Transform3D otherTransform)
                throws java.lang.IllegalArgumentException
Verbindet zwei Blöcke miteinander. Zwei Blöcke werden dann miteinander verbunden, wenn mindestens eine Plane dieses Blocks mit mindestens einer Plane von other in Kontakt steht, d.h. dass die beiden Planes parallel zueinander sind, in der selben Ebene liegen und sich überschneiden.
Steht keine Plane mit einer anderen in Kontakt, kommt es nicht zu einer Verbindung.

Parameters:
other - Block, mit dem dieser Block verbunden werden soll.
otherTransform - Transformation bezüglich des lokalen Koordinatensystems von this, welche auf other angewendet wird.
Returns:
true, wenn die beiden Blöcke miteinander verbunden wurden, sonst false.
Throws:
java.lang.IllegalArgumentException

isContact

public boolean isContact(Block other,
                         javax.media.j3d.Transform3D otherTransform)
Ermittelt ob dieser Block mit dem übergebenen Block in Kontakt steht.

Parameters:
other - Der zu überprüfende Block.
otherTransform - Transformation bezüglich des lokalen Koordinatensystems von this, welche auf other angewendet wird.
Returns:
true, wenn die beide Blöcke miteinander in Kontakt stehen, sonst false.

numPlanes

public int numPlanes()
Gibt die Anzahl der Planes des Blocks zurück.


cloneNode

public javax.media.j3d.Node cloneNode(boolean forceDuplicate)

duplicateNode

public void duplicateNode(javax.media.j3d.Node orgNode,
                          boolean forceDuplicate)