PerspectiveTransform实现三维地球自转动画效果代码

代码语言:html

所属分类:三维

代码描述:PerspectiveTransform实现三维地球自转动画效果代码

代码标签: 地球 自转 动画 效果

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开


<!DOCTYPE html>
<html lang="en" >

<head>

 
<meta charset="UTF-8">
 



 
 
<link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Oswald:400'>
 
<style>
html
, body {
 
position: absolute;
 
width: 100%;
 
height: 100%;
 
margin: 0 0;
 
overflow: hidden;
 
font-family: 'Lato', sans-serif;
 
background-color: #000;
 
color: #fff;
}

.world {
 
position: absolute;
 
width: 100%;
 
height: 100%;
 
cursor: pointer;
 
cursor: move;
 
cursor: -moz-grab;
 
cursor: -webkit-grab;
 
cursor: grab;
}

.world-bg {
 
position: absolute;
 
width: 100%;
 
height: 100%;
 
background-position: 50% 50%;
 
background-size: cover;
}

.world-globe {
 
position: absolute;
 
left: 50%;
 
top: 50%;
 
width: 0;
 
height: 0;
}

.world-globe-pole {
 
position: absolute;
 
width: 530px;
 
height: 530px;
 
left: -265px;
 
top: -265px;
 
border-radius: 50% 50%;
 
background-color: #fff;
}

.world-globe-doms-container {
 
position: absolute;
 
left: 50%;
 
top: 50%;
 
width: 0;
 
height: 0;
}

.world-globe-halo {
 
position: absolute;
 
left: 50%;
 
top: 50%;
 
width: 730px;
 
height: 715px;
 
margin-left: -368px;
 
margin-top: -350px;
}

.info {
 
position: absolute;
 
left: 0;
 
bottom: 0;
 
width: 100%;
 
padding: 10px 10px;
 
box-sizing: border-box;
 
background-color: rgba(0, 0, 0, 0.8);
 
color: #fff;
 
font-size: 12px;
}

.info-desc {
 
color: #ddd;
 
font-size: 10px;
}

a
{
 
color: #ff5f5f;
}
</style>



</head>

<body >
 
<div class="world">
   
<div class="world-bg"></div>
   
<div class="world-globe">
       
<div class="world-globe-pole"></div>
       
<div class="world-globe-doms-container"></div>
       
<div class="world-globe-halo"></div>
   
</div>
</div>

<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/dat.gui-min.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/stats-min.js"></script>
<script>
    (function (define) {
    define(function(){

function PerspectiveTransform(element, width, height, useBackFacing){

    this.element = element;
    this.style = element.style;
    this.computedStyle = window.getComputedStyle(element);
    this.width = width;
    this.height = height;
    this.useBackFacing = !!useBackFacing;

    this.topLeft = {x: 0, y: 0};
    this.topRight = {x: width, y: 0};
    this.bottomLeft = {x: 0, y: height};
    this.bottomRight = {x: width, y: height};
    this.calcStyle = '';
}

PerspectiveTransform.useDPRFix = false;
PerspectiveTransform.dpr = 1;

PerspectiveTransform.prototype = (function(){

    var app = {
        stylePrefix: ''
    };

    var aM = [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]];
    var bM = [0, 0, 0, 0, 0, 0, 0, 0];

    function _setTransformStyleName(){
        var testStyle = document.createElement('div').style;
        app.stylePrefix =
            'webkitTransform' in testStyle ? 'webkit' :
            'MozTransform' in testStyle ? 'Moz' :
            'msTransform' in testStyle ? 'ms' :
            '';
        PerspectiveTransform.transformStyleName = app.stylePrefix + (app.stylePrefix.length>0?'Transform':'transform');
        PerspectiveTransform.transformDomStyleName = '-'+app.stylePrefix.toLowerCase()+'-transform';
        PerspectiveTransform.transformOriginStyleName = app.stylePrefix + (app.stylePrefix.length>0?'TransformOrigin':'transformOrigin');
        PerspectiveTransform.transformOriginDomStyleName = '-'+app.stylePrefix.toLowerCase()+'-transform-origin';
    }


    // Check the distances between each points and if there is some points with the distance lequal to or less than 1 pixel, then return true. Otherwise return false;
    function _hasDistancesError(){
        var lenX = this.topLeft.x - this.topRight.x;
        var lenY = this.topLeft.y - this.topRight.y;
        if(Math.sqrt(lenX * lenX +  lenY * lenY)<=1) return true;
        lenX = this.bottomLeft.x - this.bottomRight.x;
        lenY = this.bottomLeft.y - this.bottomRight.y;
        if(Math.sqrt(lenX * lenX +  lenY * lenY)<=1) return true;
        lenX = this.topLeft.x - this.bottomLeft.x;
        lenY = this.topLeft.y - this.bottomLeft.y;
        if(Math.sqrt(lenX * lenX +  lenY * lenY)<=1) return true;
        lenX = this.topRight.x - this.bottomRight.x;
        lenY = this.topRight.y - this.bottomRight.y;
        if( Math.sqrt(lenX * lenX +  lenY * lenY)<=1) return true;
        lenX = this.topLeft.x - this.bottomRight.x;
        lenY = this.topLeft.y - this.bottomRight.y;
        if( Math.sqrt(lenX * lenX +  lenY * lenY)<=1) return true;
        lenX = this.topRight.x - this.bottomLeft.x;
        lenY = this.topRight.y - this.bottomLeft.y;
        if( Math.sqrt(lenX * lenX +  lenY * lenY)<=1) return true;

        return false;
    }

    // Get the determinant of given 3 points
    function _getDeterminant(p0, p1, p2){
        return p0.x * p1.y + p1.x * p2.y + p2.x * p0.y - p0.y * p1.x - p1.y * p2.x - p2.y * p0.x;
    }

    // Return true if it is a concave polygon or if it is backfacing when the useBackFacing property is false. Otehrwise return true;
    function _hasPolyonError(){
        var det1 = _getDeterminant(this.topLeft, this.topRight, this.bottomRight);
        var det2 = _getDeterminant(this.bottomRight, this.bottomLeft, this.topLeft);
        if(this.useBackFacing){
            if(det1*det2<=0) return true;
        }else{
            if(det1<=0||det2<=0) return true;
        }
        var det1 = _getDeterminant(this.topRight, this.bottomRight, this.bottomLeft);
        var det2 = _getDeterminant(this.bottomLeft, this.topLeft, this.topRight);
        if(this.useBackFacing){
            if(det1*det2<=0) return true;
        }else{
            if(det1<=0||det2<=0) return true;
        }
        return false;
    }

    function checkError(){
        if(_hasDistancesError.apply(this)) return 1; // Points are too close to each other.
        if(_hasPolyonError.apply(this)) return 2; // Concave or backfacing if the useBackFacing property is false
        return 0; // no error
    }

    function calc() {
        var width = this.width;
        var height = this.height;

        //  get the offset from the transfrom origin of the element
        var off.........完整代码请登录后点击上方下载按钮下载查看

网友评论0