zoukankan      html  css  js  c++  java
  • Ogre/Torque 基础类plane简单释疑

    Ogre 或Torque都没有用点法式保存平面,而是用了两个成员normal,d

    normal不用多说,是平面的法向量,那么d是什么呢?

    在Torque3d的mplane.h的函数

    inline void PlaneF::setPoint(const Point3F &p)
    {
       d = -(p.x * x + p.y * y + p.z * z);
    }

    显然

    d = -(p.x * x + p.y * y + p.z * z);

    这里不具体画图,只叙述下:从3d坐标轴原点O,沿着normal方向作一条射线,与平面M的交于点P,连接线段OP,则-d等于线段OP的长度,也就是d=向量OP的模的相反数。

    证明思路:向量点乘--投影

    明白了d的含义,求平面外一点Q与平面的distance函数就很好理解了:

    inline F32 PlaneF::distToPlane( const Point3F& cp ) const
    {
       // return mDot(*this,cp) + d;
       return (x * cp.x + y * cp.y + z * cp.z) + d;
    }

    因为法向量n(x,y,z)与平面外一点cp的点乘就是Ocp的长度,加上d就是点到平面的距离。

    其他的函数都很简单,比如判断点在平面的哪一侧,都是用到前面的结果

    inline PlaneF::Side PlaneF::whichSide(const Point3F& cp) const
    {
       F32 dist = distToPlane(cp);
       if (dist >= 0.005f)                 // if (mFabs(dist) < 0.005f)
          return Front;                    //    return On;
       else if (dist <= -0.005f)           // else if (dist > 0.0f)
          return Back;                     //    return Front;
       else                                // else
          return On;                       //    return Back;
    }

    不知道大家看明白了没,真的很简单,画个图就出来了。

  • 相关阅读:
    解决VS2012新建MVC4等项目时,收到加载程序集“NuGet.VisualStudio.Interop…”的错误
    BOM 清除
    sleep和Sleep区别
    出现error: stray ‘357’ in program的根源
    vi 复制或剪切多行超级强大方法
    CentOS乱码解决方法
    VBS实现文本文件按行数拆分的脚本
    python-门户应用状态检查脚本
    HTA+VBS实现的话单核查小工具
    oracle 11g 安装
  • 原文地址:https://www.cnblogs.com/billin/p/2751614.html
Copyright © 2011-2022 走看看