计算世界空间中的偏移量,以在视图空间中定义偏移量(同质变换后)?

问题描述 投票:0回答:1

在图形中,我们通常有一个世界空间,我们使用 4x4 视图矩阵 View 将其映射到视图空间。 (一般来说,这由相机矩阵和投影矩阵组成,因此 View = Proj * Cam)。因此,假设我们有一个 3D 点 pworld,将其转换为齐次坐标后,我们可以将该点投影到我们的视图空间:pview = View * pworld。到目前为止相当标准。

这就是事情变得有趣/棘手的地方,这取决于你的心态。我想改变原始点 pworld,使其在视图空间中具有指定的偏移量 o, 。我们将改变的点称为 p’world。式中:

视图 * p’世界 = 视图 * (p世界 + o’) = p视图 + o

所以我们以这样的方式设置o',在应用我们的View矩阵之后,我们在视图空间中留下偏移量o。但是我们如何计算这个 o'(这是一个 3 维向量)?

我在取 View 的逆并尝试像 o' = inverse(View) * o 这样的事情上取得了很大的进展,但是同质除法增加了我还无法解决的非线性。

graphics camera homogenous-transformation
1个回答
0
投票

好的,那么您可以通过以下方式解决。我仍然希望有一种“更好”的方式,涉及更少的操作,但这至少可能会给你一些想法。明天早上我会进一步整理答案。

point_world
是 pworld
view_matrix
View
view_offset
是偏移量 o。结果就是计算出来的o'。

fn calc_world_offset2(point_world: Vec3, view_matrix: Mat4, view_offset: Vec3) -> Vec3 {
    let point_world4 = Vec4::from((point_world, 1.0)); // Create homogenous Vec4(p, 1.0)
    let point_view = view_matrix * point_world4; 

    let view_offset4 = Vec4::from((view_offset, 0.0)); // Create homogenous Vec4(o, 0.0)
    let offset_temp = view_matrix.inverse() * (view_offset4 * point_view.w);
    let point_offsetted_world = point_world4 + offset_temp;

    (point_offsetted_world / point_offsetted_world.w).truncate() - point_world
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.