【问题标题】:Howto project a planar polygon on a plane in 3d-space如何在 3d 空间中的平面上投影平面多边形
【发布时间】:2011-01-30 19:49:13
【问题描述】:

我想将我的多边形沿向量投影到 3d 空间中的平面。我最好使用单个转换矩阵来完成此操作,但我不知道如何构建这种矩阵。

给定

  • 平面参数(ax+by+cz+d),
  • 我的多边形的世界坐标。如标题所述,我的多边形的所有顶点都位于另一个平面上。
  • 我的多边形投影所沿的方向向量(当前是多边形平面的法线向量)

目标 - 执行所需投影的 4x4 变换矩阵,

  • 关于如何自己构建的一些见解

更新

感谢您的回答,它按预期工作。

给发现这个的人一个警告:如果投影平面的法线平行于投影向量,分母D将变为(几乎)0,所以为了避免奇怪的事情发生,某种处理需要这种特殊情况。我通过检查是否 D

【问题讨论】:

    标签: math 3d geometry projection projective-geometry


    【解决方案1】:

    假设多边形的一个顶点是(x0, y0, z0),方向向量是(dx,dy,dz)

    投影线上的一点是:(x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)

    你想求这条线与平面的交点,把它代入平面方程ax+by+cz+d = 0,求t:

    t = (-a*x0 - b*y0 - c*z0 - d) / (a*dx + b*dy + c*dz)
    

    然后你就有了你的目标顶点:x = x0+dx*t,等等。

    由于这是一个仿射变换,它可以由一个 4x4 矩阵来执行。您应该能够通过将 x,y,z 的三个方程写成 x0,y0,z0 的函数并获取系数来确定矩阵元素。

    例如,对于 x:

    x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx) / D
    x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D
    

    D = a*dx + b*dy + c*dz 是上面的分母。 y 和 z 的工作方式类似。

    结果矩阵:

    1-a*dx/D    -b*dx/D    -c*dx/D   -d*dx/D
     -a*dy/D   1-b*dy/D    -c*dy/D   -d*dy/D
     -a*dz/D    -b*dz/D   1-c*dz/D   -d*dz/D
        0          0          0         1
    

    (注意:在 Direct3D 上,这个矩阵应该被转置,因为它使用行向量而不是列向量)。

    【讨论】:

    • 感谢您提供完整的解决方案。我马上试试这个
    • 我已经实施了您的解决方案。但是,我遇到了麻烦,因为我的方向矢量是 (1|0|0) 并且平面呈 45° 角:侧视图:'| ----> /' 其中 |是多边形,/ 是要投影的平面。在这种情况下,a*dx/D = 1,其中第一列中的其他两个条目为 0 (dy = dzt = 0)。这导致整个 coumn 为 0,有效地将我的多边形缩放为 0。我的应用程序不喜欢这样。您知道解决方法吗?
    • @sum1:第一列为零表示将忽略原始顶点的x坐标。这是意料之中的,因为您的投影方向平行于 x 轴。它不会将您的多边形缩放到 0。
    • 我想问题出在我的应用程序上。我会调查的。
    • 我正在尝试从我的平面多边形创建一个平面并将一个非平面多边形投影到该平面上。平面和非平面多边形都需要投影在平面上以用于相交目的,对于我的情况,等式是否会有所不同,主要是我在想a,b,c(平面法线)和dx,dy,dz(飞机也正常)?
    猜你喜欢
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多