我在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;
}
}
有什么问题?
答案 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比例值的翻转?