前言
准备
transform-origin:元素变形的原点(默认值为 50% 50% 0,该数值和后续提及的百分比均默认基于元素自身的宽高算出具体数值); -perspective: 指定了观察者与z=0平面的距离,使具有三维位置变换的元素产生透视效果。(默认值:none,值只能是绝对长度,即负数是非法值);
transform-style:用于指定其为子元素提供2D还是3D的场景。另外,该属性是非继承的;
transform:该属性能让你修改CSS可视化模型的坐标空间,其中包括 平移(translate)、旋转(rotate)、缩放(scale) 和 扭曲(skew)。
对于
perspective
,该属性指定了“眼睛”与元素的perspective-origin
(默认值是50% 50%
)点的距离。那么问题来了:“当我们应用px
作为衡量单位时,那它的实际距离该如何量化呢(即如何得到我们熟悉且易于表达的距离)?”
答:当我们的屏幕的分辨率是1080P(1920*1080px),且该元素或祖先元素的perspective值是1920px
时,该应用了CSS3 3D transform 的元素的立体效果就相当于我们在距离一个屏幕宽度(1920px)的屏幕前观看该元素的真实效果。尽管如此,目前我也不清楚如何准确地为元素设置一个合适的perspective
值,只能猜测个大概值,然后再动态修改值,以达到满意的呈现效果。
根据相似三角形的性质可计算出被前移的元素最终在屏幕上显示的实际大小另外,关于
perspective
还有另外一个重要的点。因为,perspective-origin的默认值是50% 50%
,因此,对哪个元素应用perspective
属性,就决定了“眼睛”的位置(即我们的“眼睛”是在哪个角度看物体)。一般来说,当我们需要正视物体时,就会将该属性设置在与该元素中心重合的某一祖先元素上。再另外,如果说:“如何让一个元素(的背面)不可见?”,你可能会说
backface-visibility:hidden;
。其实,对于在“眼睛”背后的元素(以元素的transform-origin
为参考点),即元素的z轴坐标值大于 perspective 的值,浏览器是不会将其渲染出来的。对于
transform-style
,该属性指定了其子元素是处于3D场景还是2D场景。对于2D场景,元素的前后位置是按照平时的渲染方式(即若在普通文档流中,是按照代码中元素的先后顺序,后面的元素会遮住在其前面的元素);对于3D场景,元素的前后位置则按照真实世界的规则排序(即越靠近“眼睛”的,会遮住离“眼睛”更远的元素)。另外,由于
transform-style
属性是非继承的,对于中间节点需要显式设定。对于
transform
属性:下图整理了rotate3d、translate3d的变换方向:
transform中的变换属性的顺序是有关系的,如translateX(10px) rotate(30deg) 与 rotate(30deg) translateX(10px)是不等价的。另外,需要注意的是 scale 中如果有负数值,则该方向会产生180度的翻转;
再另外,部分transform效果会导致元素(字体)模糊,如translate的数值存在小数、通过translateZ或scale放大元素等等。每个浏览器都有其不同的表现。
实现
function calTranslateZ(opts) {
return Math.round(opts.width / (2 * Math.tan(Math.PI / opts.number)))
}
calTranlateZ({
width: 210,
number: 9
}); // 288
#view(perspective:1000px)
#stage(transform-style:preserve-3d)
#cube(transform-style:preserve-3d)
.div(width:600px;height:600px;) /*组成立方体的元素*/
全景图素材的制作
设计类
水平方向上需要首尾相连;
因为效果图最终需要切成N等份,所以尽可能让设计图的宽度能被N整除;
图片尺寸不仅要考虑正视图的大小,还要考虑元素在旋转时依然能覆盖视野(可选)。
实景类
利用 RICOH THETA S 等专业设备拍出全景图
导出静态图像
利用设备专门提供的 APP 或 krpamo tools、pano2vr、Glsky box 等工具将静态图像转为6张图
利用 Web 技术制作可交互的全景图
CSS3(本文所提及的方式)
Three.js
krpano(为全景而生,低级浏览器则回退到Flash),查看教程
最后
感谢您的阅读,本文由 凹凸实验室 版权所有。如若转载,请注明出处:凹凸实验室
本文分享自微信公众号 - 凹凸实验室(AOTULabs)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。