问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

裸眼3D技术原理

发布网友 发布时间:2022-04-29 23:17

我来回答

4个回答

懂视网 时间:2022-04-22 09:39

要玩转css3的3d,就必须了解几个词汇,便是透视(perspective)、旋转(rotate)和移动(translate)。透视即是以现实的视角来看屏幕上的2D事物,从而展现3D的效果。旋转则不再是2D平面上的旋转,而是三维坐标系的旋转,就包括X轴,Y轴,Z轴旋转。平移同理。

当然用理论来说明,估计你还不明白。下面是3个gif:

沿着X轴旋转

9dd4e461268c8034f5c8564e155c67a6.gif

沿着Y轴旋转

415290769594460e2e485922904f345d.gif

沿着Z轴旋转

fbade9e36a3f36d3d676c1b808451dd7.gif

旋转应该没问题了,那理解平移起来就比较容易了,就是在在X轴、Y轴、z轴移动。

你可能会说透视比较不好理解,下面我介绍一下透视的几个属性。

perspective

perspective英文名便是透视,没有这东西就没办法形成3D效果,但是这个东西是怎么让我们浏览器形成3D 效果的呢,可以看下面这张图,其实学过绘画的应该知道透视关系,而这里就是这个道理。

eb4bfa46e676ccd6e8c9ec2ebe42dc2f.png

但是在css里它是有数值的,例如perspective: 1000px这个代表什么呢?我们可以这样理解,如果我们直接眼睛靠着物体看,物体就超大占满我们的视线,我们离它距离越来越大,它在变小,立体感也就出来了是不是,其实这个数值构造了一个我们眼睛离屏幕的距离,也就构造了一个虚拟3D假象。

perspective-origin

由上面我们了解了perspective,而加上了这个origin是什么,我们前面说的这个是眼睛离物体的距离,而这个就是眼睛的视线,我们的视点的不同位置就决定了我们看到的不同景象,默认是中心,为perspectice-origin: 50% 50%,第一个数值是 3D 元素所基于的 X 轴,第二个定义在 y 轴上的位置

当为元素定义 perspective-origin 属性时,其子元素会获得透视效果,而不是元素本身。必须与 perspective 属性一同使用,而且只影响 3D 转换元素。

7c49b153d4b59f8c0cf8c3e18dc80cb7.png

但是在css里它是有数值的,例如perspective: 1000px这个代表什么呢?我们可以这样理解,如果我们直接眼睛靠着物体看,物体就超大占满我们的视线,我们离它距离越来越大,它在变小,立体感也就出来了是不是,其实这个数值构造了一个我们眼睛离屏幕的距离,也就构造了一个虚拟3D假象。

transform-style

perspective又来了,没错,它是css中3D的关键,transform-style默认是flat,如果你要在元素上视线3D效果的话,就必须用上transform-style: preserve-3d,否则就只是平面的变换,而不是3D的变换

以上我们稍微了解概念,下面就开始实战吧!

第一步:html结构

很简单的一个容器包裹着一个装了6个piece的piece-box

<div class="container"> 
 <div class="piece-box">
 <div class="piece piece-1"></div>
 <div class="piece piece-2"></div>
 <div class="piece piece-3"></div>
 <div class="piece piece-4"></div>
 <div class="piece piece-5"></div>
 <div class="piece piece-6"></div>
 </div>
</div>

第二步: 加上必要的3D属性,进入3D世界

通过上面的讲解,应该对perspective比较熟悉了吧,

/*容器*/
.container { 
 -webkit-perspective: 1000px; 
 -moz-perspective: 1000px; 
 -ms-perspective: 1000px; 
 perspective: 1000px;
}
/*piece盒子*/
 .piece-box { 
 perspective-origin: 50% 50%; 
 -webkit-transform-style: preserve-3d; 
 -moz-transform-style: preserve-3d; 
 -ms-transform-style: preserve-3d; 
 transform-style: preserve-3d;
}

第三步:加入必要的样式

/*容器*/
.container { 
 -webkit-perspective: 1000px; 
 -moz-perspective: 1000px; 
 -ms-perspective: 1000px; 
 perspective: 1000px;
}
/*piece盒子*/
.piece-box { 
 position: relative; 
 width: 200px; 
 height: 200px; 
 margin: 300px auto; 
 perspective-origin: 50% 50%; 
 -webkit-transform-style: preserve-3d; 
 -moz-transform-style: preserve-3d; 
 -ms-transform-style: preserve-3d; 
 transform-style: preserve-3d;
}
/*piece通用样式*/
.piece { 
 position: absolute; 
 width: 200px; 
 height: 200px; 
 background: red; 
 opacity: 0.5;
}
.piece-1 { 
 background: #FF6666;
}
.piece-2 { 
 background: #FFFF00;
}
.piece-3 { 
 background: #006699;
}
.piece-4 { 
 background: #009999;
}
.piece-5 { 
 background: #FF0033;
}
.piece-6 { 
 background: #FF6600;
}

