// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "unproject.h" #include #include template < typename Derivedwin, typename Derivedmodel, typename Derivedproj, typename Derivedviewport, typename Derivedscene> IGL_INLINE void igl::unproject( const Eigen::MatrixBase& win, const Eigen::MatrixBase& model, const Eigen::MatrixBase& proj, const Eigen::MatrixBase& viewport, Eigen::PlainObjectBase & scene) { if(win.cols() != 3) { assert(win.rows() == 3); // needless transposes Eigen::Matrix sceneT; unproject(win.transpose().eval(),model,proj,viewport,sceneT); scene = sceneT.head(3); return; } assert(win.cols() == 3); const int n = win.rows(); scene.resize(n,3); for(int i = 0;i Inverse = (proj.template cast() * model.template cast()).inverse(); Eigen::Matrix tmp; tmp << win.row(i).head(3).transpose(), 1; tmp(0) = (tmp(0) - viewport(0)) / viewport(2); tmp(1) = (tmp(1) - viewport(1)) / viewport(3); tmp = tmp.array() * 2.0f - 1.0f; Eigen::Matrix obj = Inverse * tmp; obj /= obj(3); scene.row(i).head(3) = obj.head(3); } } template IGL_INLINE Eigen::Matrix igl::unproject( const Eigen::Matrix& win, const Eigen::Matrix& model, const Eigen::Matrix& proj, const Eigen::Matrix& viewport) { Eigen::Matrix scene; unproject(win,model,proj,viewport,scene); return scene; } #ifdef IGL_STATIC_LIBRARY template Eigen::Matrix igl::unproject(Eigen::Matrix const&, Eigen::Matrix const&, Eigen::Matrix const&, Eigen::Matrix const&); template Eigen::Matrix igl::unproject(Eigen::Matrix const&, Eigen::Matrix const&, Eigen::Matrix const&, Eigen::Matrix const&); template void igl::unproject, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); template void igl::unproject, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); #endif