gpt4 book ai didi

javascript - 使用旋转和平移保持 3D 立方体在其边缘正确滚动的问题

转载 作者:行者123 更新时间:2023-12-03 15:49:52 24 4
gpt4 key购买 nike

请在此处查看我的 js Fiddle:https://jsfiddle.net/mauricederegt/5ozqg9uL/3/

var xAngle = 0;
var yAngle = 0;
var xPos = 0;
var yPos = 0;

$('body').keydown(function(evt) {
if(evt.keyCode == 37)
{
//left
yAngle -= 90;
xPos -= 100;
//rotate and translate the position of the cube
$('#cube')[0].style["WebkitTransform"] = "translateX("+xPos+"px) translateY("+yPos+"px) rotateX(" + xAngle + "deg) rotateY(" + yAngle + "deg)";
}
if(evt.keyCode == 39)
{
//right
yAngle -= -90;
xPos -= -100;
//rotate and translate the position of the cube
$('#cube')[0].style["WebkitTransform"] = "translateX("+xPos+"px) translateY("+yPos+"px) rotateX(" + xAngle + "deg) rotateY(" + yAngle + "deg)";
}
if(evt.keyCode == 38)
{
//up
xAngle -= -90;
yPos -= 100;
//rotate and translate the position of the cube
$('#cube')[0].style["WebkitTransform"] = "translateX("+xPos+"px) translateY("+yPos+"px) rotateX(" + xAngle + "deg) rotateY(" + yAngle + "deg)";
}
if(evt.keyCode == 40)
{
//down
xAngle -= 90;
yPos -= -100;
//rotate and translate the position of the cube
$('#cube')[0].style["WebkitTransform"] = "translateX("+xPos+"px) translateY("+yPos+"px) rotateX(" + xAngle + "deg) rotateY(" + yAngle + "deg)";
}
});
#scene {
padding: 10px;
-webkit-perspective: 800;
}

#cube {
position: relative;
padding-top: 0;
margin: 0 auto;
height: 100px;
width: 100px;
-webkit-transition: -webkit-transform 0.4s linear;
-webkit-transform-style: preserve-3d;


}

.face {
position: absolute;
height: 85px;
width: 85px;
border-style: solid;
border-width: 5px;
border-color: grey;
padding: 5px;
background-color: rgba(190, 190, 190, 0.7);
}

#cube .one {
-webkit-transform: rotateX(90deg) translateZ(50px);
}

#cube .two {
-webkit-transform: translateZ(50px);
}

#cube .three {
-webkit-transform: rotateY(90deg) translateZ(50px);
}

#cube .four {
-webkit-transform: rotateY(180deg) translateZ(50px);
}

#cube .five {
-webkit-transform: rotateY(-90deg) translateZ(50px);
}

#cube .six {
-webkit-transform: rotateX(-90deg) translateZ(50px) rotate(180deg);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!doctype html>
<html>
<body>
<div id="scene">
Press the arrow keys...
<div id="cube">
<div class="face one">
Face 1
</div>
<div class="face two">
Face 2
</div>
<div class="face three">
Face 3
</div>
<div class="face four">
Face 4
</div>
<div class="face five">
Face 5
</div>
<div class="face six">
Face 6
</div>
</div>
</div>
</body>
</html>

如您所见,我有一个 css3 3d 立方体,您可以使用箭头键移动它。您可以将其向左、向右、向上和向下移动。为了实现这一点,我将位置和 Angular 存储在各种变量中:
var xAngle = 0;
var yAngle = 0;
var xPos = 0;
var yPos = 0;
立方体总是在其边缘向上或向下正确“滚动”,但对于左侧和右侧,情况并非总是如此。
示例:
  • 在开始时按左箭头键和右箭头键任意多次。立方体行为正确
  • 现在按下一次,然后再次向左(或向右)两次。立方体现在滚动不正确
  • 但是,如果您再次按下向上或向下,它会再次正确滚动向上或向下

  • 所以问题似乎只在于向左或向右。我怎样才能解决这个问题?

    最佳答案

    您需要考虑 3 种旋转,这意味着 3 个不同的轴,而不是像您正在做的 2 个。
    这是您的代码的更新版本。请注意我如何根据其他轴更新轴的 Angular 。
    仍然不是一个完美的解决方案,因为我发现了一些奇怪的 Action (可能我错过了一些边缘情况),但是一个很好的起点。

    var xAngle = 0;
    var yAngle = 0;
    var zAngle = 0;
    var xPos = 0;
    var yPos = 0;

    $('body').keydown(function(evt) {
    if (evt.keyCode == 37) {
    //left
    if (xAngle % 180 == 0)
    yAngle -= 90;
    else
    zAngle -= 90;
    xPos -= 100;
    }
    if (evt.keyCode == 39) {
    //right
    if (xAngle % 180 == 0)
    yAngle -= -90;
    else
    zAngle -= -90;

    xPos -= -100;
    }
    if (evt.keyCode == 38) {
    //up
    if (yAngle % 180 == 0)
    xAngle -= -90;
    else
    zAngle -= -90;
    yPos -= 100;
    }
    if (evt.keyCode == 40) {
    //down
    if (yAngle % 180 == 0)
    xAngle -= 90;
    else
    zAngle -= 90;
    yPos -= -100;
    }
    $('#cube').css('transform', "translateX(" + xPos + "px) translateY(" + yPos + "px) rotateX(" + xAngle + "deg) rotateY(" + yAngle + "deg) rotateZ(" + zAngle + "deg)");
    });
    #scene {
    padding: 10px;
    perspective: 800;
    }

    #cube {
    position: relative;
    padding-top: 0;
    margin: 0 auto;
    height: 100px;
    width: 100px;
    transition: transform 0.4s linear;
    transform-style: preserve-3d;
    }

    .face {
    position: absolute;
    height: 85px;
    width: 85px;
    border-style: solid;
    border-width: 5px;
    border-color: grey;
    padding: 5px;
    background-color: rgba(190, 190, 190, 0.7);
    }

    #cube .one {
    transform: rotateX(90deg) translateZ(50px);
    }

    #cube .two {
    transform: translateZ(50px);
    }

    #cube .three {
    transform: rotateY(90deg) translateZ(50px);
    }

    #cube .four {
    transform: rotateY(180deg) translateZ(50px);
    }

    #cube .five {
    transform: rotateY(-90deg) translateZ(50px);
    }

    #cube .six {
    transform: rotateX(-90deg) translateZ(50px) rotate(180deg);
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div id="scene">
    Press the arrow keys...
    <div id="cube">
    <div class="face one">
    Face 1
    </div>
    <div class="face two">
    Face 2
    </div>
    <div class="face three">
    Face 3
    </div>
    <div class="face four">
    Face 4
    </div>
    <div class="face five">
    Face 5
    </div>
    <div class="face six">
    Face 6
    </div>
    </div>
    </div>

    关于javascript - 使用旋转和平移保持 3D 立方体在其边缘正确滚动的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66808899/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com