EG/demo/test_center_gizmo.py
2025-07-10 09:19:51 +08:00

135 lines
4.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
坐标轴中心位置测试脚本
测试坐标轴是否正确显示在实体中心,并且不被实体遮挡
"""
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from main import MyWorld
from PyQt5.QtWidgets import QApplication
def test_center_gizmo():
"""测试坐标轴中心位置显示"""
print("=== 坐标轴中心位置测试 ===")
# 创建应用程序
app = QApplication.instance()
if app is None:
app = QApplication(sys.argv)
# 创建世界
world = MyWorld()
print("\n1. 测试导入模型...")
# 查找FBX测试文件
fbx_files = []
current_dir = os.path.dirname(os.path.abspath(__file__))
for filename in os.listdir(current_dir):
if filename.lower().endswith('.fbx'):
fbx_files.append(os.path.join(current_dir, filename))
if not fbx_files:
print("× 没有找到FBX测试文件")
return
# 导入第一个找到的FBX文件
test_file = fbx_files[0]
print(f"导入测试文件: {test_file}")
model = world.scene_manager.importModel(test_file)
if not model:
print("× 模型导入失败")
return
print("✓ 模型导入成功")
print("\n2. 测试选择模型...")
# 模拟选择模型
world.selection.updateSelection(model)
if world.selection.selectedNode:
print("✓ 模型选择成功")
# 检查坐标轴是否创建
if world.selection.gizmo:
print("✓ 坐标轴创建成功")
# 获取模型边界和坐标轴位置
bounds = model.getBounds()
if bounds and not bounds.isEmpty():
center = bounds.getCenter()
gizmo_pos = world.selection.gizmo.getPos()
print(f"\n3. 位置验证:")
print(f" 模型边界中心: {center}")
print(f" 坐标轴位置: {gizmo_pos}")
# 验证坐标轴是否在中心位置(允许小的浮点误差)
pos_diff = abs(gizmo_pos.x - center.x) + abs(gizmo_pos.y - center.y) + abs(gizmo_pos.z - center.z)
if pos_diff < 0.1: # 允许0.1的误差
print("✓ 坐标轴位置正确设置在实体中心")
else:
print(f"× 坐标轴位置不在中心,偏差: {pos_diff}")
# 检查渲染设置
print(f"\n4. 渲染设置验证:")
print(f" 坐标轴渲染bin: {world.selection.gizmo.getBin()}")
print(f" 坐标轴深度测试: {world.selection.gizmo.getDepthTest()}")
print(f" 坐标轴深度写入: {world.selection.gizmo.getDepthWrite()}")
if world.selection.gizmoXAxis:
print(f" X轴渲染bin: {world.selection.gizmoXAxis.getBin()}")
print(f" X轴深度测试: {world.selection.gizmoXAxis.getDepthTest()}")
if world.selection.gizmoYAxis:
print(f" Y轴渲染bin: {world.selection.gizmoYAxis.getBin()}")
print(f" Y轴深度测试: {world.selection.gizmoYAxis.getDepthTest()}")
if world.selection.gizmoZAxis:
print(f" Z轴渲染bin: {world.selection.gizmoZAxis.getBin()}")
print(f" Z轴深度测试: {world.selection.gizmoZAxis.getDepthTest()}")
print("✓ 渲染设置已应用")
else:
print("× 坐标轴创建失败")
else:
print("× 模型选择失败")
print("\n5. 测试说明:")
print(" - 坐标轴现在应该显示在实体的几何中心")
print(" - 即使部分坐标轴在实体内部,也应该完全可见")
print(" - 坐标轴具有最高的渲染优先级,不会被任何实体遮挡")
print(" - 三个轴有独立的渲染优先级X(201), Y(202), Z(203)")
print("\n=== 测试完成 ===")
# 启动交互模式让用户查看结果
print("\n按任意键查看3D场景...")
input()
# 显示3D窗口
try:
from ui.main_window import setup_main_window
app, main_window = setup_main_window(world)
main_window.show()
print("✓ 3D窗口已打开请验证:")
print(" 1. 坐标轴是否显示在实体中心")
print(" 2. 坐标轴是否完全可见(不被实体遮挡)")
print(" 3. 可以正常点击和拖拽坐标轴")
app.exec_()
except Exception as e:
print(f"显示3D窗口时出错: {e}")
if __name__ == "__main__":
test_center_gizmo()