2.旋转的骰子

Posted konglingbin66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.旋转的骰子相关的知识,希望对你有一定的参考价值。

1.动画——旋转的骰子

我们想用纯html CSS 做一个旋转的筛子,骰子要有立体感,每个面上要有圆点,表示点数,并且骰子可以原地旋转。

2.分析需求——庖丁解牛

a.立方体的每个面上有点数

立方体面上不同数量和排布的圆点,可以使用CSS来完成,让原点有内凹的立体感。至于排布,我们可以使用先进的flex实现。

b.骰子个立方体

这个筛子必须是一个货真价实的立方体才行,只有这样才能在旋转中才能没有破绽。而立方提有6个面,我们需要用六个正方形,辗转腾挪后拼接起来。立方体边缘要有一定的圆弧,而不是90度的棱角。

c.旋转是个大麻烦

立方体自身需要旋转,以便让立方体倾斜一定角度,同时要求保持倾斜的立方体围绕几何中心进行旋转,这需要对坐标轴和旋转有比较透彻的理解。

3.六个面——先来解决平面问题

在合成立方体之前,先解决平面的问题,复杂问题,先从简单的地方着手。我们先来制作6个面,这无非就是6<div>标签。每个面上的点,使用相应数量的<span>标签(或者任意其他标签)即可代替。使用css让点呈现内凹样式,使用flex对点进行布局。

a.六个面的逻辑划分

html的制作的原则就是要简单明了,清晰易懂!

 b.面的基本样式

 c.布局点点——flex排兵布阵

点的基本样式

 1个点——舍我其谁

2个点——平分秋色

 3个点——三分天下

 4个点——纵情四海

 5个点——五子登科

 6个点——六韬三略

 最终的效果:

4.立方体——我想起泰国的四面佛

立方体有6个面,前后左右上下,我们需要做六个正方形,然后通过transform属性的旋转和平移函数,来让它们处于正确的方位和方向,拼接成一个立方体。而且我们需要将元素的2D平面几何中心,作为立方体的几何中心。如图,这样的话,前后面前后移动,上下面围绕X轴旋转,上线移动,左右面围绕Y轴旋转,左右平移,就大功告成了

 a.首先需要将所有的面重合于相同区域,再进行旋转和移动

b.凡是子元素有3D显示效果的,父元素都需要设置透视3D,否则是看不到效果的

c.前后面移动立方体边长的1/2,同时注意,后面的面要反转180度(因为面有正反,正面要朝外)

 d.上下面围绕X轴旋转90度(注意旋转角度相反,因为面要朝外),同时沿上下平移立方体边长一半

e.左右面围绕Y轴旋转90度(注意旋转角度相反,因为面要朝外),同时朝左右移动立方体边长一半

f.我们可以旋转立方体,以便验证移动的正确性,可以选择性的隐藏显示其他面,或者修改面的颜色,方便查看。

g.立方体的面设为白色,我们发现,每个面之间是有空隙的,因为我们原先想要做成圆角的边缘,这样透过空袭就可以看到立方体内部,或者页面背景,非常的糟糕,我们需要完全遮挡空袭,并且让立方体更有立体感。

我们可以在立方体的中心增加一个上图所示的遮挡面片,遮挡面片位于立方体内部,这样无论如何都不会从缝隙看到背景了!

h. 制作遮挡面片

 i.通过上一步骤,我们发现视线很难穿透立方体的空隙,但是立方体的内部仍然可以看到,还需要一个遮挡。我们需要在6个面的每个面下方(在立方体内部),再提供一层遮挡,并且颜色设当加深,从而有一定立体感。图中深色的那层面片,当然,内层的面片会适当增大,否则也是无法遮挡的。这层遮挡位于作为面片子元素出现会比较好,这样,面片旋转时候,子元素也跟着旋转了。这让我们想到了伪元素。

 5.立方体旋转动画

立方体本身,我们可以通过设置.cube的样式来进行旋转,如图。但是,如果我们想要让立方体保持这个姿势,水平旋转,或者垂直旋转,单纯修改立方体本身的属性,就有点困难。

  

 加入水平“支架”,垂直“支架”,再把立方体放上去,然后旋转外面的支架即可。这个原理类似于在外面套了一层壳,类似于陀螺仪的结构。

增加水平,垂直“支架”

设置水平,垂直旋转帧动画

 设置水平垂直旋转动画

 设置尺寸与正方体边长相等,否则旋转轴会偏离正方体

设置3D透视属性,否则无法看到立体透视效果

 6.更多思考

a.如果想按照某个倾斜的轴旋转,如何操作实现

b.如果在立方体表面添加更多的面,每个面,实现不同的颜色,能否有更好的立体效果