当然,在你完成这步之后你还是只看到一个正方形,也就是我们的piece-6,因为我们的3Dtransform还没开始

c73a7cedfa756f51a14c61adb4a71dae.png

第四步:3D变换来袭

首先是实现走马灯,我们先不要让它走,先实现灯部分。

如何实现呢?因为要构成一个圆,圆是360度,而我们有6个piece,那么,很容易想到,我们需要把每一个piece以递增60度的方式rotateY,就变成如下

8e76e29f43fbb237c0ab4e0320f8633d.png

如何把他们从中心拉开呢?

这里我们还要注意一点,在我们使元素绕Y轴旋转以后,其实X轴和Z轴也会跟着旋转,所所以正方体的每个面的垂直线还是Z轴,我们就只需要改变下translateZ的值,而当translateZ为正的时候,就朝着我们的方向走来,这样就可以拉开了

但是拉开的距离如何衡量?

415dd636f87f61e442162aaee6ab65ce.jpg

是不是一目了然了~

下面我们再修改下css

.piece-1 { 
 background: #FF6666; 
 -webkit-transform: rotateY(0deg) translateZ(173.2px); 
 -ms-transform: rotateY(0deg) translateZ(173.2px); 
 -o-transform: rotateY(0deg) translateZ(173.2px); 
 transform: rotateY(0deg) translateZ(173.2px);

}
.piece-2 { 
 background: #FFFF00; 
 -webkit-transform: rotateY(60deg) translateZ(173.2px); 
 -ms-transform: rotateY(60deg) translateZ(173.2px); 
 -o-transform: rotateY(60deg) translateZ(173.2px); 
 transform: rotateY(60deg) translateZ(173.2px);
}
.piece-3 { 
 background: #006699; 
 -webkit-transform: rotateY(120deg) translateZ(173.2px); 
 -ms-transform: rotateY(120deg) translateZ(173.2px); 
 -o-transform: rotateY(120deg) translateZ(173.2px); 
 transform: rotateY(120deg) translateZ(173.2px);
}
.piece-4 { 
 background: #009999; 
 -webkit-transform: rotateY(180deg) translateZ(173.2px); 
 -ms-transform: rotateY(180deg) translateZ(173.2px); 
 -o-transform: rotateY(180deg) translateZ(173.2px); 
 transform: rotateY(180deg) translateZ(173.2px);
}
.piece-5 { 
 background: #FF0033; 
 -webkit-transform: rotateY(240deg) translateZ(173.2px); 
 -ms-transform: rotateY(240deg) translateZ(173.2px); 
 -o-transform: rotateY(240deg) translateZ(173.2px); 
 transform: rotateY(240deg) translateZ(173.2px);
}
.piece-6 { 
 background: #FF6600; 
 -webkit-transform: rotateY(300deg) translateZ(173.2px); 
 -ms-transform: rotateY(300deg) translateZ(173.2px); 
 -o-transform: rotateY(300deg) translateZ(173.2px); 
 transform: rotateY(300deg) translateZ(173.2px);
}

是不是已经实现了走马灯了?

4a15bf0549675cffea8dafb5dd727b7c.png

第五步:animation让3D动起来

要实现走马灯动,其实很简单,我们只要在piece-box上加上旋转动画就行了,5s完成动画,从0度旋转到360度

