给定表面法线,找到 3D 平面的旋转

2024-04-03

所以我有一个由 2 个向量描述的 3D 平面:

P:位于平面上的点
N :平面的表面法线

我有一个非常大的扁平方形多边形,我想渲染它来代表这个平面。我可以轻松地将多边形平移到给定点,但随后我需要找到适当的旋转来应用以使表面法线实际上成为表面法线。

我尝试了其他提到的方法,其中:

1) 取任何与法线 (N) 不平行的向量 (V),并取叉积 (W1)
2) 取 (W1) 和 (N) 的叉积 (W2),即位于平面上的向量 (V')

然后,我基于放置在平面上的 (V') 生成旋转矩阵,以便我的多边形将与 (V') 对齐。这确实有效,但很明显,该方法整体上无法正常工作。多边形并不完全垂直于表面法线。

关于如何产生适当的旋转有什么想法吗?


关于旋转的一些有用的事情:

  • 排列成行的任何三个正交向量都定义了到新基的变换(到该基的旋转)。
  • 任何旋转的转置都是它的逆。
  • 因此,排列为列的任何三个正交向量定义了从某个基础到“世界”参考系的旋转。

因此,问题是找到任何三个正交向量的集合并将它们排列为

| x1 x2 x3  0 |
| y1 y2 y3  0 |
| z1 z2 z3  0 |
|  0  0  0  1 |

这正是您所描述的方法试图做的,如果它不起作用,那么您的实现就有问题。

显然,我们可以使用法线作为 (x1,y1,z1),但问题是系统对其余两个向量有无限多个解(尽管知道其中一个向量可以得到另一个向量,即叉积)。下面的代码应该给出一个垂直于 (x1,y1,z1) 的稳定向量:

float normal[3] = { ... };

int imin = 0;
for(int i=0; i<3; ++i)
    if(std::abs(normal[i]) < std::abs(normal[imin]))
        imin = i;

float v2[3] = {0,0,0};
float dt    = normal[imin];

v2[imin] = 1;
for(int i=0;i<3;i++)
    v2[i] -= dt*normal[i];

这基本上使用 Gram-Schmidt 正交化,其维度已经与法线向量最正交。然后可以通过叉积得到 v3normal and v2.

您可能需要小心设置旋转,它与原点有关,因此您需要在旋转后应用平移,并且它适用于列向量而不是行向量。如果您使用 OpenGL,请注意 OpenGL 按列主要顺序(而不是 C 的行主要顺序)获取数组,因此您可能需要转置。

恐怕我还没有测试过上面的内容,我只是从我不久前编写的一些代码中获取了它并根据你的问题进行了调整!希望我没有忘记任何细节。

编辑:我确实忘记了一些事情:)

上面的矩阵假设你的多边形法线沿着x轴,我有一个偷偷怀疑它不会,你需要做的就是将“法线”向量放在旋转矩阵的正确列中,并且其他两列中的 v2/v3。因此,如果多边形的法线沿 z 轴,则法线位于第三列,v2/v3 位于前两列。

