C# 搅拌机旋转与OpenGL旋转
我正在编写一个自定义脚本,用于将搅拌机模型和动画导出到使用OpenGL运行的游戏中 我知道Blender使用Z-up系统,而我的游戏中的OpenGL使用Y-up系统。我可以很容易地固定模型网格和骨骼位置,绕X轴旋转-π/2,从而正确地渲染模型 但是,在Blender中,角色腿部与地板平行的骨骼的euler X旋转为0,而垂直于地板的骨骼的euler X旋转为-π/2(或π/2) 在游戏中,平行于地板的角色腿部的euler X旋转为-π/2(或π/2),垂直于地板的骨骼的旋转为0 此处,模型的左腿与地板平行,其XYZ euler旋转与Blender中的左腿相同(与地板垂直): 每帧骨骼旋转的混合器导出脚本为:C# 搅拌机旋转与OpenGL旋转,c#,opengl,matrix,blender,3d-modelling,C#,Opengl,Matrix,Blender,3d Modelling,我正在编写一个自定义脚本,用于将搅拌机模型和动画导出到使用OpenGL运行的游戏中 我知道Blender使用Z-up系统,而我的游戏中的OpenGL使用Y-up系统。我可以很容易地固定模型网格和骨骼位置,绕X轴旋转-π/2,从而正确地渲染模型 但是,在Blender中,角色腿部与地板平行的骨骼的euler X旋转为0,而垂直于地板的骨骼的euler X旋转为-π/2(或π/2) 在游戏中,平行于地板的角色腿部的euler X旋转为-π/2(或π/2),垂直于地板的骨骼的旋转为0 此处,模型的左腿
for f in range(scene.frame_start, scene.frame_end + 1):
bpy.context.scene.frame_set(f);
bpy.context.scene.update();
for i in range(len(arm.pose.bones)):
bone = arm.pose.bones[i]
out.write(str(boneIDs[bone.name]) + ","); # ID of the bone
out.write(VecToStringComma(bone.matrix.to_euler())) # bone rotation
out.write("\n")
并将其加载到C#中,骨骼旋转矩阵用以下代码重新组合:
for (int i = 0; i <= frameCount; i++)
{
Frame frame = new Frame();
var parts = r[read].Split(',');
read++;
for (int p = 0; p < parts.Length - 1; p += 4)
{
FrameDeform fd = new FrameDeform();
fd.DeformerID = int.Parse(parts[p]);
Vector3 rot = new Vector3(double.Parse(parts[p + 1]), double.Parse(parts[p + 2]), double.Parse(parts[p + 3]));
fd.Rotation = Matrix4.CreateRotationX(rot.X) * Matrix4.CreateRotationY(rot.Y) * Matrix4.CreateRotationZ(rot.Z);
frame.FrameDeforms.Add(fd);
}
anim.Frames.Add(frame);
}
但是,这会产生以下结果(仅当设置躯干动画时):
电枢中的每块骨骼都有自己的轴方向,blender允许您使用其滚动设置(在编辑模式下)来“旋转”骨骼。您希望将整个电枢作为单个对象“旋转”,以使每个骨骼的静止位置处于正确的位置,然后动画将为每个骨骼使用相同的局部平移。您只需更改可能应用于电枢对象的任何动画。bpy.data.objects[“电枢”]。姿势中的每个骨骼的旋转轴角度为(0,0,1,0)。我更新了上面的问题,尝试了一下。通过-90º旋转,Z轴是否朝向坐标系的正确方向?我知道3DMax为您提供了在导出时交换Y-Z轴的选项。您是否尝试过简单地交换Y轴和Z轴?
vec3 pos = (zMat * bones[id] * vec4(aPosition, 1.0)).xyz