opengl 如何计算3D中线段的法线

w8f9ii69  于 2023-02-04  发布在  其他
关注(0)|答案(3)|浏览(146)

我已经从Blender导出了一些头发粒子(一种发型)。这些粒子由几条线(GL_LINES)组成。我的OpenGL程序显示这些粒子没有任何问题。现在我只想在这些粒子上应用灯光属性。Blender不导出法线向量,所以我需要自己计算它们。我知道以下规则:
如果我们在二维空间中定义一条线段为[AB],我们有dx = xB-xA和dy = yB-yA,那么法线为N1(-dy,dx)和N2(dy,-dx)。
我希望我没有犯任何错误。
但是,如果在线段坐标中添加z维(例如A(5,2,3)和B(0,0,-5)),我不知道3D空间线段定义的规则。
有人能帮我吗?

axzmvihb

axzmvihb1#

因为阿基忘了评论不是答案:
3D空间中的线没有法线。从技术上讲,2D 空间中的线也没有法线;它们有两条法线。
在3D空间中,垂直于一条线的方向有无限多个。所有这些法线都在同一个平面上,但方向不同。如果没有更高级的算法(可能基于相邻的线),就无法从这些法线中选择一条法线。

iyr7buue

iyr7buue2#

如果你假设你可以得到两个向量,看起来你是这么说的,把它们叫做v,w,得到一个法向量,取叉积,根据情况,把v,w归一化是个不错的主意,叉积可以由下式给出:

v x w =(v_2w_3 - v_3w_2, v_3x_1 - v_1w_3, v_1w_2 - v_3w_1),

这里v_i是v的第i个分量,以此类推,相邻的数字代表乘法,当然,你可以加上或减去这个向量,给出两种可能性。

suzh9iv8

suzh9iv83#

我有一个类似的问题,甚至使用了不定冠词“a”。有些人认为3D线段没有规范,说它们有无限多个。然而,错过不定冠词“a”--我认为它可能意味着无限中的任何一个。
如果一个人没有两个向量作为起点,会发生什么?
向量是线段或向量的单位向量。创建围绕向量的旋转矩阵以获得无穷范数的1
这花了一些时间,但使用特征模板库和10000个随机测试样本。

#include <Eigen/Core> 
#include <Eigen/Geometry> 
Eigen::MatrixXd samples = Eigen::MatrixXd::Random(10000, 3); // 3x3 Matrix filled with random numbers between (-1,1)

for (int i = 0; i < 10000; ++i)
{
    Eigen::Vector3d vector(samples(i, 0), samples(i, 1), samples(i, 2));
    vector.normalize();
    Eigen::Vector3d zaxis(0, 0, 1);
    Eigen::Vector3d xaxis = zaxis.cross(vector);
    xaxis.normalize();
    Eigen::Vector3d yaxis = vector.cross(xaxis);
    yaxis.normalize();

    Eigen::Matrix3d m;
    m(0, 0) = xaxis(0);
    m(0, 1) = yaxis(0);
    m(0, 2) = vector(0);

    m(1, 0) = xaxis(1);
    m(1, 1) = yaxis(1);
    m(1, 2) = vector(1);

    m(2, 0) = xaxis(2);
    m(2, 1) = yaxis(2);
    m(2, 2) = vector(2);

    // one of two easy points to use to get 1 of infinite norms --- the other being (1, 0, 0)
    Eigen::Vector3d point(0, 1, 0);
    point = m * point;
    point.normalize();

    auto norm = point.cross(vector);
    norm.normalize(); // 1 of an infinite number of norms

    auto check = norm.dot(vector); // verify with dot product
    if (std::abs(check) >= 1e-12)
    {
        //complain
    }
}

相关问题