⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawtriangle.as

📁 著名的flash 3d引擎 away 3d的源代码
💻 AS
📖 第 1 页 / 共 2 页
字号:
            _v1 = materialHeight * (1 - uv1._v);            _v2 = materialHeight * (1 - uv2._v);                  // Fix perpendicular projections            if ((_u0 == _u1 && _v0 == _v1) || (_u0 == _u2 && _v0 == _v2))            {            	if (_u0 > 0.05)                	_u0 -= 0.05;                else                	_u0 += 0.05;                	                if (_v0 > 0.07)                           	_v0 -= 0.07;                else                	_v0 += 0.07;            }                if (_u2 == _u1 && _v2 == _v1)            {            	if (_u2 > 0.04)                	_u2 -= 0.04;                else                	_u2 += 0.04;                	                if (_v2 > 0.06)                           	_v2 -= 0.06;                else                	_v2 += 0.06;            }                        if (material is BitmapMaterialContainer)            {            	invtexturemapping = new Matrix(_u1 - _u0, _v1 - _v0, _u2 - _u0, _v2 - _v0, _u0 - face.bitmapRect.x, _v0 - face.bitmapRect.y);            	texturemapping = invtexturemapping.clone();            	texturemapping.invert();            	return texturemapping;            }                        texturemapping = new Matrix(_u1 - _u0, _v1 - _v0, _u2 - _u0, _v2 - _v0, _u0, _v0);            texturemapping.invert();            return texturemapping;        }        		/**		 * @inheritDoc		 */        public override final function getZ(x:Number, y:Number):Number        {            if (projection == null)                return screenZ;            focus = projection.focus;            ax = v0.x;            ay = v0.y;            az = v0.z;            bx = v1.x;            by = v1.y;            bz = v1.z;            cx = v2.x;            cy = v2.y;            cz = v2.z;            if ((ax == x) && (ay == y))                return az;            if ((bx == x) && (by == y))                return bz;            if ((cx == x) && (cy == y))                return cz;            azf = az / focus;            bzf = bz / focus;            czf = cz / focus;            faz = 1 + azf;            fbz = 1 + bzf;            fcz = 1 + czf;            axf = ax*faz - x*azf;            bxf = bx*fbz - x*bzf;            cxf = cx*fcz - x*czf;            ayf = ay*faz - y*azf;            byf = by*fbz - y*bzf;            cyf = cy*fcz - y*czf;            det = axf*(byf - cyf) + bxf*(cyf - ayf) + cxf*(ayf - byf);            da = x*(byf - cyf) + bxf*(cyf - y) + cxf*(y - byf);            db = axf*(y - cyf) + x*(cyf - ayf) + cxf*(ayf - y);            dc = axf*(byf - y) + bxf*(y - ayf) + x*(ayf - byf);            return (da*az + db*bz + dc*cz) / det;        }				/**		 * Calulates the uv value of a precise point on the drawing primitive.		 * Used to determine the mouse position in interactive materials.		 * 		 * @param	x	The x position of the point to be tested.		 * @param	y	The y position of the point to be tested.		 * @return		The uv value.		 */        public function getUV(x:Number, y:Number):UV        {            if (uv0 == null)                return null;            if (uv1 == null)                return null;            if (uv2 == null)                return null;            au = uv0._u;            av = uv0._v;            bu = uv1._u;            bv = uv1._v;            cu = uv2._u;            cv = uv2._v;            focus = projection.focus;            ax = v0.x;            ay = v0.y;            az = v0.z;            bx = v1.x;            by = v1.y;            bz = v1.z;            cx = v2.x;            cy = v2.y;            cz = v2.z;            if ((ax == x) && (ay == y))                return uv0;            if ((bx == x) && (by == y))                return uv1;            if ((cx == x) && (cy == y))                return uv2;            azf = az / focus;            bzf = bz / focus;            czf = cz / focus;            faz = 1 + azf;            fbz = 1 + bzf;            fcz = 1 + czf;                                            axf = ax*faz - x*azf;            bxf = bx*fbz - x*bzf;            cxf = cx*fcz - x*czf;            ayf = ay*faz - y*azf;            byf = by*fbz - y*bzf;            cyf = cy*fcz - y*czf;            det = axf*(byf - cyf) + bxf*(cyf - ayf) + cxf*(ayf - byf);            da = x*(byf - cyf) + bxf*(cyf - y) + cxf*(y- byf);            db = axf*(y - cyf) + x*(cyf - ayf) + cxf*(ayf - y);            dc = axf*(byf - y) + bxf*(y - ayf) + x*(ayf - byf);            return new UV((da*au + db*bu + dc*cu) / det, (da*av + db*bv + dc*cv) / det);        }        		/**		 * @inheritDoc		 */        public override final function quarter(focus:Number):Array        {            if (area < 20)                return null;            v01 = ScreenVertex.median(v0, v1, focus);            v12 = ScreenVertex.median(v1, v2, focus);            v20 = ScreenVertex.median(v2, v0, focus);            uv01 = UV.median(uv0, uv1);            uv12 = UV.median(uv1, uv2);            uv20 = UV.median(uv2, uv0);            return [                create(face, material, projection, v0, v01, v20, uv0, uv01, uv20),                create(face, material, projection, v1, v12, v01, uv1, uv12, uv01),                create(face, material, projection, v2, v20, v12, uv2, uv20, uv12),                create(face, material, projection, v01, v12, v20, uv01, uv12, uv20)            ];        }        		/**		 * @inheritDoc		 */        public override final function contains(x:Number, y:Number):Boolean        {               if (v0.x*(y - v1.y) + v1.x*(v0.y - y) + x*(v1.y - v0.y) < -0.001)                return false;            if (v0.x*(v2.y - y) + x*(v0.y - v2.y) + v2.x*(y - v0.y) < -0.001)                return false;            if (x*(v2.y - v1.y) + v1.x*(y - v2.y) + v2.x*(v1.y - y) < -0.001)                return false;            return true;        }        public final function distanceToCenter(x:Number, y:Number):Number        {               var centerx:Number = (v0.x + v1.x + v2.x) / 3,                centery:Number = (v0.y + v1.y + v2.y) / 3;            return Math.sqrt((centerx-x)*(centerx-x) + (centery-y)*(centery-y));        }        		/**		 * @inheritDoc		 */        public override function calc():void        {        	if (v0.x > v1.x) {                if (v0.x > v2.x) maxX = v0.x;                else maxX = v2.x;            } else {                if (v1.x > v2.x) maxX = v1.x;                else maxX = v2.x;            }                        if (v0.x < v1.x) {                if (v0.x < v2.x) minX = v0.x;                else minX = v2.x;            } else {                if (v1.x < v2.x) minX = v1.x;                else minX = v2.x;            }                        if (v0.y > v1.y) {                if (v0.y > v2.y) maxY = v0.y;                else maxY = v2.y;            } else {                if (v1.y > v2.y) maxY = v1.y;                else maxY = v2.y;            }                        if (v0.y < v1.y) {                if (v0.y < v2.y) minY = v0.y;                else minY = v2.y;            } else {                if (v1.y < v2.y) minY = v1.y;                else minY = v2.y;            }                        if (v0.z > v1.z) {                if (v0.z > v2.z) maxZ = v0.z;                else maxZ = v2.z;            } else {                if (v1.z > v2.z) maxZ = v1.z;                else maxZ = v2.z;            }                        if (v0.z < v1.z) {                if (v0.z < v2.z) minZ = v0.z;                else minZ = v2.z;            } else {                if (v1.z < v2.z) minZ = v1.z;                else minZ = v2.z;            }                        screenZ = (v0.z + v1.z + v2.z) / 3;            area = 0.5 * (v0.x*(v2.y - v1.y) + v1.x*(v0.y - v2.y) + v2.x*(v1.y - v0.y));        }        		/**		 * @inheritDoc		 */        public override function toString():String        {            var color:String = "";            if (material is WireColorMaterial)            {                switch ((material as WireColorMaterial).color)                {                    case 0x00FF00: color = "green"; break;                    case 0xFFFF00: color = "yellow"; break;                    case 0xFF0000: color = "red"; break;                    case 0x0000FF: color = "blue"; break;                }            }            return "T{"+color+int(area)+" screenZ = " + num(screenZ) + ", minZ = " + num(minZ) + ", maxZ = " + num(maxZ) + " }";        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -