当前位置: 首页 > news >正文

太原网站优化公司福彩网站开发

太原网站优化公司,福彩网站开发,吉林省建设安全信息网官网,做论坛推广的网站overoad代码中包含一段有意思的代码#xff0c;可以从视图投影矩阵逆推出摄像机的视锥体#xff0c;本文来分析一下原理 一、平面的方程 视锥体是用平面来表示的#xff0c;所以先看看平面的数学表达。 平面方程可以由其法线N#xff08;A, B, C#xff09;和一个点Q(x0,… overoad代码中包含一段有意思的代码可以从视图投影矩阵逆推出摄像机的视锥体本文来分析一下原理 一、平面的方程 视锥体是用平面来表示的所以先看看平面的数学表达。 平面方程可以由其法线NA, B, C和一个点Q(x0,y0,z0)定义其形式为 A ( x − x 0 ) B ( y − y 0 ) C ( z − z 0 ) 0 A(x-x_{0})B(y-y_{0})C(z-z_{0})0 A(x−x0​)B(y−y0​)C(z−z0​)0          整理变为 A x B y C z D 0 AxByCzD0 AxByCzD0,       其中 D − A x 0 − B y 0 − C z 0 D−Ax_{0}−By_{0}−Cz_{0} D−Ax0​−By0​−Cz0​          方程进一步可以将方程归一化 A A 2 B 2 C 2 x B A 2 B 2 C 2 y C A 2 B 2 C 2 z D A 2 B 2 C 2 0 \frac{A}{\sqrt{A^{2}B^{2}C^{2} } } x \frac{B}{\sqrt{A^{2}B^{2}C^{2} } }y\frac{C}{\sqrt{A^{2}B^{2}C^{2} } }z\frac{D}{\sqrt{A^{2}B^{2}C^{2} } } 0 A2B2C2 ​A​xA2B2C2 ​B​yA2B2C2 ​C​zA2B2C2 ​D​0 写成通用格式 a x b y c z d 0 axbyczd0 axbyczd0 那么点 p ( x 1 , y 1 , z 1 ) p(x_{1}, y_{1}, z_{1}) p(x1​,y1​,z1​)到平面的距离为 D a x 1 b y 1 c z 1 d Dax_{1}by_{1}cz_{1}d Dax1​by1​cz1​d 一个平面会将空间分成两个半空间halfspace进一步法线的朝向的空间称为正半空间positive halfspace法线背离的空间称为反半空间negative halfspace。根据D的符号可以判断点的相对位置 D 0 点位于反半空间D 0 点位于平面上D 0 点位于正半空间 这种特性可用于判断点是否在视锥体内部。 二、OpenGL视锥体 视锥体是摄像机能看到的区域只有在视锥体内的物体才能被看到。其由近平面near、远平面far与周围四个面top、bottom、left、right组成形成一个平截头体区域。 不过在构建视锥体时一般不直接输入6个平面的方程常用另外一组更直观易懂的参数 fov – 视锥体的垂直张角Near – 视锥体的近平面距离Far – 视锥体的远平面距离aspect – 相机视口的长宽比 具体含义建下图 三、Overload对视锥体的封装 Overload对视锥体的封装在文件Frustum.h、Frustum.cpp中。先看其定义 class Frustum { public:/*** 根据视图投影矩阵提取视锥体* param p_viewProjection*/ void CalculateFrustum(const OvMaths::FMatrix4 _viewProjection);/*** 判断点是不是在视锥体内* param p_x* param p_y* param p_z*/bool PointInFrustum(float p_x, float p_y, float _z) const;/*** 判断球是不是在视锥体内* param p_x* param p_y* param p_z* param p_radius*/bool SphereInFrustum(float p_x, float p_y, loat p_z, float p_radius) const;/*** 判断立方体是不是在视锥体内* param p_x* param p_y* param p_z* param p_size*/bool CubeInFrustum(float p_x, float p_y, float _z, float p_size) const;/*** 判断包围球是不是在视锥体内* param p_boundingSphere* param p_transform*/bool BoundingSphereInFrustum(const vRendering::Geometry::BoundingSphere _boundingSphere, const OvMaths::FTransform _transform) const;/*** 返回近平面*/std::arrayfloat, 4 GetNearPlane() const;/*** 返回远平面*/std::arrayfloat, 4 GetFarPlane() const; private:float m_frustum[6][4]; // 6个平面的方程参数 };m_frustum保存着6个平面的方程参数为了提升操作便利性其定义了两个枚举作为索引 enum FrustumSide {RIGHT 0, // The RIGHT side of the frustumLEFT 1, // The LEFT side of the frustumBOTTOM 2, // The BOTTOM side of the frustumTOP 3, // The TOP side of the frustumBACK 4, // The BACK side of the frustumFRONT 5 // The FRONT side of the frustum };// 平面方程的参数索引 enum PlaneData {A 0, // The X value of the planes normalB 1, // The Y value of the planes normalC 2, // The Z value of the planes normalD 3 // The distance the plane is from the origin };函数的具体实现在文件Frustum.cpp中我们先看最基础的判断点是否在视锥体内 bool OvRendering::Data::Frustum::PointInFrustum(float x, float y, float z) const {for (int i 0; i 6; i){if (m_frustum[i][A] * x m_frustum[i][B] * y m_frustum[i][C] * z m_frustum[i][D] 0){return false;}}return true; }定义视锥体的面法线都是朝外的如果点在视锥体内点到6个面的距离必须全部小于0。进一步判断球体是否完全在视锥体内距离必须小于半径的负数。 最后分析一下CalculateFrustum它是根据一个视图投影矩阵反向构建一个视锥体具体公式怎么来的可以参考这篇文章里面将的特别详细 Fast Extraction of Viewing Frustum Planes from the World View-Projection Matrix   其本身的代码没啥好说的无非就是公式的翻译。
http://www.pierceye.com/news/492140/

