商域无疆 (http://blog.csdn.net/omni360/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化、GOLANG、Html5、WEBGL、THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

俺也是刚開始学,好多地儿肯定不正确还请见谅.

下面代码是THREE.JS 源代码文件里Math/Frustum.js文件的凝视.

很多其它更新在 : https://github.com/omni360/three.js.sourcecode/blob/master/Three.js

// File:src/math/Frustum.js

/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author bhouston / http://exocortex.com
*/
/*
///Frustum对象的构造函数.用来在三维空间内创建一个平截头体对象.Frustum对象的功能函数採用
///定义构造的函数原型对象来实现,平截头体由6个平面对象构成.
*/
///<summary>Frustum</summary>
///<param name ="p0" type="THREE.Plane">组成平截头体的面p0</param>
///<param name ="p1" type="THREE.Plane">组成平截头体的面p1</param>
///<param name ="p2" type="THREE.Plane">组成平截头体的面p2</param>
///<param name ="p3" type="THREE.Plane">组成平截头体的面p3</param>
///<param name ="p4" type="THREE.Plane">组成平截头体的面p4</param>
///<param name ="p5" type="THREE.Plane">组成平截头体的面p5</param>
THREE.Frustum = function ( p0, p1, p2, p3, p4, p5 ) { this.planes = [ ( p0 !== undefined ) ? p0 : new THREE.Plane(),
( p1 !== undefined ) ? p1 : new THREE.Plane(),
( p2 !== undefined ) ? p2 : new THREE.Plane(),
( p3 !== undefined ) ? p3 : new THREE.Plane(),
( p4 !== undefined ) ? p4 : new THREE.Plane(),
( p5 !== undefined ) ? p5 : new THREE.Plane() ]; }; /****************************************
****以下是Frustum对象提供的功能函数.
****************************************/
THREE.Frustum.prototype = { constructor: THREE.Frustum, //构造器,返回对创建此对象的Frustum函数的引用 /*
///set方法用来又一次设置平截头体的起始点,结束点,p0, p1, p2, p3, p4, p5.并返回新的坐标值的平截头体.
*/
///<summary>set</summary>
///<param name ="p0" type="THREE.Plane">组成平截头体的面p0</param>
///<param name ="p1" type="THREE.Plane">组成平截头体的面p1</param>
///<param name ="p2" type="THREE.Plane">组成平截头体的面p2</param>
///<param name ="p3" type="THREE.Plane">组成平截头体的面p3</param>
///<param name ="p4" type="THREE.Plane">组成平截头体的面p4</param>
///<param name ="p5" type="THREE.Plane">组成平截头体的面p5</param>
///<returns type="Frustum">返回新的平截头体</returns>
set: function ( p0, p1, p2, p3, p4, p5 ) { var planes = this.planes; planes[ 0 ].copy( p0 );
planes[ 1 ].copy( p1 );
planes[ 2 ].copy( p2 );
planes[ 3 ].copy( p3 );
planes[ 4 ].copy( p4 );
planes[ 5 ].copy( p5 ); return this; //返回新的平截头体 }, /*
///copy方法用来复制组成平截头体的六个面,p0, p1, p2, p3, p4, p5.并返回新的平截头体.
*/
///<summary>copy</summary>
///<param name ="frustum" type="Frustum">平截头体</param>
///<returns type="Frustum">返回新的平截头体</returns>
copy: function ( frustum ) { var planes = this.planes; for ( var i = 0; i < 6; i ++ ) { planes[ i ].copy( frustum.planes[ i ] ); } return this; //返回新的平截头体 }, /*
///setFromMatrix方法通过对当前平截头体应用变换,返回新的平截头体.
*/
///<summary>setFromMatrix</summary>
///<param name ="m" type="Matrix4">4x4矩阵</param>
///<returns type="Frustum">返回新的平截头体</returns>
setFromMatrix: function ( m ) { var planes = this.planes;
var me = m.elements;
var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); return this; //返回新的平截头体 }, /*
///intersectsObject方法获取当前平截头体是否与參数object对象相交,返回true 或者 false
*/
///<summary>intersectsObject</summary>
///<param name ="object" type="Object3d">3d立体对象</param>
///<returns type="Boolean">返回true 或者 false</returns>
intersectsObject: function () { var sphere = new THREE.Sphere(); return function ( object ) { var geometry = object.geometry; if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); sphere.copy( geometry.boundingSphere );
sphere.applyMatrix4( object.matrixWorld ); return this.intersectsSphere( sphere ); //返回true 或者 false }; }(), /*
///intersectsSphere方法获取当前平截头体是否与參数sphere球体对象相交,返回true 或者 false
*/
///<summary>intersectsSphere</summary>
///<param name ="sphere" type="Sphere">一个Sphere的球体</param>
///<returns type="Boolean">返回true 或者 false</returns>
intersectsSphere: function ( sphere ) { var planes = this.planes;
var center = sphere.center;
var negRadius = - sphere.radius; for ( var i = 0; i < 6; i ++ ) { var distance = planes[ i ].distanceToPoint( center ); if ( distance < negRadius ) { return false; //不相交返回false } } return true; //相交返回true }, /*
///intersectsBox方法获取当前平截头体是否与參数box立方体对象相交,返回true 或者 false
*/
///<summary>intersectsBox</summary>
///<param name ="box" type="Box3">立方体对象</param>
///<returns type="Boolean">返回true 或者 false</returns>
intersectsBox: function () { var p1 = new THREE.Vector3(),
p2 = new THREE.Vector3(); return function ( box ) { var planes = this.planes; for ( var i = 0; i < 6 ; i ++ ) { var plane = planes[ i ]; p1.x = plane.normal.x > 0 ? box.min.x : box.max.x;
p2.x = plane.normal.x > 0 ? box.max.x : box.min.x;
p1.y = plane.normal.y > 0 ? box.min.y : box.max.y;
p2.y = plane.normal.y > 0 ? box.max.y : box.min.y;
p1.z = plane.normal.z > 0 ? box.min.z : box.max.z;
p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; var d1 = plane.distanceToPoint( p1 );
var d2 = plane.distanceToPoint( p2 ); // if both outside plane, no intersection
// 假设立方体的p1,p2都与平面不想交,表示立方体和平截头体不相交. if ( d1 < 0 && d2 < 0 ) { return false; //不相交返回false }
} return true; //相交返回true.
}; }(), /*
///containsPoint方法用来获得參数point(一个Vector3的三维点坐标)是否在当前平截头体内.
*/
///<summary>containsPoint</summary>
///<param name ="point" type="THREE.Vector3">一个Vector3的三维点坐标</param>
///<returns type="Boolean">返回true 或者 false</returns>
containsPoint: function ( point ) { var planes = this.planes; for ( var i = 0; i < 6; i ++ ) { if ( planes[ i ].distanceToPoint( point ) < 0 ) { return false; //不在边界内,返回false } } return true; //在边界内,返回true }, /*clone方法
///clone方法克隆一个平截头体对象.
*/
///<summary>clone</summary>
///<returns type="Frustum">返回平截头体对象</returns>
clone: function () { return new THREE.Frustum().copy( this ); //返回平截头体对象 } };

商域无疆 (http://blog.csdn.net/omni360/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化、GOLANG、Html5、WEBGL、THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

下面代码是THREE.JS 源代码文件里Math/Frustum.js文件的凝视.

很多其它更新在 : https://github.com/omni360/three.js.sourcecode/blob/master/Three.js

three.js 源代码凝视(十六)Math/Frustum.js的更多相关文章

  1. three.js 源代码凝视(十四)Math/Sphere.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  2. three.js 源代码凝视(十)Math/Line3.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  3. three.js 源代码凝视(十五)Math/Plane.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  4. three.js 源代码凝视(九)Math/Matrix4.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  5. three.js 源代码凝视(七)Math/Euler.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  6. Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用

    一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见   function setTabVisableByName( ...

  7. 简单介绍无限轮播图,js源代码

    无限轮播图js源代码,今天介绍一下用js简单的编写无限轮播图 <!DOCTYPE html> <html>   <head>     <meta charse ...

  8. js上 十六、数组-2

    十六.数组-2 #4.3万能法:splice(): #4.3.1.删除功能 ​ 语法:arr.splice(index,num); //num表示删除的长度 ​ 功能:从下标index位置开始,删除n ...

  9. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

随机推荐

  1. spring中间scope详细解释

    0.思维导图 1. scope概论 spring中scope是一个很关键的概念.简单说就是对象在spring容器(IOC容器)中的生命周期,也能够理解为对象在spring容器中的创建方式. 2. sc ...

  2. 金蝶K3管理软件PDA条码解决方式,盘点机与金蝶K3无缝对接

    申明:以上文字为"武汉汉码科技有限公司"原创,转载时务必注明出处. 技术分享,沟通你我,共同进步!www.hanma-scan.com 原帖:http://www.hanma-sc ...

  3. CPU 风扇清理灰尘加油全过程图解

    主机电源风扇因为使用时间长,风扇轴承的润滑油耗尽,导致风扇转速下降或是不转,引起电源热量无法有效排除而造成电脑常常死机,解决的方法有几种. 现图讲解明最简单省钱的办法例如以下: 1.把电源从主机上拆下 ...

  4. 设计模式(Facade)状态(注意事项)

    外观模式(Facade),子系统的一组接口提供一个一致的界面,该模式定义了一个高层次接口,这个接口使得这一子系统更加easy采用. 外观模式完美地体现了依赖反转原则,迪米特法则的想法,式之中的一个. ...

  5. avalonjs1.5 入门教程

    迷你MVVM框架 avalonjs1.5 入门教程 avalon经过几年以后,已成为国内一个举足轻重的框架.它提供了多种不同的版本,满足不同人群的需要.比如avalon.js支持IE6等老旧浏览器,让 ...

  6. [android更新类的内容开发APP]四、项目布局的基本功能(继续)

    昨天,只拿到电脑,别说,眼泪 http://joveth.github.io/funny/ 1.选项卡的滑动效果 要知道.用这个选项卡就是想让它滑动起来,不然的话.我才不喜欢用它呢. 在让他滑动之前, ...

  7. Deep Learning Papers

    一.Image Classification(Recognition) lenet: http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf alexn ...

  8. 使用 CodeIgniter 框架快速开发 PHP 应用(七)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(七) CodeIgniter 和对象这是玩家章节.它讲述的是 CodeIgniter 的工作原理,也就是揭开CI头上'神秘的面纱'.如果 ...

  9. js中document.write()使用方法

    <script>             var hrf = window.location.href;           if(hrf.indexOf('change')>0){ ...

  10. 堆C数组实现

    堆栈是一个最后出来该数据结构. 栈的基本操作包含:入栈,出栈,初始化栈,清空栈,遍历栈. C代码例如以下: #include <stdio.h> #define MaxSize 20 ty ...