抱歉,如果这引起任何混乱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定表面法线,找到 3D 平面的旋转 的相关文章

  • 根据索引查找金字塔的行?

    给定一个像这样的金字塔 0 1 2 3 4 5 6 7 8 9 并给出金字塔的索引i where i代表i金字塔的第一个数字 有没有办法找到金字塔的行的索引i第一个元素属于 例如 如果i 6 7 8 9 它位于第 3 行 从第 0 行开始
  • 笛卡尔坐标到极坐标

    看一下这里的例子 http www brianhare com physicals so html http www brianhare com physics so html 看一下 console log 我在其中使用了这两个主要函数
  • 证明:为什么 java.lang.String.hashCode() 的实现与其文档相符?

    JDK 文档为java lang String hashCode http java sun com javase 6 docs api java lang String html hashCode famously https stack
  • python sympy计算余弦函数积分时出错

    因此 我直接尝试从 sympy 文档中获取示例 但出现了一个奇怪的错误 我正在使用 python 3 2 和 sympy 0 7 3 我一直在 ipython 笔记本上工作 尽管我认为这不会有什么不同 错误是 每当我创建 x 符号并尝试集成
  • Unity3D:在 AA 解析后绘制粒子以提高性能

    我正在尝试评估 MSAA 对 Unity 中含有大量粒子的场景的影响 为此 我需要 使用 8x MSAA 绘制场景中的所有非粒子对象 使用上一个通道中解析的深度缓冲区来渲染所有 将非遮挡粒子系统转移到较小的渲染目标上 将 2 的颜色缓冲区与
  • C++ Irrlicht 程序未链接:“未定义对‘__imp_createDevice’的引用”

    我的 Irrlicht 程序无法链接 我使用的编译器是g Code include
  • 投影 3D 网格的 2D 轮廓算法

    给定 一个 3D 网格 由一组顶点和三角形定义 并用这些点构建网格 问题 找到任意平面上投影的任意旋转网格的二维轮廓 投影很容易 挑战在于找到平面中投影三角形边的 外壳 我需要一些有关研究该算法的输入 指针的帮助 为简单起见 我们可以假设
  • 3D 数学:根据“向上”和“向上”正交向量计算倾斜(滚动)角度

    我希望这是提出这个问题的正确位置和这个一样 https stackoverflow com questions 3035590 bank angle from up vector and look at vector 但表示为纯数学而不是图
  • 将大块位图转换为 3 维位图

    Problem 我需要这个大量的数据作为输入 对于基于C的arduino 这是上面示例中所需格式的大量数据 const byte bitmap 8 8 0xFF 0x81 0x81 0x81 0x81 0x81 0x81 0xFF 0x81
  • 计算标签云中标签字体大小的公式是什么?

    我有一个标签云 我需要知道如何更改最常用标签的字体大小 我需要设置最小字体大小和最大字体大小 您可以使用线性或对数评估与某个标签相对于最大标签关联的项目数量 将其乘以最小和最大字体大小之间的差值 然后将其添加到最小字体大小 例如 伪代码中的
  • 在二维平面中找到距离 P 点最近的 K 个点

    资料来源 亚马逊面试问题 解决方案1制作大小为 K 的堆并按最小距离收集点O NLogK 复杂 解决方案2 取大小为 N 的数组并按距离排序 应该使用QuickSort 霍尔修改 取前 K 点作为答案 这太复杂了 NlogN 但可以优化到近
  • 确定范围是否重叠

    给定两个具有整数开始时间和结束时间的事件 E1 s1 e1 E2 s2 e2 实现快速布尔检查以查看事件是否重叠 我有解决方案 但我很想看看其他人想出了什么 编辑 好的 这是我的解决方案 e1 gt s2 s1 gt s2 e2 lt s1
  • 四舍五入到 25、50、75、100

    我不是一个数学爱好者 所以我很难想出一个将小数四舍五入到 25 50 75 和 100 的计算方法 这不会是典型的四舍五入 因为小数不会减少但只增加了 Example 如果 11 12 则舍入为 11 25 如果为 11 34 则舍入为 1
  • 用圆形雷达数学方法表示点

    我正在编写一个简单的应用程序 它可以向您显示您周围的朋友 但不是在法线地图中 而是在像 UI 这样的真正圆形雷达上 https i stack imgur com Au3IP png https i stack imgur com Au3I
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 如何通用地减少子集平均值的计算?

    Edit 由于似乎没有人阅读此链接的原始问题 因此让我在这里介绍一下它的概要 正如其他人所问的 最初的问题是 给定大量值 总和将超过数据类型的值Double那么如何计算这些值的平均值呢 有几个答案说要按集合计算 比如取50个和50个数字 计
  • 在 C# 中存储矩阵值的快速且有用的方法

    我需要用 C 为 3D 引擎创建一个 4x4 矩阵类 我见过一些其他引擎将矩阵值存储在单个浮点成员变量 字段中 如下所示 float m11 m12 m13 m14 float m21 m22 m23 m24 float m31 m32 m
  • 我应该如何格式化 .dat 文件以便制作 3D 矢量图?

    我正在为大学做这个编程任务 我们必须写一个c 计算 3D 空间中某些线圈的磁场矢量的程序 我已经成功编写了这个程序 并且我认为它运行得很好 不过 我想添加一个特殊的东西 这是我的试卷 所以它必须特别好 我想绘制出向量 我习惯打电话gnupl
  • 在网络上编写数学方程的最佳方法是什么?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我正在开发一个与数学相关的网页 并正在寻找一种将数学方程轻松写入网页的解决方案 目前我可以使用
  • C++ 中求幂的函数是什么?

    如何计算一个数的幂 2 1 2 2 2 3 etc cmath 库中的 pow 更多信息here http en cppreference com w cpp numeric math pow 别忘了放 include

随机推荐