/*piece盒子*/
.piece-box { 
 position: relative; 
 width: 200px; 
 height: 200px; 
 margin: 300px auto; 
 perspective-origin: 50% 50%; 
 -webkit-transform-style: preserve-3d; 
 -moz-transform-style: preserve-3d; 
 -ms-transform-style: preserve-3d; 
 transform-style: preserve-3d; 
 animation: pieceRotate 5s; 
 -moz-animation: pieceRotate 5s; /* Firefox */
 -webkit-animation: pieceRotate 5s; /* Safari and Chrome */
 -o-animation: pieceRotate 5s ; /* Opera */
}
/*走马灯动画*/
@keyframes pieceRotate
{
0% {-webkit-transform: rotateY(0deg); 
  -ms-transform: rotateY(0deg); 
  -o-transform: rotateY(0deg); 
  transform: rotateY(0deg);}
100% {-webkit-transform: rotateY(360deg); 
 -ms-transform: rotateY(360deg); 
 -o-transform: rotateY(360deg); 
 transform: rotateY(360deg);}
}
/* Firefox */
@-moz-keyframes pieceRotate
{
0% {-webkit-transform: rotateY(0deg); 
  -ms-transform: rotateY(0deg); 
  -o-transform: rotateY(0deg); 
  transform: rotateY(0deg);}
100% {-webkit-transform: rotateY(360deg); 
 -ms-transform: rotateY(360deg); 
 -o-transform: rotateY(360deg); 
 transform: rotateY(360deg);}
}
/* Safari and Chrome */
@-webkit-keyframes pieceRotate
{
0% {-webkit-transform: rotateY(0deg); 
  -ms-transform: rotateY(0deg); 
  -o-transform: rotateY(0deg); 
  transform: rotateY(0deg);}
100% {-webkit-transform: rotateY(360deg); 
 -ms-transform: rotateY(360deg); 
 -o-transform: rotateY(360deg); 
 transform: rotateY(360deg);}
}
/* Opera */
@-o-keyframes pieceRotate
{
0% {-webkit-transform: rotateY(0deg); 
  -ms-transform: rotateY(0deg); 
  -o-transform: rotateY(0deg); 
  transform: rotateY(0deg);}
100% {-webkit-transform: rotateY(360deg); 
 -ms-transform: rotateY(360deg); 
 -o-transform: rotateY(360deg); 
 transform: rotateY(360deg);}
}

还没结束哦~更酷炫的正方体组装

正方体,其实也不难实现,我这里就不很详细说了,你首先可以想象一个面,然后去拓展其他面如何去实现,比如我们把正方体的前面translateZ(100px)让它靠近我们100px,然后后面translateZ(-100px)让它远离我们100px,左边是先translateX(-100px再rotateY(90deg),右边就是translateX(100px)再rotateY(90deg),上面是先translateY(-100px),rotateX(90deg),下面是先translateY(100px),rotateX(90deg),只要我们写进动画,一切就大功告成。

css就为如下,以下就只放piece1,其他读者可以自己类比实现

.piece-1 { 
 background: #FF6666; 
 -webkit-transform: rotateY(0deg) translateZ(173.2px); 
 -ms-transform: rotateY(0deg) translateZ(173.2px); 
 -o-transform: rotateY(0deg) translateZ(173.2px); 
 transform: rotateY(0deg) translateZ(173.2px); 
 animation: piece1Rotate 5s 5s; 
 -moz-animation: piece1Rotate 5s 5s; /* Firefox */
 -webkit-animation: piece1Rotate 5s 5s; /* Safari and Chrome */
 -o-animation: piece1Rotate 5s 5s; /* Opera */
 -webkit-animation-fill-mode: forwards; /* Chrome, Safari, Opera */
 animation-fill-mode: forwards;
 }
 /*front*/
 @keyframes piece1Rotate
 {
 0% {-webkit-transform: rotateY(0deg) translateZ(173.2px); 
 -ms-transform: rotateY(0deg) translateZ(173.2px); 
 -o-transform: rotateY(0deg) translateZ(173.2px); 
 transform: rotateY(0deg) translateZ(173.2px);}
 100% {-webkit-transform: rotateY(0deg) translateZ(100px); 
 -ms-transform: rotateY(0deg) translateZ(100px); 
 -o-transform: rotateY(0deg) translateZ(100px); 
 transform: rotateY(0deg) translateZ(100px);}
 }
 /* Firefox */
 @-moz-keyframes piece1Rotate
 {
 0% {-webkit-transform: rotateY(0deg) translateZ(173.2px); 
 -ms-transform: rotateY(0deg) translateZ(173.2px); 
 -o-transform: rotateY(0deg) translateZ(173.2px); 
 transform: rotateY(0deg) translateZ(173.2px);}
 100% {-webkit-transform: rotateY(0deg) translateZ(100px); 
 -ms-transform: rotateY(0deg) translateZ(100px); 
 -o-transform: rotateY(0deg) translateZ(100px); 
 transform: rotateY(0deg) translateZ(100px);}
 }
 /* Safari and Chrome */
 @-webkit-keyframes piece1Rotate
 {
 0% {-webkit-transform: rotateY(0deg) translateZ(173.2px); 
 -ms-transform: rotateY(0deg) translateZ(173.2px); 
 -o-transform: rotateY(0deg) translateZ(173.2px); 
 transform: rotateY(0deg) translateZ(173.2px);}
 100% {-webkit-transform: rotateY(0deg) translateZ(100px); 
 -ms-transform: rotateY(0deg) translateZ(100px); 
 -o-transform: rotateY(0deg) translateZ(100px); 
 transform: rotateY(0deg) translateZ(100px);}
 }
 /* Opera */
 @-o-keyframes piece1Rotate
 {
 0% {-webkit-transform: rotateY(0deg) translateZ(173.2px); 
 -ms-transform: rotateY(0deg) translateZ(173.2px); 
 -o-transform: rotateY(0deg) translateZ(173.2px); 
 transform: rotateY(0deg) translateZ(173.2px);}
 100% {-webkit-transform: rotateY(0deg) translateZ(100px); 
 -ms-transform: rotateY(0deg) translateZ(100px); 
 -o-transform: rotateY(0deg) translateZ(100px); 
 transform: rotateY(0deg) translateZ(100px);}
 }

细心的读者可以发现我用了一个animation-fill-mode: forwards;,这个其实就是让这些piece保持动画最后的效果,也就是正方体的效果,读者可以不加试试看,那还是会恢复原样。

最后就是正方体的旋转了,前面我们的容器已经用过animation了,读者可能会想我再加个class放animaiton不就行了,hhh,animaiton会覆盖掉前面的,那前面的走马灯的动画就没了,所以在html结构中,我再加了一个box包裹piece, 如下

<div class="container">
 <div class="piece-box">
 <div class="piece-box2"><!--新加的容器-->
  <div class="piece piece-1"></div>
  <div class="piece piece-2"></div>
  <div class="piece piece-3"></div>
  <div class="piece piece-4"></div>
  <div class="piece piece-5"></div>
  <div class="piece piece-6"></div>
 </div>
 </div>
</div>

在动画上我们可以控制正方体动画的延时时间,就是等到正方体组装完成后再开始动画

animation: boxRotate 5s 10s infinite;第一个5s是动画时长,第二个10s是延时时间,然后我们让正方体的旋转,绕X轴从0度到360度,绕Y轴也0到Y轴360度。

.piece-box2 {
 -webkit-transform-style: preserve-3d;
 -moz-transform-style: preserve-3d;
 -ms-transform-style: preserve-3d;
 transform-style: preserve-3d;
 animation: boxRotate 5s 10s infinite;
 -moz-animation: boxRotate 5s 10s infinite; /* Firefox */
 -webkit-animation: boxRotate 5s 10s infinite; /* Safari and Chrome */
 -o-animation: boxRotate 5s 10s infinite; /* Opera */
}
/*正方体旋转动画*/
@keyframes boxRotate
{
0% {-webkit-transform: rotateX(0deg) rotateY(0deg););
 -ms-transform: rotateX(0deg) rotateY(0deg););
 -o-transform: rotateX(0deg) rotateY(0deg););
 transform: rotateX(0deg) rotateY(0deg););}
