import {MathUtil} from './MathUtil'; import {MatrixUtil} from './MatrixUtil'; import {Point3} from './Point3'; //========================================================== // 空间视截体。 // // @struct // @author maocy // @version 150116 //========================================================== export class SFrustum { // //.......................................................... // // 中心点 // public center = new Point3(); // // 半径 // public radius = null; // // 最小X坐标 // public minX = null; // // 最大X坐标 // public maxX = null; // // 最小Y坐标 // public minY = null; // // 最大Y坐标 // public maxY = null; // // 最小Z坐标 // public minZ = null; // // 最大Z坐标 // public maxZ = null; // // 顶点集合 // public points = new Array(24); // public coners = new Array(24); // //============================================================ // // 更新中心 // // // // @method // //============================================================ // public updateCenter() { // // 计算空间内位置 // var cs = this.coners; // this.minX = this.minY = this.minZ = Number.MAX_VALUE; // this.maxX = this.maxY = this.maxZ = -Number.MAX_VALUE; // var i = 0; // while (i < 24) { // var x = cs[i++]; // if (x < this.minX) { // this.minX = x; // } // if (x > this.maxX) { // this.maxX = x; // } // var y = cs[i++]; // if (y < this.minY) { // this.minY = y; // } // if (y > this.maxY) { // this.maxY = y; // } // var z = cs[i++]; // if (z < this.minZ) { // this.minZ = z; // } // if (z > this.maxZ) { // this.maxZ = z; // } // } // // 计算中心位置 // this.center.x = (this.minX + this.maxX) * 0.5; // this.center.y = (this.minY + this.maxY) * 0.5; // this.center.z = (this.minZ + this.maxZ) * 0.5; // // 计算半径 // var cx = this.maxX - this.minX; // var cy = this.maxY - this.minY; // var cz = this.maxZ - this.minZ; // this.radius = Math.sqrt(cx * cx + cy * cy + cz * cz) * 0.5; // } // //============================================================ // // 更新处理 // // // // @param pva:viewportAngle 视角角度 // // @param pvw:viewportWidth 视角宽度 // // @param pvh:viewportHeight 视角高度 // // @param pvn:viewportNear 视角近平面 // // @param pvf:viewportFar 视角远平面 // // @param pfr:frontRate 前平面比率 // // @param pbr:backRate 后平面比率 // // @param pm:matrix:SMatrix4x4 矩阵 // //============================================================ // public update(pva, pvw, pvh, pvn, pvf, pfr, pbr, pm) { // // 计算视角信息 // var aspect = pvw / pvh; // //var znear = -pvf * pbr; // var znear = pvn; // //var zfar = pvf * pfr; // var zfar = pvf; // var fov = Math.tan(MathUtil.DEGREE_RATE * pva * 0.5); // var nearY = znear * fov; // var nearX = nearY * aspect; // var farY = zfar * fov; // var farX = farY * aspect; // // 设置空间坐标 // var ps = this.points; // ps[0] = -nearX; // ps[1] = nearY; // ps[2] = znear; // ps[3] = nearX; // ps[4] = nearY; // ps[5] = znear; // ps[6] = nearX; // ps[7] = -nearY; // ps[8] = znear; // ps[9] = -nearX; // ps[10] = -nearY; // ps[11] = znear; // ps[12] = -farX; // ps[13] = farY; // ps[14] = zfar; // ps[15] = farX; // ps[16] = farY; // ps[17] = zfar; // ps[18] = farX; // ps[19] = -farY; // ps[20] = zfar; // ps[21] = -farX; // ps[22] = -farY; // ps[23] = zfar; // // 设置转换矩阵 // var matrix = MatrixUtil.matrix; // matrix.assign(pm); // matrix.invert(); // // matrix.transform(this.coners, ps, 8); // // 计算空间内位置 // this.updateCenter(); // } // //============================================================ // // 更新处理 // // // // @param pva:viewportAngle 视角角度 // // @param pvw:viewportWidth 视角宽度 // // @param pvh:viewportHeight 视角高度 // // @param pvn:viewportNear 视角近平面 // // @param pvf:viewportFar 视角远平面 // // @param pfr:frontRate 前平面比率 // // @param pbr:backRate 后平面比率 // // @param pm:matrix:SMatrix4x4 矩阵 // //============================================================ // public updateFlat(pva, pvw, pvh, pvn, pvf, pfr, pbr, pm) { // // 计算视角信息 // var aspect = pvw / pvh; // var znear = pvn * pbr; // //var znear = pvn; // var zfar = pvf * pfr; // //var zfar = pvf; // var fov = Math.tan(MathUtil.DEGREE_RATE * pva * 0.5); // var nearY = znear * fov; // var nearX = nearY * aspect; // var farY = zfar * fov; // var farX = farY * aspect; // // 设置空间坐标 // var ps = this.points; // ps[0] = -nearX; // ps[1] = nearY; // ps[2] = znear; // ps[3] = nearX; // ps[4] = nearY; // ps[5] = znear; // ps[6] = nearX; // ps[7] = -nearY; // ps[8] = znear; // ps[9] = -nearX; // ps[10] = -nearY; // ps[11] = znear; // ps[12] = -farX; // ps[13] = farY; // ps[14] = zfar; // ps[15] = farX; // ps[16] = farY; // ps[17] = zfar; // ps[18] = farX; // ps[19] = -farY; // ps[20] = zfar; // ps[21] = -farX; // ps[22] = -farY; // ps[23] = zfar; // // 设置转换矩阵 // var m = MatrixUtil.matrix; // m.assign(pm); // m.invert(); // // m.transform(this.coners, 0, ps, 0, 8); // this.coners[1] = 0.0; // this.coners[4] = 0.0; // this.coners[7] = 0.0; // this.coners[10] = 0.0; // this.coners[13] = 0.0; // this.coners[16] = 0.0; // this.coners[19] = 0.0; // this.coners[22] = 0.0; // // 计算空间内位置 // this.updateCenter(); // } }