BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1767|回复: 5

如何用python获取一个连接到骨头的物体的子空间位置

[复制链接]
发表于 2013-5-4 14:31:03 | 显示全部楼层 |阅读模式
本帖最后由 JOHNNY孙 于 2013-5-4 14:54 编辑

如何用python获取一个连接到骨头的物体的子空间位置和旋转?
obj.matrix_local获得的是相对armature物体的变换,如何得到相对于骨头的呢?
armatureObject.pose.bone[2].matrix 是物体空间矩阵,但这里的旋转数据很奇怪,不同于 bone[2].rotation
发表于 2013-5-4 14:32:18 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-4 16:17:21 | 显示全部楼层
本帖最后由 JOHNNY孙 于 2013-5-4 21:42 编辑

推算出方法了,谢谢

matLocal = (armatureObject.matrix_world * bone.matrix).inverted() * obj.matrix_world

-----
上面的方法有误,继续摸索中~

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-6 16:09:28 | 显示全部楼层
congcong009 发表于 2013-5-4 23:35
子空间是指这个物体的原心在世界坐标中的位置么?那是否包含骨骼与子物体之间拥有offset?如果是同心,那么 ...

不好意思,是我的问题没说清楚

比如一支枪连接到了一个armature的第5根(表示手)的骨头上,并且有一定的offset,第5根骨头就是枪物体的parent_bone,现在我想得到的就是枪物体在其 parent_bone 空间的变换,类似于 matrix_local。

但直接使用 gun.matrix_local 得到的是 object space,就是相对于 armature object 的变换。
回复 支持 反对

使用道具 举报

发表于 2013-5-6 22:58:17 | 显示全部楼层
本帖最后由 imdjs 于 2013-5-6 23:08 编辑

是否应该用bone.matrix_local 代替bone.matrix 前者是4X4 后者是3X3 ,armatureObject.matrix_world 得到的矩阵都是4X4的

armatureObject.matrix_world * bone.matrix_local得到bone的全局矩阵
(armatureObject.matrix_world * bone.matrix_local).inverted() * obj.matrix_world得到以bone为父obj为子的本地矩阵
回复 支持 反对

使用道具 举报

发表于 2013-5-6 23:20:43 | 显示全部楼层
本帖最后由 imdjs 于 2013-5-6 23:21 编辑

我用三个物体做过实验 结果基本跟我的预期一致,在其它3D软件里也是这样的结果。
import bpy
#from mathutils import Vector,Matrix

l_o=bpy.data.objects
o蓝=l_o['蓝'];o绿=l_o['绿'];o红=l_o['红']

m蓝G=o蓝.matrix_world;m绿G=o绿.matrix_world;m红G=o红.matrix_world
m蓝L=o蓝.matrix_local;m绿L=o绿.matrix_local;m红L=o红.matrix_local
print(o蓝.name,o绿.name,o红.name)

def inverted():#求 绿 相对蓝 的本地矩阵
    o红.matrix_world=m蓝G*(m绿G.inverted())  #绿为父 谁invert谁为父 效果跟以下 不同
    o红.matrix_world=m绿G*(m蓝G.inverted())  #蓝为父 效果跟以下相同
    o红.matrix_world=(m蓝G.inverted())*m绿G  #蓝为父
    o红.matrix_world=m绿L #如果绿是蓝的子级 这个效果跟上面相同

def func2(): #求 绿的全局矩阵
    o红.matrix_world=m蓝G*m绿L #求绿的全局矩阵 效果跟以下相同
    o红.matrix_world=m绿G
    print("m绿G", m绿G ,"m绿L ",m绿L) #matrix 4X4
   #o红.matrix_world=m绿L*m蓝G #效果跟以上不同

#o红.matrix_world=m蓝G*(m绿G) #效果跟以下相同
#o红.matrix_world=m绿G*(m蓝G)

#o红.matrix_world=m蓝G.inverted()*(m绿G.inverted()) #效果跟以下相同
#o红.matrix_world=m绿G.inverted()*(m蓝G.inverted())

inverted()
func2()

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-11-15 04:10 , Processed in 0.019296 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表