• 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;
    }

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

  • 相关阅读:
    HDU4714+三分
    HDU1465+递推
    HDU1437+模拟
    HDU1796+容斥原理
    HDU1432+几何
    Linux---Ls命令 初级实现
    HDU1411+四面体的体积
    HDU1412
    HDU1431+简单题
    请定义一个交通工具(Vehicle)的类,其中有: 属性:速度(speed),体积(size)等等
  • 原文地址:https://www.cnblogs.com/billin/p/2751614.html
Copyright © 2020-2023  润新知