c++ - 用 Vector3f 初始化 Vector4f
问题描述
我正在尝试对存储在 Vector3f 中的世界坐标中的 3D 点执行视图变换,我的视图矩阵存储在 Matrix4f 中。是否可以使用扩展的 Vector3f 来初始化 Vector4f。这就是我到目前为止所做的:
Eigen::Vector4f Graphics::getLookVectorView() {
Eigen::Matrix4f viewMatrix = dxToEigen(m_camera->getViewMatrix());
Eigen::Vector3f Vec = m_eyeball0->getLookVector();
Eigen::Vector4f lookVec4;
lookVec4 << Vec.x(), Vec.y(), Vec.z(), 1;
return (viewMatrix*lookVec4);
//Eigen::Vector3f lookVecEye1 = m_eyeball1->getLookVector();}
但是当我尝试这样做时出现错误,有什么方法可以将 Vector3f 扩展一并存储在 Vector4f 中以执行转换?
这是我得到的错误:
1>....\eigen-eigen-b30b87236a1b\eigen\src\core\assign.h(499): error C2338: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
1>....\eigen-eigen-b30b87236a1b\eigen\src\core\plainobjectbase.h(414): note: see reference to function template instantiation 'Derived &Eigen::DenseBase<Derived>::lazyAssign<Eigen::Matrix<float,4,1,0,4,1>>(const Eigen::DenseBase<Eigen::Matrix<float,4,1,0,4,1>> &)' being compiled
1> with
1> [
1> Derived=Eigen::Matrix<float,3,1,0,3,1>
1> ]
非常感谢任何帮助:)
解决方案
您可以使用Affine3f而不是 Matrix4f 来规避转换。Affine3f 对象在内部存储一个 Matrix4f(可以通过 访问Affine3f.matrix()
)并且与 a 的乘法Vector3f
返回Vector3f
执行相同的计算,该计算使用Vector4f
创建的添加尾随 1。
#include <Eigen/Geometry>
Eigen::Vector3f Graphics::getLookVectorView() {
Eigen::Matrix4f viewMatrix = dxToEigen(m_camera->getViewMatrix());
Eigen::Affine3d affine(viewMatrix);
Eigen::Vector3f Vec = m_eyeball0->getLookVector();
return (affine*Vec);
}
推荐阅读
- c# - 根据列值从表中获取特定数量的行
- https - 在通过 http/2 进行 Kerberos 协商后,MS IE 和 Edge 回退到 http/1.1
- javascript - 如何从分页形式的权力游戏 Api 中打印所有角色名称 | 在 JS 中遍历分页 API
- python - 过滤最大值/最小值
- r - 使用 R Lubridate 提取会计年度
- react-bootstrap4-modal - 带有表单问题的引导模式
- c# - 身份服务器 4 Cors 问题
- python-3.x - 为什么 cur.execute('select id from credit where kp_order_id = "A15268964292124586"') 为空?
- python - BeutifulSoup 从 td、span 和 style 中提取
- ruby-on-rails - collection_check_boxes 哈希中 {:id=>1,...} 的未定义方法“id”