如何围绕其中心旋转3D模型的一部分,而不是使用LIBGDX旋转模型的中心

时间:2014-10-31 21:48:57

标签: rotation libgdx coordinates nodes

我在Blender中创建了一个带有一个炮塔的船模型,炮塔有一把枪。 要清楚这些是搅拌机中的3个独立物体。 在g3dj文件中,它显示为3个节点:一个用于船,一个用于炮塔,一个用于枪。

"nodes": [
    {
        "id": "gun1", 
        "rotation": [ 0.000000,  0.000000,  0.707107,  0.707107], 
        "scale": [ 0.100000,  0.984755,  0.100000], 
        "translation": [-3.526966,  1.428384,  0.191505], 
        "parts": [
            {
                "meshpartid": "Cylinder_part1", 
                "materialid": "gunMaterial"
            }
        ]
    }, 
    {
        "id": "turret1", 
        "scale": [ 1.000000,  0.300000,  0.395389], 
        "translation": [-1.603167,  1.406584,  0.000000], 
        "parts": [
            {
                "meshpartid": "Cube.001_part1", 
                "materialid": "turretMaterial"
            }
        ]
    }, 
    {
        "id": "ship", 
        "scale": [ 3.000000,  1.000000,  1.000000], 
        "parts": [
            {
                "meshpartid": "Cube_part1", 
                "materialid": "shipMaterial", 
                "uvMapping": [[]]
            }
        ]
    }
], 
"animations": []

}

使用Libgdx我尝试将炮塔旋转30度(rotAngle = 30)。 所以我翻译成我认为模型的起源(我认为这是船的起源?)。 然后我旋转。最后我会翻译回来。 但我已经把它翻译出来了,因为旋转不在正确的点附近? 代码如下(基于xoppa教程):

        Vector3 dimensions = new Vector3();

    for (int i = 0; i < model.nodes.size; i++) {
        String id = model.nodes.get(i).id;
        ModelInstance instance = new ModelInstance(model, id);
        instance.transform.getTranslation(position);

        Node node = instance.getNode(id);
        node.calculateLocalTransform();
        node.localTransform.getTranslation(position);
        node.calculateBoundingBox(bounds).mul(node.localTransform);
        node.localTransform.getScale(scale);
        bounds.getDimensions(dimensions);
        centre=bounds.getCenter(centre);
        //float radius;
        //radius = dimensions.x / 2f;

        if (id.equals("ship")) {
            ///instance.transform.rotate(Vector3.Y,rotAngle);
            ship = instance;
            instances.add(ship);
            continue;
        }
        if (id.startsWith("gun")) {

            guns.add(instance);
            instances.add(instance);
            continue;
        }
        if (id.startsWith("turret")) {
            //movement on Y is based on Z from blender
            instance.transform.trn(-centre.x,-centre.z,0).
            rotate(Vector3.Y,rotAngle); // ???z???

            turrets.add(instance);
            instances.add(instance);
            continue;
        }
    }

有什么问题?

1 个答案:

答案 0 :(得分:0)

基本思路是正确的,但我需要使用节点的位置(平移)而不是中心进行平移,并考虑来自混合器的比例因子,以及一些y / z值的明显随机切换。 / p>

以下是炮塔的修改代码:

Vector3 turretMove = new Vector3();                
turretMove.x = position.x*scale.x;
//scale.z is what was the blender scale.y and vice versa
turretMove.y = -position.y*scale.z; //using opposite sign of position
turretMove.z = position.z*scale.y;
instance.transform.translate(turretMove.x,turretMove.y,turretMove.z).
rotate(Vector3.Y,dt).
translate(-turretMove.x,-turretMove.y,-turretMove.z);

此代码现在包含转换回原始位置。 到这里需要几个小时的试验和错误!

在Blender中,Z-up从船的底部到顶部,Y从船的左侧(和炮塔)到右边。

在Libgdx中,Z从船的左侧向右(看着屏幕),Y从船的底部到顶部(在屏幕上方)。

从Blender导出到FBX时带-Z forward和Y Up只导出选定对象。

我想其中一些解释了Z和Y比例值的翻转?