100% {-webkit-transform: rotateX(360deg) rotateY(360deg);
 -ms-transform: rotateX(360deg) rotateY(360deg);
 -o-transform: rotateX(360deg) rotateY(360deg);
 transform: rotateX(360deg) rotateY(360deg);}
}
/* Firefox */
@-moz-keyframes boxRotate
{
0% {-webkit-transform: rotateX(0deg) rotateY(0deg););
 -ms-transform: rotateX(0deg) rotateY(0deg););
 -o-transform: rotateX(0deg) rotateY(0deg););
 transform: rotateX(0deg) rotateY(0deg););}
100% {-webkit-transform: rotateX(360deg) rotateY(360deg);
 -ms-transform: rotateX(360deg) rotateY(360deg);
 -o-transform: rotateX(360deg) rotateY(360deg);
 transform: rotateX(360deg) rotateY(360deg);}
}
/* Safari and Chrome */
@-webkit-keyframes boxRotate
{
0% {-webkit-transform: rotateX(0deg) rotateY(0deg););
 -ms-transform: rotateX(0deg) rotateY(0deg););
 -o-transform: rotateX(0deg) rotateY(0deg););
 transform: rotateX(0deg) rotateY(0deg););}
100% {-webkit-transform: rotateX(360deg) rotateY(360deg);
 -ms-transform: rotateX(360deg) rotateY(360deg);
 -o-transform: rotateX(360deg) rotateY(360deg);
 transform: rotateX(360deg) rotateY(360deg);}
}
/* Opera */
@-o-keyframes boxRotate
{
0% {-webkit-transform: rotateX(0deg) rotateY(0deg););
 -ms-transform: rotateX(0deg) rotateY(0deg););
 -o-transform: rotateX(0deg) rotateY(0deg););
 transform: rotateX(0deg) rotateY(0deg););}
