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

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

  • 相关阅读:
    Java 破解谷歌翻译api,可以实现程序自动化翻译文章
    如何搭建高可用redis架构?
    架构师带你玩转分布式锁
    Java8内存模型—永久代(PermGen)和元空间(Metaspace)
    【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
    kafka为什么这么优秀!
    讲道理,为什么分布式一定要有Redis?
    Windows系统内存分析工具的介绍
    colspan width issue
    OpenGL ES3 非常好的系列文章
  • 原文地址:https://www.cnblogs.com/billin/p/2751614.html
Copyright © 2011-2022 走看看