Field3D
|
Represents the mapping of a field by a matrix transform. More...
#include <FieldMapping.h>
Public Types | |
typedef MatrixFieldMapping | class_type |
typedef Curve< Imath::M44d > | MatrixCurve |
Time-varying matrix. | |
typedef boost::intrusive_ptr < MatrixFieldMapping > | Ptr |
Convenience typedef. | |
Public Member Functions | |
const M44d & | localToWorld () const |
Returns a reference to the local to world transform. | |
const MatrixCurve::SampleVec & | localToWorldSamples () const |
Returns a vector of all motion samples for local to world transform. | |
void | makeIdentity () |
Sets the transform to identity. This makes it functionally equivalent to a NullFieldMapping. | |
void | setLocalToWorld (float t, const M44d &lsToWs) |
Sets the local to world transform at a given time. | |
void | setLocalToWorld (const M44d &lsToWs) |
Sets the local to world transform. All other matrices will be updated based on this. | |
const M44d & | voxelToWorld () const |
Returns a reference to the voxel to world space transform. | |
const M44d & | worldToVoxel () const |
Returns a reference to the world to voxel space transform. | |
Constructors & destructor | |
MatrixFieldMapping () | |
MatrixFieldMapping (const Box3i &extents) | |
From FieldMapping | |
virtual void | worldToVoxel (const V3d &wsP, V3d &vsP) const |
Transform from world space position into voxel space. | |
virtual void | worldToVoxel (const V3d &wsP, V3d &vsP, float time) const |
virtual void | voxelToWorld (const V3d &vsP, V3d &wsP) const |
Transform from voxel space position into world space. | |
virtual void | voxelToWorld (const V3d &vsP, V3d &wsP, float time) const |
virtual void | worldToLocal (const V3d &wsP, V3d &lsP) const |
Transform from world space position into local space. | |
virtual void | worldToLocal (const V3d &wsP, V3d &lsP, float time) const |
virtual void | localToWorld (const V3d &lsP, V3d &wsP) const |
Transform from local space position into world space. | |
virtual void | localToWorld (const V3d &lsP, V3d &wsP, float time) const |
void | worldToVoxelDir (const V3d &wsV, V3d &vsV) const |
void | voxelToWorldDir (const V3d &vsV, V3d &wsV) const |
void | worldToLocalDir (const V3d &wsV, V3d &lsV) const |
void | localToWorldDir (const V3d &lsV, V3d &wsV) const |
virtual void | extentsChanged () |
Implement this if the subclass needs to update itself when the resolution changes. | |
virtual std::string | className () const |
Returns the FieldMapping type name. Used when writing/reading from disk. | |
virtual bool | isIdentical (FieldMapping::Ptr other, double tolerance=0.0) const |
Whether the mapping is identical to another mapping. | |
virtual V3d | wsVoxelSize (int, int, int) const |
Returns world-space size of a voxel at the specified coordinate. | |
virtual FieldMapping::Ptr | clone () const |
Returns a pointer to a copy of the mapping, pure virtual so ensure derived classes properly implement it. | |
Static Public Member Functions | |
static const char * | classType () |
Public Attributes | |
DEFINE_FIELD_RTTI_CONCRETE_CLASS | |
Private Types | |
typedef FieldMapping | base |
Convenience typedef for referring to base class. | |
Private Member Functions | |
void | getLocalToVoxelMatrix (M44d &result) |
void | updateTransform () |
Updates the local to world transformation matrix. | |
Private Attributes | |
bool | m_isTimeVarying |
Stores whether the curve has more than one time sample. | |
M44d | m_lsToWs |
Local space to world space. | |
MatrixCurve | m_lsToWsCurve |
Time-varying local to world space transform. | |
M44d | m_vsToWs |
Voxel space to world space. | |
MatrixCurve | m_vsToWsCurve |
Time-varying voxel to world space transform. | |
M44d | m_wsToLs |
World space to local space. | |
M44d | m_wsToVs |
World space to voxel space. | |
V3d | m_wsVoxelSize |
Precomputed world-space voxel size. Calculations may assume orthogonal transformation for efficiency. |
Represents the mapping of a field by a matrix transform.
Refer to using_mappings for examples of how to use this in your code.
Definition at line 316 of file FieldMapping.h.
typedef boost::intrusive_ptr<MatrixFieldMapping> MatrixFieldMapping::Ptr |
Convenience typedef.
Reimplemented from FieldMapping.
Definition at line 323 of file FieldMapping.h.
Time-varying matrix.
Definition at line 325 of file FieldMapping.h.
Reimplemented from FieldMapping.
Definition at line 329 of file FieldMapping.h.
typedef FieldMapping MatrixFieldMapping::base [private] |
Convenience typedef for referring to base class.
Reimplemented from FieldMapping.
Definition at line 502 of file FieldMapping.h.
MatrixFieldMapping::MatrixFieldMapping | ( | ) |
Definition at line 196 of file FieldMapping.cpp.
References makeIdentity().
Referenced by clone().
: FieldMapping() { makeIdentity(); }
MatrixFieldMapping::MatrixFieldMapping | ( | const Box3i & | extents | ) |
Definition at line 204 of file FieldMapping.cpp.
References makeIdentity().
: FieldMapping(extents) { makeIdentity(); }
static const char* MatrixFieldMapping::classType | ( | ) | [inline, static] |
Reimplemented from FieldMapping.
Definition at line 332 of file FieldMapping.h.
Referenced by className().
{ return "MatrixFieldMapping"; }
void MatrixFieldMapping::setLocalToWorld | ( | const M44d & | lsToWs | ) |
Sets the local to world transform. All other matrices will be updated based on this.
Definition at line 212 of file FieldMapping.cpp.
References m_lsToWsCurve, makeIdentity(), and Curve< T >::numSamples().
{ if (m_lsToWsCurve.numSamples() > 0) { makeIdentity(); } setLocalToWorld(0.0f, lsToWs); }
void MatrixFieldMapping::setLocalToWorld | ( | float | t, |
const M44d & | lsToWs | ||
) |
Sets the local to world transform at a given time.
Definition at line 222 of file FieldMapping.cpp.
References Curve< T >::addSample(), m_lsToWsCurve, and updateTransform().
{ m_lsToWsCurve.addSample(t, lsToWs); updateTransform(); }
const M44d& MatrixFieldMapping::localToWorld | ( | ) | const [inline] |
Returns a reference to the local to world transform.
Definition at line 358 of file FieldMapping.h.
References m_lsToWs.
Referenced by convertCellCenteredToMAC(), and convertMACToCellCentered().
{ return m_lsToWs; }
const M44d& MatrixFieldMapping::worldToVoxel | ( | ) | const [inline] |
Returns a reference to the world to voxel space transform.
Definition at line 363 of file FieldMapping.h.
References m_wsToVs.
{ return m_wsToVs; }
const M44d& MatrixFieldMapping::voxelToWorld | ( | ) | const [inline] |
Returns a reference to the voxel to world space transform.
Definition at line 368 of file FieldMapping.h.
References m_vsToWs.
{ return m_vsToWs; }
const MatrixCurve::SampleVec& MatrixFieldMapping::localToWorldSamples | ( | ) | const [inline] |
Returns a vector of all motion samples for local to world transform.
Definition at line 372 of file FieldMapping.h.
References m_lsToWsCurve, and Curve< T >::samples().
{ return m_lsToWsCurve.samples(); }
void MatrixFieldMapping::makeIdentity | ( | ) |
Sets the transform to identity. This makes it functionally equivalent to a NullFieldMapping.
Definition at line 230 of file FieldMapping.cpp.
References Curve< T >::clear(), m_lsToWsCurve, and updateTransform().
Referenced by MatrixFieldMapping(), and setLocalToWorld().
{ m_lsToWsCurve.clear(); updateTransform(); }
virtual void MatrixFieldMapping::worldToVoxel | ( | const V3d & | wsP, |
V3d & | vsP | ||
) | const [inline, virtual] |
Transform from world space position into voxel space.
Implements FieldMapping.
Definition at line 384 of file FieldMapping.h.
References m_wsToVs.
{ m_wsToVs.multVecMatrix(wsP, vsP); }
virtual void MatrixFieldMapping::worldToVoxel | ( | const V3d & | wsP, |
V3d & | vsP, | ||
float | time | ||
) | const [inline, virtual] |
Implements FieldMapping.
Definition at line 386 of file FieldMapping.h.
References Curve< T >::linear(), m_isTimeVarying, m_vsToWsCurve, and m_wsToVs.
{ if (!m_isTimeVarying) { m_wsToVs.multVecMatrix(wsP, vsP); } else { M44d wsToVs = m_vsToWsCurve.linear(time).inverse(); wsToVs.multVecMatrix(wsP, vsP); } }
virtual void MatrixFieldMapping::voxelToWorld | ( | const V3d & | vsP, |
V3d & | wsP | ||
) | const [inline, virtual] |
Transform from voxel space position into world space.
Implements FieldMapping.
Definition at line 396 of file FieldMapping.h.
References m_vsToWs.
{ m_vsToWs.multVecMatrix(vsP, wsP); }
virtual void MatrixFieldMapping::voxelToWorld | ( | const V3d & | vsP, |
V3d & | wsP, | ||
float | time | ||
) | const [inline, virtual] |
Implements FieldMapping.
Definition at line 398 of file FieldMapping.h.
References Curve< T >::linear(), m_isTimeVarying, m_vsToWs, and m_vsToWsCurve.
{ if (!m_isTimeVarying) { m_vsToWs.multVecMatrix(vsP, wsP); } else { M44d vsToWs = m_vsToWsCurve.linear(time); vsToWs.multVecMatrix(vsP, wsP); } }
virtual void MatrixFieldMapping::worldToLocal | ( | const V3d & | wsP, |
V3d & | lsP | ||
) | const [inline, virtual] |
Transform from world space position into local space.
Implements FieldMapping.
Definition at line 408 of file FieldMapping.h.
References m_wsToLs.
{ m_wsToLs.multVecMatrix(wsP, lsP); }
virtual void MatrixFieldMapping::worldToLocal | ( | const V3d & | wsP, |
V3d & | lsP, | ||
float | time | ||
) | const [inline, virtual] |
Implements FieldMapping.
Definition at line 410 of file FieldMapping.h.
References Curve< T >::linear(), m_isTimeVarying, m_lsToWsCurve, and m_wsToLs.
{ if (!m_isTimeVarying) { m_wsToLs.multVecMatrix(wsP, lsP); } else { M44d wsToLs = m_lsToWsCurve.linear(time).inverse(); wsToLs.multVecMatrix(wsP, lsP); } }
virtual void MatrixFieldMapping::localToWorld | ( | const V3d & | lsP, |
V3d & | wsP | ||
) | const [inline, virtual] |
Transform from local space position into world space.
Implements FieldMapping.
Definition at line 421 of file FieldMapping.h.
References m_lsToWs.
{ m_lsToWs.multVecMatrix(lsP, wsP); }
virtual void MatrixFieldMapping::localToWorld | ( | const V3d & | lsP, |
V3d & | wsP, | ||
float | time | ||
) | const [inline, virtual] |
Implements FieldMapping.
Definition at line 423 of file FieldMapping.h.
References Curve< T >::linear(), m_isTimeVarying, m_lsToWs, and m_lsToWsCurve.
{ if (!m_isTimeVarying) { m_lsToWs.multVecMatrix(lsP, wsP); } else { M44d lsToWs = m_lsToWsCurve.linear(time); lsToWs.multVecMatrix(lsP, wsP); } }
Definition at line 434 of file FieldMapping.h.
References m_wsToVs.
{ m_wsToVs.multDirMatrix(wsV, vsV); }
Definition at line 438 of file FieldMapping.h.
References m_vsToWs.
{ m_vsToWs.multDirMatrix(vsV, wsV); }
Definition at line 442 of file FieldMapping.h.
References m_wsToLs.
{ m_wsToLs.multDirMatrix(wsV, lsV); }
Definition at line 446 of file FieldMapping.h.
References m_lsToWs.
{ m_lsToWs.multDirMatrix(lsV, wsV); }
void MatrixFieldMapping::extentsChanged | ( | ) | [virtual] |
Implement this if the subclass needs to update itself when the resolution changes.
Reimplemented from FieldMapping.
Definition at line 238 of file FieldMapping.cpp.
References updateTransform().
{ updateTransform(); }
std::string MatrixFieldMapping::className | ( | ) | const [virtual] |
Returns the FieldMapping type name. Used when writing/reading from disk.
Implements FieldMapping.
Definition at line 245 of file FieldMapping.cpp.
References classType().
{ return std::string(classType()); }
bool MatrixFieldMapping::isIdentical | ( | FieldMapping::Ptr | other, |
double | tolerance = 0.0 |
||
) | const [virtual] |
Whether the mapping is identical to another mapping.
Implements FieldMapping.
Definition at line 252 of file FieldMapping.cpp.
References FIELD3D_NAMESPACE_OPEN::checkMatricesIdentical(), FIELD3D_NAMESPACE_OPEN::k_matrixMappingName(), m_lsToWsCurve, m_vsToWsCurve, and Curve< T >::samples().
{ typedef MatrixFieldMapping::MatrixCurve::SampleVec SampleVec; if (other->className() != k_matrixMappingName) { return false; } else { MatrixFieldMapping::Ptr mm = FIELD_DYNAMIC_CAST<MatrixFieldMapping>(other); if (mm) { const SampleVec lsToWs1 = m_lsToWsCurve.samples(); const SampleVec lsToWs2 = mm->m_lsToWsCurve.samples(); const SampleVec vsToWs1 = m_vsToWsCurve.samples(); const SampleVec vsToWs2 = mm->m_vsToWsCurve.samples(); size_t numSamples = lsToWs1.size(); // First check if time sample counts differ // lsToWs and vsToWs are guaranteed to have same sample count. if (lsToWs1.size() != lsToWs2.size()) { return false; } // Then check if all time samples match, then check localToWorld // and voxelToWorld matrices for (size_t i = 0; i < numSamples; ++i) { if (lsToWs1[i].first != lsToWs2[i].first) { return false; } if (!checkMatricesIdentical(lsToWs1[i].second, lsToWs2[i].second, tolerance)) { return false; } if (!checkMatricesIdentical(vsToWs1[i].second, vsToWs2[i].second, tolerance)) { return false; } } return true; } else { return false; } } return false; }
virtual V3d MatrixFieldMapping::wsVoxelSize | ( | int | i, |
int | j, | ||
int | k | ||
) | const [inline, virtual] |
Returns world-space size of a voxel at the specified coordinate.
Implements FieldMapping.
Definition at line 456 of file FieldMapping.h.
References m_wsVoxelSize.
{ return m_wsVoxelSize; }
FieldMapping::Ptr MatrixFieldMapping::clone | ( | ) | const [virtual] |
Returns a pointer to a copy of the mapping, pure virtual so ensure derived classes properly implement it.
Implements FieldMapping.
Definition at line 357 of file FieldMapping.cpp.
References MatrixFieldMapping().
{ return Ptr(new MatrixFieldMapping(*this)); }
void MatrixFieldMapping::updateTransform | ( | ) | [private] |
Updates the local to world transformation matrix.
Definition at line 306 of file FieldMapping.cpp.
References Curve< T >::addSample(), Curve< T >::clear(), getLocalToVoxelMatrix(), Curve< T >::linear(), m_isTimeVarying, m_lsToWs, m_lsToWsCurve, m_vsToWs, m_vsToWsCurve, m_wsToLs, m_wsToVs, m_wsVoxelSize, Curve< T >::numSamples(), and Curve< T >::samples().
Referenced by extentsChanged(), makeIdentity(), and setLocalToWorld().
{ typedef MatrixCurve::SampleVec::const_iterator SampleIter; // Build the voxel to world space transforms --- M44d lsToVs; getLocalToVoxelMatrix(lsToVs); M44d vsToLs = lsToVs.inverse(); // Loop over all samples in lsToWs, append vsToLs and create new curve // Also handle the special case where lsToWs has no samples. In that // case m_vsToWsCurve still has to have one sample. const MatrixCurve::SampleVec &lsToWs = m_lsToWsCurve.samples(); m_vsToWsCurve.clear(); for (SampleIter i = lsToWs.begin(), end = lsToWs.end(); i != end; i++) { m_vsToWsCurve.addSample(i->first, vsToLs * i->second); } // See if the curve has more than just a single sample m_isTimeVarying = m_lsToWsCurve.numSamples() > 1; // Sample the time-varying transforms at time=0.0 m_lsToWs = m_lsToWsCurve.linear(0.0); m_wsToLs = m_lsToWs.inverse(); m_vsToWs = vsToLs * m_lsToWs; m_wsToVs = m_vsToWs.inverse(); // Precompute the voxel size V3d voxelOrigin, nextVoxel; m_vsToWs.multVecMatrix(V3d(0, 0, 0), voxelOrigin); m_vsToWs.multVecMatrix(V3d(1, 0, 0), nextVoxel); m_wsVoxelSize.x = (nextVoxel - voxelOrigin).length(); m_vsToWs.multVecMatrix(V3d(0, 1, 0), nextVoxel); m_wsVoxelSize.y = (nextVoxel - voxelOrigin).length(); m_vsToWs.multVecMatrix(V3d(0, 0, 1), nextVoxel); m_wsVoxelSize.z = (nextVoxel - voxelOrigin).length(); }
void MatrixFieldMapping::getLocalToVoxelMatrix | ( | M44d & | result | ) | [private] |
Definition at line 345 of file FieldMapping.cpp.
References FieldMapping::m_origin, and FieldMapping::m_res.
Referenced by updateTransform().
Definition at line 330 of file FieldMapping.h.
M44d MatrixFieldMapping::m_lsToWs [private] |
Local space to world space.
Definition at line 475 of file FieldMapping.h.
Referenced by localToWorld(), localToWorldDir(), and updateTransform().
M44d MatrixFieldMapping::m_wsToLs [private] |
World space to local space.
Definition at line 478 of file FieldMapping.h.
Referenced by updateTransform(), worldToLocal(), and worldToLocalDir().
M44d MatrixFieldMapping::m_vsToWs [private] |
Voxel space to world space.
Definition at line 481 of file FieldMapping.h.
Referenced by updateTransform(), voxelToWorld(), and voxelToWorldDir().
M44d MatrixFieldMapping::m_wsToVs [private] |
World space to voxel space.
Definition at line 484 of file FieldMapping.h.
Referenced by updateTransform(), worldToVoxel(), and worldToVoxelDir().
MatrixCurve MatrixFieldMapping::m_lsToWsCurve [private] |
Time-varying local to world space transform.
Definition at line 487 of file FieldMapping.h.
Referenced by isIdentical(), localToWorld(), localToWorldSamples(), makeIdentity(), setLocalToWorld(), updateTransform(), and worldToLocal().
MatrixCurve MatrixFieldMapping::m_vsToWsCurve [private] |
Time-varying voxel to world space transform.
Definition at line 489 of file FieldMapping.h.
Referenced by isIdentical(), updateTransform(), voxelToWorld(), and worldToVoxel().
bool MatrixFieldMapping::m_isTimeVarying [private] |
Stores whether the curve has more than one time sample.
Definition at line 493 of file FieldMapping.h.
Referenced by localToWorld(), updateTransform(), voxelToWorld(), worldToLocal(), and worldToVoxel().
V3d MatrixFieldMapping::m_wsVoxelSize [private] |
Precomputed world-space voxel size. Calculations may assume orthogonal transformation for efficiency.
Definition at line 497 of file FieldMapping.h.
Referenced by updateTransform(), and wsVoxelSize().