source/rig/RigTransform.h (74 lines of code) (raw):
/**
* Copyright 2004-present Facebook. All Rights Reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "source/util/Camera.h"
namespace fb360_dep {
const Eigen::Transform<double, 3, Eigen::Affine> generateTransform(
const Camera::Vector3& rotation,
const Camera::Vector3& translation,
const Eigen::UniformScaling<double>& scale,
const bool applyInReverse = false) {
const Eigen::AngleAxis<Camera::Real> x(rotation.x(), Camera::Vector3::UnitX());
const Eigen::AngleAxis<Camera::Real> y(rotation.y(), Camera::Vector3::UnitY());
const Eigen::AngleAxis<Camera::Real> z(rotation.z(), Camera::Vector3::UnitZ());
const Eigen::Affine3d r = Eigen::Affine3d(z * y * x);
const Eigen::Translation3d t(translation);
// Create transform from rotation, position and scale
Eigen::Transform<double, 3, Eigen::Affine> xform;
if (applyInReverse) {
xform = r * t * scale;
} else {
xform = scale * t * r;
}
return xform;
}
const Eigen::Transform<double, 3, Eigen::Affine> generateTransform(
double const* const rotation,
double const* const translation,
double const* const scale,
const bool applyInReverse = false) {
return generateTransform(
Camera::Vector3(rotation),
Camera::Vector3(translation),
Eigen::UniformScaling<double>(scale[0]),
applyInReverse);
}
Camera transformCamera(
const Camera& camera,
double const* const rotation,
double const* const translation,
double const* const scale,
const bool applyInReverse = false) {
Camera result = camera;
// Generate a transform with rotation only (no translation or scaling) for the forward, up and
// right vectors
const Eigen::Transform<double, 3, Eigen::Affine> rot = generateTransform(
Camera::Vector3(rotation),
Camera::Vector3(0, 0, 0),
Eigen::UniformScaling<double>(1),
applyInReverse);
const Eigen::Transform<double, 3, Eigen::Affine> xform =
generateTransform(rotation, translation, scale, applyInReverse);
const Camera::Vector3 forward = camera.forward();
const Camera::Vector3 up = camera.up();
const Camera::Vector3 right = camera.right();
result.setRotation(rot * forward, rot * up, rot * right);
result.position = xform * camera.position;
return result;
}
Camera::Rig transformRig(
const Camera::Rig& rig,
const Camera::Vector3& rotation,
const Camera::Vector3& translation,
const Eigen::UniformScaling<double>& scale,
const bool applyInReverse = false) {
Camera::Rig result;
// Generate a transform with rotation only (no translation or scaling) for the forward, up and
// right vectors
const Eigen::Transform<double, 3, Eigen::Affine> rot = generateTransform(
rotation, Camera::Vector3(0, 0, 0), Eigen::UniformScaling<double>(1), applyInReverse);
const Eigen::Transform<double, 3, Eigen::Affine> xform =
generateTransform(rotation, translation, scale, applyInReverse);
for (Camera camera : rig) {
const Camera::Vector3 forward = camera.forward();
const Camera::Vector3 up = camera.up();
const Camera::Vector3 right = camera.right();
camera.setRotation(rot * forward, rot * up, rot * right);
camera.position = xform * camera.position;
result.push_back(camera);
}
return result;
}
} // namespace fb360_dep