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

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

  • 相关阅读:
    Swift和OC混编
    Excel数据导入___你hold住么(一)
    Cocos2d-x 3.0多线程异步资源载入
    FPGA实现网络通信时的网络字节序问题
    easyui datagrid 动态加入、移除editor
    struts.xml中出现extends undefined package struts-default解决的方法
    Maven入门
    后面需要继续完善的地方
    CentOS6.9 安装OpenResty
    数据库异步写入功能概要设计
  • 原文地址:https://www.cnblogs.com/billin/p/2751614.html
Copyright © 2011-2022 走看看