armature


-- 获取Armature配置文件路径

function GetArmatureFilePath(name)
local armatureResourceRelativePaths = {
"res/image/sprite/",
"res/image/effect/",
}
for i=1,#armatureResourceRelativePaths do
local relativePath = armatureResourceRelativePaths[i]..name.."/"
local relativeFileName = relativePath..name..".ExportJson"
local isExist = cc.FileUtils:getInstance():isFileExist(relativeFileName)
if isExist then
return relativeFileName
end
end
return nil
end
 
function ArmatureResourceManager:loadArmature(name)
if name == nil then
return false
end 
local armatureDataManager = ccs.ArmatureDataManager:getInstance()
local animationData = armatureDataManager:getAnimationData(name)
if nil == animationData then
local resourcePath = GetArmatureFilePath(name)
if resourcePath then
armatureDataManager:addArmatureFileInfo(resourcePath)
else
cclog(string.format("Failure to found Armature '%s' in ArmatureResourceList", name))
return false
end
end
return true
end



 

-- 特效-armature

local effectName = 'ef_weilan'
local ret = ArmatureResourceManager.getInstance():loadArmature(effectName)
if ret then
          self.mEffectSprite = ccs.Armature:create(effectName)
          local effectPosition = cc.p(500,500)
          self.mEffectSprite:setPosition(effectPosition)
          self:addChild(self.mEffectSprite)
 
          self.mEffectSprite:getAnimation():playWithIndex(0)
          -- 参数 armature,完成程度,动作名称(idle)  ,动作完成后的回调
          local function animationEvent(armatureBack, movementType,movementID)
              local id = movementID
              if movementType == ccs.MovementEventType.complete then
              end
          end
       self.mEffectSprite:getAnimation():setMovementEventCallFunc(animationEvent)
 end
farmature = ccs.Armature:create("n02")
farmature :getAnimation():play("idle01")
-- 初始化为第0帧
bgComponentluobo:getAnimation():gotoAndPause(0)


 

def execute(self, context): props = context.scene.example_props ref_dummy = props.obj_ref armature_name = props.armature_list # 数据验证(保持不变) if not armature_name or not ref_dummy: self.report({'ERROR'}, "未指定骨架或参考物体") return {'CANCELLED'} armature_obj = bpy.data.objects.get(armature_name) if not armature_obj or armature_obj.type != 'ARMATURE': self.report({'ERROR'}, f"无效的骨架对象: {armature_name}") return {'CANCELLED'} bpy.context.view_layer.objects.active = armature_obj bpy.ops.object.mode_set(mode='POSE') # ==== 核心优化逻辑 ==== def copy_dummy_to_bone(src_dummy, target_bone): """ 优化:分离缩放并重建变换矩阵 """ loc, rot, sca = src_dummy.matrix_world.decompose() if src_dummy.name == "Master": # 根骨骼特殊处理 sca = Vector((-1, -1, -1)) # 物体模式-0.01 → 姿态模式-1 else: sca = Vector((1, 1, 1)) # 非根骨骼始终缩放1 # 重建骨骼姿态矩阵(排除虚拟体原始缩放) bone_pose_mat = ( armature_obj.matrix_world.inverted() @ Matrix.LocRotScale(loc, rot, sca) ) target_bone.matrix = bone_pose_mat # 递归处理子物体 for child_dummy in src_dummy.children: child_bone = armature_obj.pose.bones.get(child_dummy.name) if child_bone: copy_dummy_to_bone(child_dummy, child_bone) # 骨骼映射与Master查找(保持不变) bone_map = {bone.name: bone for bone in armature_obj.pose.bones} master_dummy = next( (obj for obj in [ref_dummy] + list(ref_dummy.children) if "Master" in obj.name), None ) if not master_dummy: self.report({'ERROR'}, "未找到Master根虚拟体") return {'CANCELLED'} master_bone = bone_map.get(master_dummy.name) if master_bone: copy_dummy_to_bone(master_dummy, master_bone) else: self.report({'ERROR'}, f"骨骼 {master_dummy.name} 不存在") bpy.context.view_layer.update() self.report({'INFO'}, "虚拟体位姿已复制到骨骼") return {'FINISHED'} 帮我找出这个代码的问题,这个代码的功能应该是将ref_dummy的数据传递给armature骨架,那应该每次运行时都会直接得到最终结果,可目前的情况是这个代码的前几次运行都会得到不同的结果
最新发布
07-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值