我有一些骰子滚动动画,最初是使用THREE&CANNON在javascript中完成的,我想在libgdx中重新实现它。
动画部分已经完成,但是我还没有弄清楚如何识别骰子的顶部。
我知道至少有3种不同的方法可以做到这一点,所以我不确定libgdx / bullet可以真正实现其中的哪种方法。
(我为此感到苦恼,其他方法听起来更容易)
1。
通过骰子的旋转以某种方式以数学方式实现。
我现在通过获得四元数来对骰子进行旋转, 我可以在掷出骰子后得到四元数。
我现在还应该结束一些旋转的四元数(至少在某种程度上因为强制转换并不完美)。
编辑3: 目前,我正在计算总共64个可能的轮换中的34个唯一身份(1:4x,2:6x,3:5x,4:7x,5:7x,6:5x)。
但是似乎还有更多... 我用三个轴计算了64,然后将它们分别在0到270°之间旋转(以90°为步长)。
例如,以下四元数为
( 0.5f,-0.5f, 0.5f,-0.5f) -> which should be 4
(-0.5f,-0.5f, 0.5f,-0.5f) -> which should be 5
不属于这种方法。
现在使用每个坐标之间的最小距离似乎更好。
其他选项:
2。 使用光线投射获得骰子的顶部。
在javasript中,射线投射方法向我交付了相交的网格对象,它们具有一个属性,可让我确定它是哪一侧。我还没有在libgdx中看到任何类似的东西。
function identifyDiceTop(position) {
var raycaster = new THREE.Raycaster();
var vec = new THREE.Vector3(position.x, position.y, 5);
raycaster.set( vec, new THREE.Vector3(0, 0, -1));
var intersects = raycaster.intersectObjects( scene.children, true );
if (intersects.length > 0 && intersects[ 0 ].face != null) {
switch (intersects[ 0 ].face.materialIndex) {
// see which value is top
}
}
3。 通过找到骰子对象网格的最高y坐标来获得骰子的顶部。比上面更简单,但是我又可以某种方式访问网格吗?
我正在使用下面的代码创建骰子。但是这里我不直接使用任何网格,所以我可能需要一种不同的构造方法?
MeshPartBuilder meshPartBuilder =
modelBuilder.part(
"box",
GL20.GL_TRIANGLES,
attr,
new Material(
TextureAttribute.createDiffuse(
region
)
)
);
meshPartBuilder.setUVRange(dice.side5);
meshPartBuilder.rect(-size,-size,-size,-size,size,-size,size,size,-size,size,-size,-size,0,0,-1);
meshPartBuilder.setUVRange(dice.side2);
meshPartBuilder.rect(-size,size,size, -size,-size,size,size,-size,size,size,size,size,0,0,1);
meshPartBuilder.setUVRange(dice.side6);
meshPartBuilder.rect(-size,-size,size, -size,-size,-size,size,-size,-size,size,-size,size,0,-1,0);
meshPartBuilder.setUVRange(dice.side1);
meshPartBuilder.rect(-size,size,-size, -size,size,size,size,size,size,size,size,-size,0,1,0);
meshPartBuilder.setUVRange(dice.side4);
meshPartBuilder.rect(-size,-size,size, -size,size,size,-size,size,-size,-size,-size,-size,-1,0,0);
meshPartBuilder.setUVRange(dice.side3);
meshPartBuilder.rect(size,-size,-size, size,size,-size,size,size,size,size,-size,size,1,0,0);
我希望有人能给我指点。