如何在libgdx 3d中获得最高的骰子?

时间:2019-05-29 12:07:58

标签: java math libgdx bullet

我有一些骰子滚动动画,最初是使用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);

我希望有人能给我指点。

0 个答案:

没有答案