54 using namespace boost;
81 template <
class Matrix_T>
85 if (m1.equalWithRelError(m2, tolerance)) {
88 V3d s1, r1, t1, sh1, s2, r2, t2, sh2;
95 if (!s1.equalWithRelError(s2, tolerance) ||
96 !r1.equalWithAbsError(r2, tolerance) ||
97 !t1.equalWithRelError(t2, tolerance)) {
145 m_res = extents.max - extents.min +
V3i(1);
177 double tolerance)
const
253 double tolerance)
const
262 FIELD_DYNAMIC_CAST<MatrixFieldMapping>(other);
267 const SampleVec lsToWs2 = mm->m_lsToWsCurve.samples();
269 const SampleVec vsToWs2 = mm->m_vsToWsCurve.samples();
271 size_t numSamples = lsToWs1.size();
275 if (lsToWs1.size() != lsToWs2.size()) {
281 for (
size_t i = 0; i < numSamples; ++i) {
282 if (lsToWs1[i].first != lsToWs2[i].first) {
308 typedef MatrixCurve::SampleVec::const_iterator SampleIter;
313 M44d vsToLs = lsToVs.inverse();
319 for (SampleIter i = lsToWs.begin(), end = lsToWs.end(); i != end; i++) {
333 V3d voxelOrigin, nextVoxel;
349 M44d scaling, translation;
350 scaling.setScale(
m_res);
351 translation.setTranslation(
m_origin);
352 result = scaling * translation;
368 m_zDistribution(PerspectiveDistribution),
392 const M44d &ssToWs,
const M44d &csToWs)
400 M44d lsToSs, scale, translation;
401 scale.setScale(
V3d(2.0, 2.0, 1.0));
402 translation.setTranslation(
V3d(-1.0, -1.0, 0.0));
403 lsToSs = scale * translation;
404 M44d lpsToWs = lsToSs * ssToWs;
417 V3d lsNearP(0.5, 0.5, 0.0), lsFarP(0.5, 0.5, 1.0);
418 V3d wsNearP, wsFarP, csNearP, csFarP;
420 lpsToWs.multVecMatrix(lsNearP, wsNearP);
421 lpsToWs.multVecMatrix(lsFarP, wsFarP);
423 M44d wsToCs = csToWs.inverse();
424 wsToCs.multVecMatrix(wsNearP, csNearP);
425 wsToCs.multVecMatrix(wsFarP, csFarP);
427 double near = -csNearP.z;
428 double far = -csFarP.z;
431 if (isnan(near) || isnan(far)) {
432 throw BadPerspectiveMatrix(
"FrustumFieldMapping::setTransforms "
433 "received bad screen-to-world matrix");
449 csToWs.makeIdentity();
455 double fovRadians = 45.0 * M_PI / 180.0;
456 double invTan = 1.0 / std::tan(fovRadians / 2.0);
457 double imageAspectRatio = 1.0;
459 M44d perspective(1, 0, 0, 0,
461 0, 0, (far) / (far - near), 1,
462 0, 0, (- far * near) / (far - near), 0);
465 fov.setScale(
V3d(invTan / imageAspectRatio, invTan, 1.0));
468 flipZ.setScale(
V3d(1.0, 1.0, -1.0));
470 M44d csToSs = flipZ * perspective * fov;
472 M44d standardSsToWs = csToSs.inverse() * csToWs;
580 V3d lpsCenterP, wsCenterP, csCenterP(0.0, 0.0, -wsDepthFromCam);
588 V3d lpsP(lsP.x, lsP.y, lpsCenterP.z);
613 double tolerance)
const
622 FIELD_DYNAMIC_CAST<FrustumFieldMapping>(other);
627 const SampleVec lpsToWs2 = fm->m_lpsToWsCurve.samples();
629 const SampleVec csToWs2 = fm->m_csToWsCurve.samples();
631 size_t numSamples = lpsToWs1.size();
640 if (lpsToWs1.size() != lpsToWs2.size()) {
646 for (
size_t i = 0; i < numSamples; ++i) {
647 if (lpsToWs1[i].first != lpsToWs2[i].first) {
673 k = std::min(std::max(k, static_cast<int>(
m_origin.z)),
690 int zMin =
static_cast<int>(
m_origin.z);
693 for (
int k = zMin, idx = 0; k < zMax; ++k, ++idx) {
694 V3d wsP, wsPx, wsPy, wsPz;
704 (wsPy - wsP).length(),
705 (wsPz - wsP).length());
722 M44d scaling, translation;
723 scaling.setScale(
m_res);
724 translation.setTranslation(
m_origin);
725 result = scaling * translation;