相关文章:

  • wordpress 当前文章id益阳网站seo
  • 湖南对外建设集团网站成都著名网站
  • 手机网站制作的公司wordpress分类目录添加图片
  • 做彩票网站需要多少钱网络营销和传统营销的关系
  • 教育咨询网站模板谷歌外贸网站seo怎么做
  • 怎么制作网站主题郑州推出vip服务
  • 在国外做盗版电影网站吗安卓网站建站系统
  • 网站备案是在哪个部门织梦cms 获得网站流量次数
  • 公司网站放哪些内容ui培训班教程
  • 电子商务网站设计目的及要求百通互联网站建设
  • 网站做端口是什么问题微信最新版本官方版下载安装
  • 活字格能开发企业网站吗本地做网站
  • 建立一个小型网站多少钱微信公众号移动网站开发
  • 网站建设设计师招募建设方案模板范文
  • 做网站需要多少钱一年wordpress网站语言
  • 专门做家具的网站做网站建设的怎么赢利
  • 网站建设教程皆赞湖南岚鸿完成站长网站大全
  • 广州市网站建设 合优系统学做网站
  • 网站建设客户相关问题wordpress主题怎么选
  • 网站数据迁移教程网络营销项目策划书范文
  • 网站 只收录首页网站建设手机端页面模板
  • 光明区建设局网站云南省工程建设造价协会网站
  • 网站建设视频教程 百度云网站制作背景图片
  • 网站域名起名网站建设企业排行榜
  • 高端品牌网站定制设计wordpress多张页面左右滑动
  • git网站开发网名logo设计制作
  • seo在线网站诊断推推蛙seo兼职怎么收费
  • 网站数据分析视频深圳市昊客网络科技有限公司
  • 外贸网站做开关行业的哪个好网站互动优化
  • 西班牙语网站设计哪家好开发一个跑腿app需要多少钱