forked from Rowland/EG
204 lines
6.2 KiB
Python
204 lines
6.2 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
快速缩放测试脚本 - 验证FBX缩放标准化功能
|
||
|
||
测试用例:
|
||
1. 模拟带有大缩放值的FBX结构
|
||
2. 验证智能标准化功能
|
||
3. 对比修复前后的效果
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
|
||
# 添加主目录到Python路径
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
||
|
||
from panda3d.core import Vec3
|
||
from main import MyWorld
|
||
|
||
|
||
def test_scale_normalization():
|
||
"""测试缩放标准化功能"""
|
||
print("🧪 FBX缩放标准化功能测试")
|
||
print("="*50)
|
||
|
||
# 创建测试世界
|
||
world = MyWorld()
|
||
|
||
# 创建模拟的FBX模型结构
|
||
test_model = create_mock_fbx_model(world)
|
||
|
||
print("\n📋 测试前的模型结构:")
|
||
print_model_hierarchy(test_model)
|
||
|
||
# 测试缩放标准化
|
||
print("\n🔧 执行缩放标准化...")
|
||
world.scene_manager._normalizeModelScales(test_model)
|
||
|
||
print("\n📋 测试后的模型结构:")
|
||
print_model_hierarchy(test_model)
|
||
|
||
# 验证结果
|
||
verify_normalization_results(test_model)
|
||
|
||
print("\n✅ 测试完成!")
|
||
|
||
|
||
def create_mock_fbx_model(world):
|
||
"""创建模拟的FBX模型结构"""
|
||
print("🏗️ 创建模拟FBX模型结构...")
|
||
|
||
# 创建根节点
|
||
root = world.render.attachNewNode("MockFBXModel")
|
||
root.setScale(1.0, 1.0, 1.0) # 根节点正常缩放
|
||
|
||
# 创建子节点(模拟FBX的大缩放值)
|
||
child1 = root.attachNewNode("Mesh001")
|
||
child1.setScale(100.0, 100.0, 100.0) # 典型的FBX大缩放
|
||
|
||
child2 = root.attachNewNode("Mesh002")
|
||
child2.setScale(100.0, 100.0, 100.0) # 另一个大缩放
|
||
|
||
child3 = root.attachNewNode("Bone001")
|
||
child3.setScale(1.0, 1.0, 1.0) # 正常缩放的骨骼
|
||
|
||
# 创建孙子节点
|
||
grandchild1 = child1.attachNewNode("SubMesh001")
|
||
grandchild1.setScale(1.0, 1.0, 1.0) # 正常缩放
|
||
|
||
grandchild2 = child2.attachNewNode("SubMesh002")
|
||
grandchild2.setScale(0.5, 0.5, 0.5) # 小缩放
|
||
|
||
# 创建一个异常的大缩放孙子节点
|
||
grandchild3 = child3.attachNewNode("BigScale")
|
||
grandchild3.setScale(50.0, 50.0, 50.0) # 另一种大缩放
|
||
|
||
print(f" ✓ 创建了包含 {count_all_nodes(root)} 个节点的模型")
|
||
return root
|
||
|
||
|
||
def count_all_nodes(node):
|
||
"""递归计算节点总数"""
|
||
count = 1
|
||
for i in range(node.getNumChildren()):
|
||
count += count_all_nodes(node.getChild(i))
|
||
return count
|
||
|
||
|
||
def print_model_hierarchy(model, depth=0):
|
||
"""打印模型层级结构"""
|
||
indent = " " * depth
|
||
scale = model.getScale()
|
||
max_scale = max(abs(scale.x), abs(scale.y), abs(scale.z))
|
||
|
||
# 标记缩放状态
|
||
if max_scale > 10:
|
||
status = "🔴大缩放"
|
||
elif max_scale < 1:
|
||
status = "🟡小缩放"
|
||
else:
|
||
status = "🟢正常"
|
||
|
||
print(f"{indent}📦 {model.getName()}: {scale} {status}")
|
||
|
||
# 递归打印子节点
|
||
for i in range(model.getNumChildren()):
|
||
child = model.getChild(i)
|
||
print_model_hierarchy(child, depth + 1)
|
||
|
||
|
||
def verify_normalization_results(model):
|
||
"""验证标准化结果"""
|
||
print("\n🔍 验证标准化结果:")
|
||
|
||
# 收集所有节点的缩放信息
|
||
all_scales = []
|
||
collect_all_scales(model, all_scales)
|
||
|
||
# 统计分析
|
||
large_scales = [s for s in all_scales if max(abs(s.x), abs(s.y), abs(s.z)) > 10]
|
||
normal_scales = [s for s in all_scales if 0.1 <= max(abs(s.x), abs(s.y), abs(s.z)) <= 10]
|
||
small_scales = [s for s in all_scales if max(abs(s.x), abs(s.y), abs(s.z)) < 0.1]
|
||
|
||
print(f" 总节点数: {len(all_scales)}")
|
||
print(f" 大缩放节点: {len(large_scales)} 个")
|
||
print(f" 正常缩放节点: {len(normal_scales)} 个")
|
||
print(f" 小缩放节点: {len(small_scales)} 个")
|
||
|
||
# 验证结果
|
||
if len(large_scales) == 0:
|
||
print(" ✅ 成功:没有大缩放节点残留")
|
||
else:
|
||
print(f" ❌ 失败:仍有 {len(large_scales)} 个大缩放节点")
|
||
|
||
if len(normal_scales) >= len(all_scales) * 0.7: # 至少70%是正常缩放
|
||
print(" ✅ 成功:大部分节点缩放正常化")
|
||
else:
|
||
print(" ⚠️ 警告:正常缩放节点比例较低")
|
||
|
||
|
||
def collect_all_scales(node, scales_list):
|
||
"""递归收集所有节点的缩放"""
|
||
scales_list.append(node.getScale())
|
||
|
||
for i in range(node.getNumChildren()):
|
||
child = node.getChild(i)
|
||
collect_all_scales(child, scales_list)
|
||
|
||
|
||
def test_scale_detection():
|
||
"""测试缩放检测算法"""
|
||
print("\n🔬 测试缩放检测算法:")
|
||
|
||
world = MyWorld()
|
||
scene_manager = world.scene_manager
|
||
|
||
# 创建测试数据
|
||
test_scales = [
|
||
{'scale': Vec3(100, 100, 100), 'name': 'Mesh001'},
|
||
{'scale': Vec3(100, 100, 100), 'name': 'Mesh002'},
|
||
{'scale': Vec3(100, 100, 100), 'name': 'Mesh003'},
|
||
{'scale': Vec3(1, 1, 1), 'name': 'Bone001'},
|
||
{'scale': Vec3(50, 50, 50), 'name': 'Special'},
|
||
{'scale': Vec3(1, 1, 1), 'name': 'Normal001'},
|
||
]
|
||
|
||
# 模拟检测过程
|
||
large_scales = [info for info in test_scales if max(abs(info['scale'].x), abs(info['scale'].y), abs(info['scale'].z)) > 10]
|
||
|
||
print(f" 发现 {len(large_scales)} 个大缩放节点:")
|
||
for info in large_scales:
|
||
max_scale = max(abs(info['scale'].x), abs(info['scale'].y), abs(info['scale'].z))
|
||
print(f" {info['name']}: {max_scale}")
|
||
|
||
# 测试常见缩放值检测
|
||
common_scale = scene_manager._findCommonLargeScale(large_scales)
|
||
print(f" 检测到常见大缩放值: {common_scale}")
|
||
|
||
if common_scale:
|
||
normalize_factor = 1.0 / common_scale
|
||
print(f" 计算的标准化因子: {normalize_factor}")
|
||
print(f" 标准化后的示例: {100.0 * normalize_factor}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
print("🚀 启动FBX缩放标准化测试")
|
||
print("\n" + "="*60)
|
||
|
||
# 运行主要测试
|
||
test_scale_normalization()
|
||
|
||
# 运行算法测试
|
||
test_scale_detection()
|
||
|
||
print("\n" + "="*60)
|
||
print("🎉 所有测试完成!")
|
||
|
||
except Exception as e:
|
||
print(f"❌ 测试失败: {str(e)}")
|
||
import traceback
|
||
traceback.print_exc() |