как я могу масштабировать или трансформировать 3D-элемент по ширине сцены - PullRequest
1 голос
/ 03 августа 2020

Имею трехмерный кубоид размеров 100vmin на 10vmin на 100vmin. Кубовидные грани помещаются в родительский элемент, имеющий класс .board. Сцена имеет перспективу 100vmax. Я центрировал кубоид по центру, используя дисплей flex. вот код CSS.

body {
    padding: 0;
    margin: 0;
} 
* {
    -moz-box-sizing: border-box;
    box-sizing: border-box;
} 
.scene {
    height: 100vh;
    width: 100vw;
    background: #888;
    margin: auto;
    -webkit-perspective: 100vmax;
    -moz-perspective: 100vmax;
    perspective: 100vmax;
    perspective-origin: center;

    display: flex;
    justify-content: center;
    align-items: center;
} 
.board {
    position: relative;
    height: 100vmin;
    width: 100vmin;
    transform-style: preserve-3d;
    
    display: flex;
    align-items: center;
    justify-content: center;
    
    transform: rotateX(30deg);
} 
.f {
    position: absolute;
    border: 1px solid #fff;
    font-family: Arial;
    font-weight: bold;
    font-size: 2em;
    color: #fff;
    
    display: flex;
    align-items: center;
    justify-content: center;
} 
.f.ff, .f.fB {
    height: 100vmin;
    width: 100vmin;
    border: 10px solid #FFBC00;
    background: transparent;
} 
.f.fr, .f.fl {
    height: 100vmin;
    width: calc(0.1 * 100vmin);
    background: transparent;
} 
.f.ft, .f.fb {
    height: calc(0.1 * 100vmin);
    width: 100vmin;
    border: none;
    background: #9B6F00;
} 

.f.ff {
    transform: rotateY(0deg) translateZ(calc(.5 * calc(0.1 * 100vmin) ));
} 
.f.fB {
    transform: rotateY(180deg) translateZ(calc(.5 * calc(0.1 * 100vmin) ));
} 
.f.fr {
    transform: rotateY(90deg) translateZ(calc(.5 * 100vmin) );
} 
.f.fl {
    transform: rotateY(-90deg) translateZ(calc(.5 * 100vmin));
} 
.f.fb {
    transform: rotateX(-90deg) translateZ(calc(.5 * 100vmin));
} 
.f.ft {
    transform: rotateX(90deg) translateZ(calc(.5 * 100vmin));
} 
<div class="scene">
    <div class="board">
        <div class='f ff'>F</div>
        <div class='f fB'>B</div>
        <div class='f fr'>R</div>
        <div class='f fl'>L</div>
        <div class='f fb'>b</div>
        <div class='f ft'>T</div>           
    </div>
</div>

Когда я поворачиваю кубоид по оси x, скажем, на 45deg, его абсолютная высота, очевидно, изменится из-за перспективы, следовательно, будут некоторые пространство на его вершине. Я хотел убрать это пространство и убедиться, что оно идеально подходит для ширины устройства.

Я пробовал использовать Javascript, чтобы получить вершину, используя эту формулу, основанную на концепции круга и касательной, затем я масштабируйте элемент, используя полученный мной масштабный коэффициент.

let height = window.innerHeight;
let front_top = (height/2) * (1-Math.sin(45 * Math.PI/180));
let bottom_top = (.1*height/2) * (1-Math.sin(45 * Math.PI/180);
let scale_factor = height/(height - front_top - bottom_top);
let average_top = (front_top + bottom_top) / 2;

формула работает нормально, но есть разница в пикселях из-за перспективы. Пожалуйста, мне нужна помощь, чтобы подогнать элемент. Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...