天晴动作工具组文档
首页
C3相关
天晴盒子
脚本文档
开发公约
  • MAXScript2020 Help (opens new window)
  • 3dsmax-2023-MAXScript Help (opens new window)
  • 3dsmax-2023-Max-Python Help (opens new window)
  • DeveloperSDK2023 Help (opens new window)
教程
更新
关于
  • 动画重定向
  • 3ds Max 文件降版本
  • GIF播放器
  • 表情绑定助手
  • MAXtoUnrealTools
  • MMD4Max
  • AnimFiltersMax2021
  • 分类
  • 标签
  • 归档
首页
C3相关
天晴盒子
脚本文档
开发公约
  • MAXScript2020 Help (opens new window)
  • 3dsmax-2023-MAXScript Help (opens new window)
  • 3dsmax-2023-Max-Python Help (opens new window)
  • DeveloperSDK2023 Help (opens new window)
教程
更新
关于
  • 动画重定向
  • 3ds Max 文件降版本
  • GIF播放器
  • 表情绑定助手
  • MAXtoUnrealTools
  • MMD4Max
  • AnimFiltersMax2021
  • 分类
  • 标签
  • 归档
  • CATRig

    • 创建CAT
    • 创建特别注意
    • 动画-图层
    • 动画-IK_Arm_手
    • 动画-IK_Leg_腿
    • 动画-导入-bip
    • 动画-IK固定
    • 动画-缩放拉伸
    • 导出-Motion-Extraction-Node
  • NetSDK(C#)动画曲线插件课程
  • 蒙皮增强
  • 游戏中的动画拉伸效果 - 上
  • FBXMetaData
  • Engine

    • Unity上下半身动画融混合
    • Unity资源单位
    • UE4_AnimDynamics
    • UE4_Dynamic_Simulated_Ponytail
    • UE4_径向模糊
    • UE4CharacterMovement
    • montage
    • UE4基础材质
    • unity_DynamicBone
    • 快速创建包围盒UE4
    • 跳跃动作注意
    • 虚幻EditorUtilityBlueprint_动作资源批量工具
  • MaxPython_Msx

    • Python执行MAXScript
    • 3dsMax 安装 NumPy
    • Python 编译 pyd
    • Sublime Text 发送到 3ds Max
    • Visual Studio Code 发送到 3ds Max
    • 3dsMax_Python中文编码
    • 3dsMax PySide 控件键盘输入问题
    • Max不同版本的Python差异
    • FBX_SDK_动画操作
    • Python3编译Pyd-vc14.16
  • iPhone表情捕捉3dsMax流程
  • 面部蒙皮权重处理
  • Cascadeur动画调研
  • AI视频动捕产品调研
  • RigNet自动绑定角色-AI- 部署测试
  • MotoricaAI-MoGen 动画合成
  • 3dsMax与Spine互导工具
  • EasyMocap视频动捕部署测试
  • FreeMocap无标记视频动捕部署
  • RootMotion和InPlace动画差异
  • 虚幻物理资产导出XML
    • 3.1 胶囊体
    • 3.2 关节约束
      • 3.3 Constraint Behavior
      • 3.4 LinearLimits, LinearMotaor
    • 4.1 对象序列化
    • 4.2 物理资产操作
  • 关闭骨骼移动带转父级的特性
  • 简易Biped绑定框架方案
  • 关于蒙皮权重镜像匹配问题介绍以及解决方案
  • GVHMR视频动捕部署
  • 教程
2025-01-18
目录

虚幻物理资产导出XML

# 虚幻物理资产导出XML

导出虚幻引擎的角色PhysicsAsset 资产为xml格式 , 方便在其他引擎或者软件中创建 角色布娃娃系统的PhysicsAsset 资产参数,导出的参数如下。

  • 胶囊体参数,类型,如球体,胶囊体,BOX,骨骼信息 .
  • 关节约束信息。
  1. # 安装 UE-TAPython

使用python 库导出,这里因为虚幻官方的 python库中没有读取胶囊体数据的API,所以使用一个第三库,PythonPhysicsAssetLib - TAColor (opens new window)

Releases · cgerchenhp/UE_TAPython_Plugin_Release · GitHub (opens new window)

下载过来之后解压 得到 TAPython 文件夹,放进项目的Plugins 文件夹即可

descript

关于该库的细节 可直接查看其首页 欢迎来到UE Python 脚本工具TAPython的主页 - TAColor (opens new window)

descript

  1. # 使用脚本

    SkeletonToPhysicsAssetToXMl_v3.py

descript

descript

导出保存路径为资产同级目录底下

  1. # XML格式

# 3.1 胶囊体

导出 碰撞体的 类型,如球体,胶囊体,盒子 。

  • 大小,半径,长度。
  • 碰撞体的轴心位置,相对骨骼的轴心的偏移数据。
  • 质量设置无法导出,
radius 胶囊体 半径 descript
height 胶囊体 长度
pos 胶囊体中心位置,
quaternion 胶囊体旋转

# 3.2 关节约束

  • 约束的具体参数信息可导出,每个轴向的限制信息等等
  • 约束的位置无法导出, 只能是默认在骨骼轴心上。

PhysX3.4文档(9) -- Joints - 知乎 (opens new window)

unreal.ConstraintInstanceBlueprintLibrary — Unreal Python 5.4 (Experimental) documentation

# 3.3 Constraint Behavior

descript descript disable_collsion
descript parent_dominates
descript mass_conditioning
descript enable_projection
descript linear_alpha
descript angular_alpha

# 3.4 LinearLimits, LinearMotaor

轴向移动限制,Locked不能移动

[TABLE]

3.5 AngularMotor

轴向旋转 限制,free 随意旋转,limited 限制角度旋转,locked 禁止旋转

[TABLE]

  1. # Python细节

# 4.1 对象序列化

是将Python 对象类转换成可保存到文件的文本格式。这里只需重写类 的__dict__方法,如下

class capsules(bodiebase):
	def __init__(self) -> None:
		self.center = vector3d()
		self.rotation = Rotator3d()
		self.radius = 0.0 
		self.length = 0.0
	@property
	def __dict__(self):
		dict_ = {}
		dict_["radius"] = cm_m_units_string(self.radius)
		dict_["height"] = cm_m_units_string(self.length)

		dict_["pos"] = vector3d_to_string(self.pos,6)
		dict_["quaternion"] = quaternion_to_string(self.gl_tm.rotation)
		dict_["rotation"] = Rotator_to_string(self.euler_rot) 

		return dict_


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

可以自定义类如何转为 dict ,以及哪些属性可以被转移。

直接使用 xml.etree这个自动库 对象类转换 xml 的元素节点

import xml.etree.ElementTree as ET
def capsules_to_xml(obj):
	return ET.Element("capsule" ,obj.__dict__)

1
2
3
4

# 4.2 物理资产操作

PythonPhysicsAssetLib - TAColor (opens new window)

拿到物理资源的 骨骼树,各个骨骼的名字和序号ID

bone_names,bone_ids = unreal.PythonPhysicsAssetLib.get_bodies_hierarchy(self.current_PhysicsAsset)

1
2

拿到某个骨骼的碰撞体的 ID数组,如果胶囊体,一个骨骼可以设置多个碰撞体。

bodys_id = unreal.PythonPhysicsAssetLib.get_bodies_from_bone(self.current_PhysicsAsset,bone_body.boneid)

1
2

拿到某个碰撞体的属性信息,如半径,长度,旋转值(局部坐标系)等。

length = unreal.PythonPhysicsAssetLib.get_body_length(current_asset,bodys_id)
		radius = unreal.PythonPhysicsAssetLib.get_body_radius(current_asset,bodys_id)
		rotation =  unreal.PythonPhysicsAssetLib.get_body_rotation(current_asset,bodys_id)
		bone_body_center = unreal.PythonPhysicsAssetLib.get_body_center(current_asset,bodys_id)
		size = unreal.PythonPhysicsAssetLib.get_body_size(current_asset,bodys_id)

1
2
3
4
5
6

# 5. 3dsMax导入

将从虚幻中导出的 物理资产 xml 导入进 3dsMax .

descript

3ds Max 与 UE 的坐标系区别在于 Y 轴方向相反,而 XZ 轴完全一致,

所以 3ds Max 中的位移 (x, y, z),转换到 UE 中就变为 (x, -y, z)。

UE 的quaternion 四元数旋转数值 到3dsMax 里的最终数据是 (x, -y , z, w)

同样使用Python 解析 xml 文件,因为使用 pymxs 所以只支持高版本3dsMax

#max_import_phsics_asset_xml_v2.py 
#3dsMax 2022

import xml.etree.ElementTree as ET
from xml.dom import minidom
from pymxs import runtime as rt

rt.execute("fn quat_matrix3 b = (return b as matrix3)")

def to_point3(li):
	#ue to 3dsMax
	return rt.point3(float(li[0]),float(li[1]) * -1.0,float(li[2]))

def to_quaternion(li):
	#ue to 3dsMax
	return rt.quat(float(li[0]),float(li[1])* -1.0,float(li[2]),float(li[3]))

def to_matrix3(p1,p2,p3,p4):
	return rt.matrix3(p1,p2,p3,p4)

def to_eulerAngles(li):
	#ue to 3dsMax
	return rt.eulerAngles(float(li[1]),float(li[0])*-1.0,float(li[2])*-1.0)

def import_physics_asset_XMl(xmlfile):
	tree = ET.parse(xmlfile)
	root = tree.getroot()
	rigbody = root.findall("Skp/RigidBody")
	for i in rigbody:	
		p = rt.Capsule()
		p.name = i.attrib['name']
		rt.select(p)
		for o in i.iter("capsule") :
			p.radius = float(o.attrib['radius'])
			p.height = float(o.attrib['height'])
		
			p.pivot = p.center 
		
			pos_str = o.attrib['pos']
			pos_ = pos_str.split(" ")

			rot_str = o.attrib['quaternion']

			rot_ = rot_str.split(" ")

			ruler_rot = o.attrib['rotation']
			ruler_ = ruler_rot.split(" ")
		
			e_rot = to_eulerAngles(ruler_)
			q_rot = to_quaternion(rot_)
		
			#rot_tm = rt.quat_matrix3(e_rot)
			rot_tm = rt.quat_matrix3(q_rot)
		
			p.transform = rot_tm 
			p.pos = to_point3(pos_)
		

if __name__ == "__main__":
	#xmlfile = r"D:\Documents\Unreal Projects\PhysicsAsset_Python\Content\Test\TestAsix.xml"
	xmlfile = r"D:\Documents\Unreal Projects\PhysicsAsset_Python\Content\Darkelf_Boss\Darkelf_Boss.xml"
	import_physics_asset_XMl(xmlfile)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
RootMotion和InPlace动画差异
关闭骨骼移动带转父级的特性

← RootMotion和InPlace动画差异 关闭骨骼移动带转父级的特性→

最近更新
01
GVHMR视频动捕部署
04-20
02
关于蒙皮权重镜像匹配问题介绍以及解决方案
03-19
03
简易Biped绑定框架方案
03-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 ND|99u:199505| 鄂ICP备2022012500号 | 鄂公网安备 42022202000122号

共产主义:是对生产资料的共享,不是对生活资料财产的均分

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×