Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 搅拌机旋转与OpenGL旋转_C#_Opengl_Matrix_Blender_3d Modelling - Fatal编程技术网

C# 搅拌机旋转与OpenGL旋转

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 此处,模型的左腿

我正在编写一个自定义脚本,用于将搅拌机模型和动画导出到使用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中的左腿相同(与地板垂直):

每帧骨骼旋转的混合器导出脚本为:

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