100% {-webkit-transform: rotateX(360deg) rotateY(360deg);
 -ms-transform: rotateX(360deg) rotateY(360deg);
 -o-transform: rotateX(360deg) rotateY(360deg);
 transform: rotateX(360deg) rotateY(360deg);}
}

最后效果,大功告成!

3d.gif

热心网友 时间:2022-04-22 07:04

基本原理
3D成像是靠人两眼的视觉差产生的。人的两眼之间一般会有8厘米左右的距离,要让人看到3D影像,必须让左眼和右眼看到不同的影像,两副画面实际有一段小差距!也就是模拟实际人眼观看时的情况。这样的才能有3d的立体感觉。

n3DS实现
NDS有两个屏幕,实际游戏时,游戏机应该竖起来,左面一个屏幕右面一个屏幕(原来是上面一个屏幕下面一个屏幕),对应的游戏软件设计是左面屏幕显示实际左眼看到的内容,右面的屏幕显示实际右眼看到的内容。

这样情况下游戏者要使用两眼结合后才能看到3d效果,如果不使用其他辅助工具,办法一就是对眼啦!调整人眼睛的焦距使图像发生重影,然后吧左右眼两幅图像的重影重新重合到一起(大家都看过三维立体画吧,就是这个办法,请看图解)。

办法二是用东西吧两只眼睛分开,让两只眼睛分贝对应两个屏幕!

热心网友 时间:2022-04-22 08:38

目前主要有3种技术:1.柱状透视成像,就是在平面成像的透明叠加产生深度,多用于手机屏幕等小型;2.视觉屏障,就好比2个万花筒紧挨着眼睛,或者两台放像机各自照你的左右眼;3.激光交织,几束不可见频率的光波非平行照射叠加部分频率为可见光频率,从而在空间成像。

热心网友 时间:2022-04-22 10:30

就是你两只眼睛看到的东西不同,方法类似使屏幕凹凸不平。
http://tieba.baidu.com/f?kz=734418146

参考资料:http://tieba.baidu.com/f?kz=734418146

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 现在什么手机屏幕对眼睛伤害小一点? 什么牌子手机的屏幕好,对眼睛损害小,分辨率高的。求推荐!!! 目前市面上哪款手机看电子书最好,对眼睛伤害最小 那个牌子的手机对眼睛伤害最小 事实证明 请问专家哪一款手机屏幕蓝光对人的眼睛视力伤害比较小? 婚前首套房优惠政策? 那种手机或者屏幕对眼睛伤害小 哪种手机对人眼睛没有伤害? 买什么品牌的手机对眼睛伤害很小? 什么手机对眼睛伤害最小 怎么约我女友出来 怎么约一个喜欢的女孩子出来? 自己在外面玩的太疯了,身体现在比较虚。我是在这方面比较强烈的那种,最近的约了5个女孩? 有隐隐约约 偷偷摸摸类似的成语 认识一网友,她在厂里上班,我做保安,第一次约她她说没什么好见的,第三次约她最后答应了》几天约她一次? 约女孩出来后,高分。在线等 我喜欢一个女孩子,但我约了她几次都被她拒绝了,怎么办??? 老公背着我和别女人聊天,还约她出去是什么意思 老婆的闺蜜经常偷偷的微信撩我,也有过单独约出来吃饭和玩的经历,在陪老婆和她逛街的时,她经常偷偷的 步步高手机与vivo智能手机那种对眼睛伤害小些?1 大家知道哪一种手机显示屏对眼睛没有伤害吗? OPPO reno ace这款,是目前OPPO长期观看手机对眼睛伤害最小的一款屏幕吗? 裸眼3d成像原理 如何让手机对自己的眼睛伤害最小化 立图谷的裸眼3D是利用什么原理制作的? 什么是裸眼3D成像技术? 喝酒前喝蜂蜜不容易醉吗 喝酒前喝蜂蜜水是不是能够同样起到解酒的功效? 九阴真经怎么查找账号,我好久没玩了,现在又和区了怎么查找我的号在哪个区啊(我有2个区) 酒泡葱子的功效 怎么查看九阴真经账号在哪个区 大葱籽和白泡酒一起服用有什么作用? 怎样知道自己的九阴真经账号在哪个区啊 我忘记了..顺便求一个九阴真经账号不错的 给1000分 九阴真经怎么看自己在哪个区 白酒中泡进去香葱可以喝吗? 九阴真经,我以前有个号,忘记哪个区了怎么查?我快有一年多没玩了 葱子能补肾吗 我九阴真经端游账号记不得到那个区了怎么办。 韭菜籽和大葱籽能一起泡酒吗?