首页 > 解决方案 > 用 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>        ]

非常感谢任何帮助:)

标签: c++vectortype-conversioneigendata-conversion

解决方案


您可以使用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);
}

推荐阅读