首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DirectXTK / DirectXMath变换平面

用DirectXTK / DirectXMath变换平面
EN

Stack Overflow用户
提问于 2017-09-10 09:51:05
回答 2查看 313关注 0票数 1

我有一个由三点定义的三维平面,我想用DirectXTK将它转换成一个4x4矩阵。

我尝试了两种方法:

  1. 用平面::Transform ()方法对平面进行转换--这给出了一个非常奇怪的结果。
  2. 转换这三个点,并从转换点创建一个平面-这工作得很好。

我还尝试在调用平面::Transform()之前将矩阵转置,使平面变得正常,但是常数是错误的(另外,转置矩阵对我来说真的没有任何意义)。

代码语言:javascript
复制
void TestPlaneTransform()
{
    Vector3 p1(-2.4f, -2.0f, -0.2f);
    Vector3 p2(p1.x, p1.y + 1, p1.z);
    Vector3 p3(p1.x, p1.y, p1.z + 1);

    Plane plane(p1, p2, p3);
    Matrix m = Matrix::CreateTranslation(-4, -3, -2);

    // transform plane with matrix
    Plane result1 = Plane::Transform(plane, m);

    // transform plane with transposed matrix
    Plane result2 = Plane::Transform(plane, m.Transpose());

    // transform points with matrix
    Vector3 t1 = Vector3::Transform(p1, m);
    Vector3 t2 = Vector3::Transform(p2, m);
    Vector3 t3 = Vector3::Transform(p3, m);

    // plane from transformed points
    Plane result3(t1, t2, t3);

    result1.Normalize();
    result2.Normalize();
    result3.Normalize();
}

以下是标准化后的结果:

代码语言:javascript
复制
result1 x:-0.704918027 y:-0.590163946 z:-0.393442601 w:0.196721300

result2 x:1.00000000 y:0.000000000 z:0.000000000 w:-1.59999990

result3 x:1.00000000 y:0.000000000 z:0.000000000 w:6.40000010

平面::Transform()调用XMPlaneTransform,这是DirectXMath库的一部分,它的文档简单地说“用给定的矩阵来转换平面”。我想这个方法很好,但是我的代码有什么问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-11 04:10:11

由于您是在DirectXTK Plane上调用Plane,所以在执行调用之前似乎不需要将其规范化。但是,用于DirectXTK的Plane::Transform wiki声明如下:

平面应由矩阵的逆转置变换,而对于纯旋转,则产生与原矩阵相同的矩阵。

github.com/Microsoft/DirectXTK/wiki/Plane

票数 1
EN

Stack Overflow用户

发布于 2017-09-10 11:05:40

从规格:

要变换的归一化平面。在调用此方法之前,必须对此平面进行规范化,使其法线向量具有单位长度。

用一个没有归一化的平面来调用这个方法,我想会产生一些垃圾。所以我先把飞机正常化,然后再检查一遍。

Plane.Transform方法(平面,矩阵)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46139369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档