首页 > 其他 > 详细

由normal生成局部坐标系

时间:2019-12-25 20:51:18      阅读:105      评论:0      收藏:0      [点我收藏+]

在做光线追踪的时候,有一步是已知光线所打到的平面的normal,和光线的入射方向。我们想将入射方向转换为normal的局部坐标,这就首先需要构建出基于normal的局部坐标系。然后利用这篇文章( https://www.cnblogs.com/wickedpriest/p/12074420.html ) 来进行转换。
那么现在的问题就是:给定normal作为局部坐标系的z轴,如何去构建x、y轴来组成新的局部坐标系呢?
图形学网站scratch_pixel上提到了一种方法,在这里贴出代码:

    XMVECTOR Nt, Nb, N;
    N = XMVectorSet(n.x, n.y, n.z, 0.0);
    if (std::fabs(n.x) > std::fabs(n.y))
        Nt = XMVector3Normalize(XMVectorSet(n.z, 0, -n.x, 0.0));
    else
        Nt = XMVector3Normalize(XMVectorSet(0.0, -n.z, n.y, 0.0));
    Nb = XMVector3Cross(N, Nt);

其中N是normal,Nt和Nb就是我们计算出的另外两个轴。我最开始看到代码中if的部分还愣了一下,没太搞懂这么做的动机。想了一会儿才意识到一开始计算Nt的时候,为了保证和N相互垂直,取得是向量N中的两个数,并将其中一个数取反,组成的新向量(这样可以保证N与Nt的点乘为0)。但有一种可能是取到的两个数全都是0,那么得到的Nt就会是全0的值。为了避免这一点,Nt中需要包含N里绝对值最大的值(最大的绝对值值可能不可能是0)。

由normal生成局部坐标系

原文:https://www.cnblogs.com/wickedpriest/p/12098582.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!