Home  >  Article  >  Web Front-end  >  HTML5 transform三维立方体实现360无死角三维旋转效果_html5教程技巧

HTML5 transform三维立方体实现360无死角三维旋转效果_html5教程技巧

WBOY
WBOYOriginal
2016-05-16 15:47:282233browse

为了更好得掌握transform的精髓,所以决定完成三维立方体的模型,可以实现360无死角的三维旋转效果。

但是旋转时判断每个面的视图顺序比较困难,仍未完美解决,希望有人能解答!

源码直接贡献啦:

复制代码
代码如下:


<script> <br />/** <br />* 本版本存在以下问题: <br />* 三维旋转的zIndex计算有问题 <br />* 还欠缺多种模型,常见的包括:线、面、椎体、球体、椭球体等。 <br />*/ <br />function cuboidModel(left_init,top_init,long_init,width_init,height_init) <br />{ <br />//////////////////////////////////////// <br />//初始化私有变量 <br />/////////////////////////////////////// <br />//初始化长方体位置、大小 <br />var left = left_init; <br />var top = top_init; <br />var long = long_init; <br />var width = width_init; <br />var height = height_init; <br />//初始化变换角度,默认为0 <br />var rotateX = 0; <br />var rotateY = 0; <br />var rotateZ = 0; <br />var zIndex = 0; <br />//定义长方体六个面的div对象 <br />var div_front; <br />var div_behind; <br />var div_left; <br />var div_right; <br />var div_top; <br />var div_bottom; <br /><br />//////////////////////////////////////// <br />//初始化长方体 <br />/////////////////////////////////////// <br />//根据初始位置构造六个面。 <br />this.init = function() { <br />//创建front div <br />div_front = document.createElement("div"); <br />div_front.className = "cuboid_side_div"; <br />div_front.innerHTML = "div front"; <br />div_front.style.backgroundColor="#f1b2b2"; <br />document.body.appendChild(div_front); <br />//创建behind div <br />div_behind = document.createElement("div"); <br />div_behind.className = "cuboid_side_div"; <br />div_behind.innerHTML = "div behind"; <br />div_behind.style.backgroundColor="#bd91eb"; <br />document.body.appendChild(div_behind); <br />//创建left div <br />div_left = document.createElement("div"); <br />div_left.className = "cuboid_side_div"; <br />div_left.innerHTML = "div left"; <br />div_left.style.backgroundColor="#64a3c3"; <br />document.body.appendChild(div_left); <br />//创建right div <br />div_right = document.createElement("div"); <br />div_right.className = "cuboid_side_div"; <br />div_right.innerHTML = "div right"; <br />div_right.style.backgroundColor="#78e797"; <br />document.body.appendChild(div_right); <br />//创建top div <br />div_top = document.createElement("div"); <br />div_top.className = "cuboid_side_div"; <br />div_top.innerHTML = "div top"; <br />div_top.style.backgroundColor="#e7db78"; <br />document.body.appendChild(div_top); <br />//创建bottom div <br />div_bottom = document.createElement("div"); <br />div_bottom.className = "cuboid_side_div"; <br />div_bottom.innerHTML = "div bottom"; <br />div_bottom.style.backgroundColor="#e79c78"; <br />document.body.appendChild(div_bottom); <br />this.refresh(); <br />}; <br />//重绘 <br />this.refresh = function() <br />{ <br />//定义div_front样式 <br />div_front.style.left = left+"px"; <br />div_front.style.top = top+"px"; <br />div_front.style.width = long +"px"; <br />div_front.style.height = height +"px"; <br />div_front.style.webkitTransformOrigin = "50% 50% "+((-1)*width / 2)+"px"; <br />//定义div_behind样式 <br />div_behind.style.left = left+"px"; <br />div_behind.style.top = top+"px"; <br />div_behind.style.width = div_front.style.width; <br />div_behind.style.height = div_front.style.height; <br />div_behind.style.webkitTransformOrigin = "50% 50% "+((-1)*width / 2)+"px"; <br />//定义div_left样式 <br />div_left.style.left = left+((long - height) / 2)+"px"; <br />div_left.style.top = top + ((height - width) / 2)+"px"; <br />div_left.style.width = height +"px"; <br />div_left.style.height = width +"px"; <br />div_left.style.webkitTransformOrigin = "50% 50% "+((-1) * long /2 )+"px"; <br />//定义div_right样式 <br />div_right.style.left = div_left.style.left; <br />div_right.style.top = div_left.style.top; <br />div_right.style.width = div_left.style.width; <br />div_right.style.height = div_left.style.height; <br />div_right.style.webkitTransformOrigin = "50% 50% "+((-1) * long /2 )+"px"; <br />//定义div_top样式 <br />div_top.style.left = left+"px"; <br />div_top.style.top = top+((height - width)/ 2)+"px"; <br />div_top.style.width = long +"px"; <br />div_top.style.height = width +"px"; <br />div_top.style.webkitTransformOrigin = "50% 50% "+((-1) * height /2 )+"px"; <br />//定义div_bottom样式 <br />div_bottom.style.left = div_top.style.left; <br />div_bottom.style.top = div_top.style.top; <br />div_bottom.style.width = div_top.style.width; <br />div_bottom.style.height = div_top.style.height; <br />div_bottom.style.webkitTransformOrigin = "50% 50% "+((-1) * height /2 )+"px"; <br />this.rotate(rotateX,rotateY,rotateZ); <br />}; <br />//旋转立方体 <br />this.rotate = function(x,y,z) { <br />rotateX = x; <br />rotateY = y; <br />rotateZ = z; <br />var rotateX_front = rotateX; <br />var rotateY_front = rotateY; <br />var rotateZ_front = rotateZ; <br />//判断各个面旋转角度 <br />var rotateX_behind = rotateX_front+180; <br />var rotateY_behind = rotateY_front * (-1); <br />var rotateZ_behind = rotateZ_front * (-1); <br />var rotateX_top = rotateX_front+90; <br />var rotateY_top = rotateZ_front; <br />var rotateZ_top = rotateY_front * (-1); <br />var rotateX_bottom = rotateX_front-90; <br />var rotateY_bottom = rotateZ_front * (-1); <br />var rotateZ_bottom = rotateY_front; <br />var rotateX_left = rotateX_front + 90; <br />var rotateY_left = rotateZ_front - 90; <br />var rotateZ_left = rotateY_front * (-1); <br />var rotateX_right = rotateX_front + 90; <br />var rotateY_right = rotateZ_front + 90; <br />var rotateZ_right = rotateY_front * (-1); <br />//判断各个面的z轴显示顺序 <br />var zIndex_front_default = -1; <br />var zIndex_behind_default = -6; <br />var zIndex_top_default = -5; <br />var zIndex_bottom_default = -2; <br />var zIndex_left_default = -4; <br />var zIndex_right_default = -3; <br />var xI = (rotateX_front / 90) % 4; <br />var yI = (rotateY_front / 90) % 4; <br />var zI = (rotateZ_front / 90) % 4; <br />var zIndex_matrix = new Array(); <br />for(var i = 0; i < 3;i++) { <br />zIndex_matrix.push(new Array()); <br />} <br />zIndex_matrix = [["","zIndex_top",""], <br />["zIndex_left","zIndex_front","zIndex_right"], <br />["","zIndex_bottom",""]]; <br />var zIndex_matrix_behind = "zIndex_behind"; <br />//计算zIndex <br />if((xI >= 0 && xI < 1) ||(xI >= -4 && xI < -3)) { <br />} else if((xI >= 1 && xI < 2) ||(xI >= -3 && xI < -2)) { <br />var zIndex_matrix_tmp = zIndex_matrix[0][1]; <br />zIndex_matrix[0][1] = zIndex_matrix[1][1]; <br />zIndex_matrix[1][1] = zIndex_matrix[1][2]; <br />zIndex_matrix[1][2] = zIndex_matrix_behind; <br />zIndex_matrix_behind = zIndex_matrix_tmp; <br />} else if((xI >= 2 && xI < 3) ||(xI >= -2 && xI < -1)) { <br />var zIndex_matrix_tmp = zIndex_matrix[0][1]; <br />zIndex_matrix[0][1] = zIndex_matrix[2][1]; <br />zIndex_matrix[2][1] = zIndex_matrix_tmp; <br />zIndex_matrix_tmp = zIndex_matrix[1][1]; <br />zIndex_matrix[1][1] = zIndex_matrix_behind; <br />zIndex_matrix_behind = zIndex_matrix_tmp; <br />} else if((xI >= 3 && xI < 4) ||(xI >= -1 && xI < 0)) { <br />var zIndex_matrix_tmp = zIndex_matrix[0][1]; <br />zIndex_matrix[0][1] = zIndex_matrix_behind; <br />zIndex_matrix_behind = zIndex_matrix[2][1]; <br />zIndex_matrix[2][1] = zIndex_matrix[1][1]; <br />zIndex_matrix[1][1] = zIndex_matrix_tmp; <br />} <br />if((yI > 0 && yI <= 1) ||(yI > -4 && yI <= -3)) { <br />var zIndex_matrix_tmp = zIndex_matrix[1][0]; <br />zIndex_matrix[1][0] = zIndex_matrix_behind; <br />zIndex_matrix_behind = zIndex_matrix[1][2]; <br />zIndex_matrix[1][2] = zIndex_matrix[1][1]; <br />zIndex_matrix[1][1] = zIndex_matrix_tmp; <br />} else if((yI > 1 && yI <= 2) ||(yI > -3 && yI <= -2)) { <br />var zIndex_matrix_tmp = zIndex_matrix[1][0]; <br />zIndex_matrix[1][0] = zIndex_matrix[1][2]; <br />zIndex_matrix[1][2] = zIndex_matrix_tmp; <br />zIndex_matrix_tmp = zIndex_matrix[1][1]; <br />zIndex_matrix[1][1] = zIndex_matrix_behind; <br />zIndex_matrix_behind = zIndex_matrix_tmp; <br />} else if((yI > 2 && yI <= 3) ||(yI > -2 && yI <= -1)) { <br />var zIndex_matrix_tmp = zIndex_matrix[1][0]; <br />zIndex_matrix[1][0] = zIndex_matrix[1][1]; <br />zIndex_matrix[1][1] = zIndex_matrix[1][2]; <br />zIndex_matrix[1][2] = zIndex_matrix_behind; <br />zIndex_matrix_behind = zIndex_matrix_tmp; <br />} else if((yI > 3 && yI <= 4) ||(yI > -1 && yI <= 0)) { <br />} <br /><br />if((zI > 0 && zI <= 1) ||(zI > -4 && zI <= -3)) { <br />var zIndex_matrix_tmp = zIndex_matrix[0][1]; <br />zIndex_matrix[0][1] = zIndex_matrix[1][0]; <br />zIndex_matrix[1][0] = zIndex_matrix[2][1]; <br />zIndex_matrix[2][1] = zIndex_matrix[1][2]; <br />zIndex_matrix[1][2] = zIndex_matrix_tmp; <br />} else if((zI > 1 && zI <= 2) ||(zI > -3 && zI <= -2)) { <br />var zIndex_matrix_tmp = zIndex_matrix[0][1]; <br />zIndex_matrix[0][1] = zIndex_matrix[2][1]; <br />zIndex_matrix[2][1] = zIndex_matrix_tmp; <br />zIndex_matrix_tmp = zIndex_matrix[1][0]; <br />zIndex_matrix[1][0] = zIndex_matrix[1][2]; <br />zIndex_matrix[1][2] = zIndex_matrix_tmp; <br />} else if((zI > 2 && zI <= 3) ||(zI > -2 && zI <= -1)) { <br />var zIndex_matrix_tmp = zIndex_matrix[0][1]; <br />zIndex_matrix[0][1] = zIndex_matrix[1][2]; <br />zIndex_matrix[1][2] = zIndex_matrix[2][1]; <br />zIndex_matrix[2][1] = zIndex_matrix[1][0]; <br />zIndex_matrix[1][0] = zIndex_matrix_tmp; <br />} else if((zI > 3 && zI <= 4) ||(zI > -1 && zI <= 0)) { <br />} <br />//赋值zIndex <br />eval(zIndex_matrix[0][1]+"="+zIndex_top_default); <br />eval(zIndex_matrix[1][0]+"="+zIndex_left_default); <br />eval(zIndex_matrix[1][1]+"="+zIndex_front_default); <br />eval(zIndex_matrix[1][2]+"="+zIndex_right_default); <br />eval(zIndex_matrix[2][1]+"="+zIndex_bottom_default); <br />eval(zIndex_matrix_behind+"="+zIndex_behind_default); <br />//front <br />var transform_rotate_front = "perspective(500px) rotateX("+rotateX_front+ <br />"deg) rotateY("+rotateY_front+ <br />"deg) rotateZ("+rotateZ_front+"deg)"; <br />div_front.style.webkitTransform = transform_rotate_front; <br />div_front.style.zIndex = zIndex_front; <br />//behind <br />var transform_rotate_behind = "perspective(500px) rotateX("+rotateX_behind+ <br />"deg) rotateY("+rotateY_behind+ <br />"deg) rotateZ("+rotateZ_behind+"deg)"; <br />div_behind.style.webkitTransform = transform_rotate_behind; <br />div_behind.style.zIndex = zIndex_behind; <br />//left <br />var transform_rotate_left = "perspective(500px) rotateX("+rotateX_left+ <br />"deg) rotateZ("+rotateZ_left+ <br />"deg) rotateY("+rotateY_left+"deg)"; <br />div_left.style.webkitTransform = transform_rotate_left; <br />div_left.style.zIndex = zIndex_left; <br />//right <br />var transform_rotate_right = "perspective(500px) rotateX("+rotateX_right+ <br />"deg) rotateZ("+rotateZ_right+ <br />"deg) rotateY("+rotateY_right+"deg)"; <br />div_right.style.webkitTransform = transform_rotate_right; <br />div_right.style.zIndex = zIndex_right; <br />//top <br />var transform_rotate_top = "perspective(500px) rotateX("+rotateX_top+ <br />"deg) rotateZ("+rotateZ_top+ <br />"deg) rotateY("+rotateY_top+"deg)"; <br />div_top.style.webkitTransform = transform_rotate_top; <br />div_top.style.zIndex = zIndex_top; <br />//bottom <br />var transform_rotate_bottom = "perspective(500px) rotateX("+rotateX_bottom+ <br />"deg) rotateZ("+rotateZ_bottom+ <br />"deg) rotateY("+rotateY_bottom+"deg)"; <br />div_bottom.style.webkitTransform = transform_rotate_bottom; <br />div_bottom.style.zIndex = zIndex_bottom; <br />}; <br />//重置长方体的长、宽、高 <br />this.resize = function(new_long, new_width, new_height) <br />{ <br />long = new_long; <br />width = new_width; <br />height = new_height; <br />this.refresh(); <br />}; <br />//重置长方体的位置 <br />this.move = function(new_left,new_top) { <br />top = new_top; <br />left = new_left; <br />this.refresh(); <br />}; <br />} <br /><br />function transform() { <br />cuboid.resize(parseInt(document.getElementById("long").value), <br />parseInt(document.getElementById("width").value), <br />parseInt(document.getElementById("height").value)); <br />cuboid.move(parseInt(document.getElementById("left").value), <br />parseInt(document.getElementById("top").value)); <br />cuboid.rotate(parseInt(document.getElementById("rotatex").value), <br />parseInt(document.getElementById("rotatey").value), <br />parseInt(document.getElementById("rotatez").value)); <br />//cuboid.refresh(); <br />} <br /></script>

left:px

top:px

long:px

width:px

height:px

rotateX: deg

rotateY: deg

rotateZ: deg





<script> <br />var cuboid = new cuboidModel(parseInt(document.getElementById("left").value), <br />parseInt(document.getElementById("top").value), <br />parseInt(document.getElementById("long").value), <br />parseInt(document.getElementById("width").value), <br />parseInt(document.getElementById("height").value)); <br />cuboid.init(); <br /></script>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn