blender 姿态骨骼矩阵计算_第1页
blender 姿态骨骼矩阵计算_第2页
blender 姿态骨骼矩阵计算_第3页
blender 姿态骨骼矩阵计算_第4页
全文预览已结束

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

blender姿态骨骼矩阵计算在Blender中,姿态骨骼(PoseBone)

的矩阵计算是角色动画、绑定与蒙皮的核心。下面从核心矩阵定义、层级计算、空间转换、代码示例四个方面完整说明。一、核心矩阵概念(PoseBone)1.关键矩阵属性pose_bone.matrix_basis含义:基础姿态矩阵(相对父骨骼与rest姿势)。来源:由

location

/

rotation_euler

/

scale

组合而成,不含约束。公式:matrix_basis=T*R*S(平移×旋转×缩放)。pose_bone.matrix含义:最终姿态矩阵(Armature局部空间,含约束、驱动)Blender。用途:直接反映骨骼在骨架空间的最终位置/旋转/缩放。pose_bone.matrix_local含义:骨架局部空间矩阵(同

matrix,新版API常用

matrix)Blender。bone.matrix_local(EditBone/Rest姿势)含义:绑定姿势(Rest)矩阵,骨架在编辑模式下的原始位置Blender。蒙皮关键:pose_bone.matrix@bone.matrix_local.inverted()

得到相对绑定姿势的变换。2.矩阵层级关系(父子骨骼)对于有父骨骼的姿态骨骼:plaintextpose_bone.matrix=parent_pose_bone.matrix@pose_bone.matrix_basis根骨骼(无父):pose_bone.matrix=pose_bone.matrix_basisBlender。二、完整计算流程(从基础到最终)1.单骨骼基础矩阵(无约束)python运行importbpyfrommathutilsimportMatrix,Vector,Eulerpb=bpy.context.active_pose_bone#1.从通道值构建matrix_basisloc=pb.locationrot=Euler(pb.rotation_euler).to_matrix().to_4x4()scale=Matrix.Diagonal(pb.scale).to_4x4()pb.matrix_basis=Matrix.Translation(loc)@rot@scale#2.计算最终matrix(含父级)ifpb.parent:pb.matrix=pb.parent.matrix@pb.matrix_basiselse:pb.matrix=pb.matrix_basis2.含约束的最终矩阵约束会修改

matrix_basis

并输出到

matrix。代码中设置后需调用

bpy.context.view_layer.update()

刷新。三、空间转换(最常用)1.骨架空间↔世界空间python运行arm=bpy.context.object#骨架对象pb=arm.pose.bones["Bone"]#姿态矩阵(骨架空间)→世界空间matrix_world=arm.matrix_world@pb.matrix#世界空间矩阵→骨架空间matrix_arm=arm.matrix_world.inverted()@world_matrix2.相对绑定姿势(蒙皮用)python运行#该骨骼从Rest姿势到当前姿势的变换矩阵rel_mat=pb.matrix@pb.bone.matrix_local.inverted()3.骨骼空间↔父骨骼空间python运行#当前骨骼矩阵→父骨骼空间mat_in_parent=pb.parent.matrix.inverted()@pb.matrix#父骨骼空间矩阵→当前骨骼空间mat_local=pb.parent.matrix@mat_in_parent四、代码示例:获取与设置姿态矩阵示例1:读取并打印骨骼矩阵python运行importbpyarm=bpy.context.objectpb=arm.pose.bones.get("Bone")ifpb:print("===姿态骨骼矩阵信息===")print("matrix_basis(基础):\n",pb.matrix_basis)print("matrix(最终,含约束):\n",pb.matrix)print("matrix_local(骨架空间):\n",pb.matrix_local)print("世界空间矩阵:\n",arm.matrix_world@pb.matrix)print("相对绑定矩阵:\n",pb.matrix@pb.bone.matrix_local.inverted())示例2:直接设置姿态矩阵(覆盖)python运行importbpyfrommathutilsimportMatrixarm=bpy.context.objectpb=arm.pose.bones["Bone"]#构造一个目标4x4矩阵(示例:沿X轴平移1)target_mat=Matrix.Translation((1,0,0))@Matrix.Identity(4)#方法1:直接设置最终matrix(骨架空间)pb.matrix=target_matbpy.context.view_layer.update()#方法2:设置matrix_basis(相对父)pb.matrix_basis=target_matbpy.context.view_layer.update()示例3:从世界空间矩阵设置骨骼姿态python运行importbpyfrommathutilsimportMatrixarm=bpy.context.objectpb=arm.pose.bones["Bone"]#假设你有一个世界空间矩阵world_matworld_mat=Matrix.Translation((2,3,4))#转换到骨架空间并设置arm_mat=arm.matrix_world.inverted()@world_matpb.matrix=arm_matbpy.context.view_layer.update()五、常见误区与注意事项矩阵顺序:Blender是列主序,变换顺序为

平移×旋转×缩放(T*R*S)。约束生效:设置

matrix_basis

后,约束会在

update()

后作用于

matrix。坐标系:Blender为左手坐标系(Y向上),与OpenGL(右手)转换需注意符号。刷新:修改矩阵后必须调用

bpy.context.view_layer.update()

才能在视图中看到变化。蒙皮核心:顶点最终位置=

顶点绑定位置@rel_mat@权重,其中

rel_mat=pb.matrix@pb.bone.matrix_local.inverted()。六、快速公式总结基础姿态:matri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论