在没有面部纹理交换的情况下,在 3D 骰子滚动后获得所需的值

Achieve desired value after a 3D die roll without face texture swapping

我正在制作一款 3d 骰子游戏,遇到一个问题我无法解决问题,所以我向您寻求帮助。

在 scene/world(使用带有 cannonjs 的 threejs)中,我有一架飞机和一个骰子,我将其扔到飞机上(此处为屏幕截图 pre-roll http://prntscr.com/l9rat5, result http://prntscr.com/l9rdeb)。一切正常,直到我想在骰子上投入一些特定的价值,例如 1。

由于我使用加载的模型而不是立方体表面的纹理图像,我无法仅通过在 threejs 中更改立方体的表面来处理这个问题(因为模型有 100 个)。因此,我希望我可以通过某种方式改变 body 的初始四元数(有点像 pre-rotate )来实现这一点,这样骰子就会落在特定的一侧。模具网格紧随 body 位置和四元数。

我有这些问题:

这甚至可以做到吗?也许当我改变四元数 pre throw 时,它总是会导致不同的最终四元数,我无法确定?如果无法使用四元数,有什么提示吗?

如果可能的话,我如何确定我需要用哪个四元数乘以我的初始四元数才能得到所需的结果值 1?我有最终的四元数可用,并且我知道模拟投掷中每个面上的值,所以我试图玩四元数逆但没有运气。

如果我只是旋转初始 body 以便面 1 旋转到结果面(例如 6),它在某些情况下有效(当模拟结果为 6 时我抛出 1),但是当抛出变得更复杂(更多旋转)它当然不起作用,因为我没有指望所有可能的旋转。

如果不清楚我的意思,请告诉我。

非常感谢 米

首先,请确保您使用的是固定步长模拟。您通过将 3 个参数而不是一个传递给 world.step() 来做到这一点。这将确保您的模拟每次都表现相同,无论帧速率如何。

还要确保每次掷骰子的初始位置、速度和力都相同。

如果您使用内置的 cannon 函数构造四元数,例如 .setFromAxisAngle(),一切都应该很好...使用 .setFromAxisAngle() 甚至围绕不同轴成 90 度角。为什么要费心使用四元数逆?

如果您想要另一种旋转骰子的方法,请将网格放在场景中空的父网格下方。在模拟期间,将 cannon.js 输出复制到父网格。然后旋转子模具网格以获得所需的初始(和结束)旋转。

对于注释,我通过在 threejs 中只旋转几何体(不是网格)解决了它,根本没有触及 body 的四元数。