|
||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||
java.lang.Objectde.grogra.vecmath.geom.VolumeBase
de.grogra.vecmath.geom.MeshVolume
public class MeshVolume
This class represents a given Mesh
as a Volume. It uses an octree
in order to speed up the intersection computation; an octree
cell contains a list of those polygons of the mesh which lie within
the cell.
The algorithm for a single polygon-line intersection is an extension to general polygonal meshes (with convex, planar polygons) of the algorithm in the paper "Ray Tracing Triangular Meshes" of John Amanatides and Kin Choi. The algorithm uses Plücker coordinates to decide if a line intersects a polygon.
The mesh coordinates are specified in their own coordinate system.
The transformation from world coordinates to mesh coordinates is
implemented by worldToMesh. The advantage of this is that
it is possible to create a set of copies of a MeshVolume
using dup() which can then be shifted to another location
using setTransformation(Matrix4d).
To set the data of a MeshVolume, both methods
setMesh(de.grogra.vecmath.geom.Mesh) and setTransformation(javax.vecmath.Matrix4d) have to be invoked
in this order.
| Field Summary | |
|---|---|
static int |
MIN_CELL_OBJECTS
Minimum number of polygons which have to be present in an octree cell so that it is considered for subdivision. |
| Constructor Summary | |
|---|---|
MeshVolume()
|
|
| Method Summary | |
|---|---|
boolean |
boxContainsBoundary(BoundingBox box,
Tuple3d center,
double radius,
Variables temp)
Returns true if the specified box contains
(part of) the boundary surface of this volume. |
void |
computeFaceNormal(Intersection is,
Vector3d normal)
Compute the face normal of the triangle that was hit (is.face). |
boolean |
computeIntersections(Line line,
int which,
IntersectionList list,
Intersection excludeStart,
Intersection excludeEnd)
Computes intersections between the boundary surface of this object and the specified line. |
void |
computeNormal(Intersection is,
Vector3d normal)
This method computes the unit normal vector of an intersection is which has been computed previously by the invocation
of Volume.computeIntersections(de.grogra.vecmath.geom.Line, int, de.grogra.vecmath.geom.IntersectionList, de.grogra.vecmath.geom.Intersection, de.grogra.vecmath.geom.Intersection) on this volume. |
void |
computeTangents(Intersection is,
Vector3d dpdu,
Vector3d dpdv)
This method computes the derivatives of the surface point (as function of the uv-coordinates, see Volume.computeUV(de.grogra.vecmath.geom.Intersection, javax.vecmath.Vector2d))
with respect to u and v at the intersection point. |
void |
computeUV(Intersection is,
Vector2d uv)
This method computes the uv-coordinates of an intersection point is which has been computed previously by the invocation
of Volume.computeIntersections(de.grogra.vecmath.geom.Line, int, de.grogra.vecmath.geom.IntersectionList, de.grogra.vecmath.geom.Intersection, de.grogra.vecmath.geom.Intersection) on this volume. |
boolean |
contains(Tuple3d point,
boolean open)
Determines if the given point lies within this object. |
MeshVolume |
dup()
Creates a duplicate of this mesh. |
void |
getExtent(Tuple3d min,
Tuple3d max,
Variables temp)
Computes the extent of this volume, i.e., an axis-aligned bounding box between min and max. |
Octree |
getOctree()
|
int |
getPolygonCount()
|
void |
setMesh(Mesh mesh)
Sets the mesh of this volume to the specified mesh. |
void |
setTransformation(Matrix4d meshToWorld)
Sets the transformation from mesh coordinates to global world coordinates. |
| Methods inherited from class de.grogra.vecmath.geom.VolumeBase |
|---|
addConvexIntersections, getId, operator$and, operator$com, operator$or, operator$sub, setId |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public static int MIN_CELL_OBJECTS
| Constructor Detail |
|---|
public MeshVolume()
| Method Detail |
|---|
public boolean boxContainsBoundary(BoundingBox box,
Tuple3d center,
double radius,
Variables temp)
Volumetrue if the specified box contains
(part of) the boundary surface of this volume. Otherwise, if box and
boundary do not overlap, this method should return false,
but may also return true if an exact computation
would be too expensive or complicated.
Note that a box contains the boundary of a closed set S iff both have a non-empty intersection and the box is not contained in the open set of S.
boxContainsBoundary in interface Volumebox - bounding boxcenter - center coordinates of boxradius - radius of enclosing spheretemp - has to be provided by the invoker, may be used in implementations
true if box contains (part of) the boundary of this volume
public void computeFaceNormal(Intersection is,
Vector3d normal)
is - intersection between this volume and a raynormal - output memory for computed normal vector
public boolean computeIntersections(Line line,
int which,
IntersectionList list,
Intersection excludeStart,
Intersection excludeEnd)
Volumeline. The intersections are added
to list in ascending order of distance
(i.e., of Intersection.parameter), where the
parameter has to lie between line.start
and line.end.
Implementations of this method must not
clear or modify the existing intersections in list.
The parameter which has to be one of
Intersection.ALL, Intersection.CLOSEST,
Intersection.ANY. It determines if all intersections
have to be added to the list, only the closest (minimal
value of Intersection.parameter), or an arbitrary
of the set of all intersections. Only in case of ALL,
the return value of this method is precise.
If specific intersection points should be excluded from the list
of computed intersections, they have to be specified in
excludeStart and excludeEnd.
The intersection point of excludeStart has to be the
starting point of line, the intersection point of
excludeEnd has to be the end point of line.
The exclusion of intersections is a useful feature for
ray-tracing, e.g., when a ray is re-emitted at an intersection point
in another direction.
computeIntersections in interface Volumeline - a linewhich - one of Intersection.ALL,
Intersection.CLOSEST, Intersection.ANY, this
determines which intersections have to be added to listlist - the intersections are added to this listexcludeStart - intersection at start point which shall be excluded, or nullexcludeEnd - intersection at end point which shall be excluded, or null
true iff the beginning of the line lies
within the volume (i.e., if the line starts within the volume or
enters the volume at the starting point); however note that the returned
value is valid only if which == Intersection.ALL
public void computeNormal(Intersection is,
Vector3d normal)
Volumeis which has been computed previously by the invocation
of Volume.computeIntersections(de.grogra.vecmath.geom.Line, int, de.grogra.vecmath.geom.IntersectionList, de.grogra.vecmath.geom.Intersection, de.grogra.vecmath.geom.Intersection) on this volume.
computeNormal in interface Volumeis - a previously computed intersectionnormal - resulting unit vector is placed in here
public void computeTangents(Intersection is,
Vector3d dpdu,
Vector3d dpdv)
VolumeVolume.computeUV(de.grogra.vecmath.geom.Intersection, javax.vecmath.Vector2d))
with respect to u and v at the intersection point.
computeTangents in interface Volumeis - a previously computed intersectiondpdu - resulting derivative with respect to udpdv - resulting derivative with respect to v
public void computeUV(Intersection is,
Vector2d uv)
Volumeis which has been computed previously by the invocation
of Volume.computeIntersections(de.grogra.vecmath.geom.Line, int, de.grogra.vecmath.geom.IntersectionList, de.grogra.vecmath.geom.Intersection, de.grogra.vecmath.geom.Intersection) on this volume.
computeUV in interface Volumeis - a previously computed intersectionuv - resulting uv-coordinates are placed in here
public boolean contains(Tuple3d point,
boolean open)
Volumepoint lies within this object.
If open is true, the interior of the volume
is considered (the largest open set contained in the volume,
i.e., excluding the boundary), otherwise the closure of the volume.
contains in interface Volumepoint - a point in global world coordinatesopen - consider open or closed set
true iff point is an element of the setpublic MeshVolume dup()
setTransformation(Matrix4d).
public void getExtent(Tuple3d min,
Tuple3d max,
Variables temp)
Volumemin and max.
getExtent in interface Volumemin - minimum coordinates of bounding box are placed in heremax - maximum coordinates of bounding box are placed in heretemp - has to be provided by the invoker, may be used in implementationspublic Octree getOctree()
public int getPolygonCount()
public void setMesh(Mesh mesh)
mesh.
All data is copied, no persistent reference
to mesh is made. The method
setTransformation(javax.vecmath.Matrix4d) has to be invoked afterwards to specify
the global coordinate transformation.
mesh - a meshpublic void setTransformation(Matrix4d meshToWorld)
meshToWorld - transformation matrix
|
||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||