c.如何添加鼠标的操作,滑动鼠标,可以转动立方体

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8"/>
		<title>Rotate Dice</title>
		<link rel="stylesheet" type="text/css" href="./styles.css"/>
	</head>
	<body>
		<div class="dice">
			<div class="vertical">
        <div class="horizontal">
          <div class="cube">
            <div class="face front one">
              <span class="dot"></span>
            </div>
            <div class="face back two">
              <span class="dot"></span>
              <span class="dot"></span>
            </div>
            <div class="face up three">
              <span class="dot"></span>
              <span class="dot"></span>
              <span class="dot"></span>
            </div>
            <div class="face down four">
              <div class="dot-row">
                <span class="dot"></span>
                <span class="dot"></span>
              </div>
              <div class="dot-row">
                <span class="dot"></span>
                <span class="dot"></span>
              </div>
            </div>
            <div class="face left five">
              <div class="dot-row">
                <span class="dot"></span>
                <span class="dot"></span>
              </div>
              <div class="dot-row">
                <span class="dot"></span>
              </div>
              <div class="dot-row">
                <span class="dot"></span>
                <span class="dot"></span>
              </div>
            </div>
            <div class="face right six">
              <div class="dot-row">
                <span class="dot"></span>
                <span class="dot"></span>
                <span class="dot"></span>
              </div>
              <div class="dot-row">
                <span class="dot"></span>
                <span class="dot"></span>
                <span class="dot"></span>
              </div>
            </div>
            <div class="axis-face x"></div>
            <div class="axis-face y"></div>
            <div class="axis-face z"></div>
          </div>
				</div>
			</div>
		</div>
		
	</body>
</html>

html

	background-color: black;
	font-size:100px;
	padding: 1em;


/*骰子动画*/
.vertical
	animation: rotateX 5s infinite linear;

.horizontal
	animation: rotateY 5s infinite linear;

.cube
	transform: rotateX(-45deg) rotateY(45deg);

@keyframes rotateY 
	fromtransform:rotateY(0);
	totransform:rotateY(360deg);

@keyframes rotateX 
	fromtransform:rotateX(0);
	totransform:rotateX(360deg);

/*面的样式*/
.dice,.vertical,.horizontal,.cube,.face
	transform-style:preserve-3d;

.dice,.vertical,.horizontal,.cube,.face,.face::after,.axis-face
	width:1em;
	height: 1em;

.dice
	margin: auto;

.cube
  position: relative;

.face,.face::after,.axis-face
	position: absolute;
  top:0;
  left: 0;

.face
	box-sizing: border-box;
  padding: .15em;
  background-color: white;
  border-radius: 40%;
  box-shadow: 0 0 .2em #ccc inset;

.face::after
  content:"";
  display: block;
  border-radius: .2em;
  transform: translateZ(-.1px);
  background-color: #e0e0e0;

.axis-face
  background:#e0e0e0;


/*点的样式*/
.dot
  width:.2em;
  height: .2em;
  display: inline-block;
  background: #444;
  border-radius: 50%;
  box-shadow: inset .05em .05em .1em black;


/* 面的方位*/
.face.front
  transform: translateZ(.5em);

.face.back
  transform: translateZ(-.5em) rotateY(180deg);

.face.up
  transform: translateY(-50%) rotateX(90deg);

.face.down
  transform: translateY(50%) rotateX(-90deg);

.face.left
  transform: translateX(-50%) rotateY(-90deg);

.face.right
  transform: translateX(50%) rotateY(90deg);

.axis-face.x
  transform:rotateY(90deg);

.axis-face.y
  transform:rotateX(90deg);

.axis-face.z


/* 点的排列布局*/
.face,.dot-row
  display: flex;

.face.one
  align-items: center;
  justify-content: center;

.face.two
  justify-content: space-around;

.face.two .dot:nth-child(2)
  align-self: flex-end;

.face.three
  justify-content: space-around;

.face.three .dot:nth-child(2)
  align-self:center;

.face.three .dot:nth-child(3)
  align-self: flex-end;

.face.four
  flex-direction: column;
  justify-content: space-between;

.face.four .dot-row
  justify-content: space-between;

.face.five
  flex-direction: column;
  justify-content: space-between;

.face.five .dot-row
  justify-content: space-between;

.face.five .dot-row:nth-child(2)
  justify-content:center;

.face.six
  flex-direction: column;
  justify-content: space-around;

.face.six .dot-row
  justify-content: space-between;

以上是关于2.旋转的骰子的主要内容,如果未能解决你的问题,请参考以下文章

旋转的骰子

旋转的骰子

2.旋转的骰子

洛谷--T4563 滚骰子

华为机试真题 C++ 实现转骰子

华为OD机试 - 旋转骰子(JavaScript) | 机试题+算法思路+考点+代码解析 2023