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

158 lines
6.0 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.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from main import MyWorld
from panda3d.core import Vec3, Point3, CardMaker
from direct.task.TaskManagerGlobal import taskMgr
import time
import math
def test_rotation_drag():
"""测试旋转后模型的子节点拖拽方向"""
print("=== 测试旋转后模型的子节点拖拽方向 ===")
# 创建世界
world = MyWorld()
# 创建父模型(立方体)
cm_parent = CardMaker("parent_cube")
cm_parent.setFrame(-2, 2, -2, 2)
parent_model = world.render.attachNewNode(cm_parent.generate())
parent_model.setName("parent_model")
parent_model.setPos(0, 0, 1) # 在地面上方
parent_model.setColor(0.5, 0.5, 1, 1) # 蓝色
# 创建子节点(小立方体)
cm_child = CardMaker("child_cube")
cm_child.setFrame(-0.5, 0.5, -0.5, 0.5)
child_model = parent_model.attachNewNode(cm_child.generate())
child_model.setName("child_model")
child_model.setPos(3, 0, 0) # 相对于父节点的位置(父节点右侧)
child_model.setColor(1, 0, 0, 1) # 红色
# 将父模型添加到模型列表
world.models.append(parent_model)
# 设置碰撞检测
world.scene_manager.setupCollision(parent_model)
world.scene_manager.setupCollision(child_model)
print(f"父模型位置: {parent_model.getPos()}")
print(f"父模型旋转: {parent_model.getHpr()}")
print(f"子模型位置: {child_model.getPos()}")
print(f"子模型世界位置: {child_model.getPos(world.render)}")
# 测试1选择父模型验证其拖拽方向
print("\n=== 测试1选择父模型 ===")
world.selection.updateSelection(parent_model)
def test_parent_drag(task):
print("父模型拖拽测试开始...")
# 检查坐标轴
if world.selection.gizmo:
gizmo_pos = world.selection.gizmo.getPos()
gizmo_hpr = world.selection.gizmo.getHpr()
print(f"父模型坐标轴位置: {gizmo_pos}")
print(f"父模型坐标轴朝向: {gizmo_hpr}")
print("✓ 父模型坐标轴应该使用世界坐标系H=0, P=0, R=0")
# 等待3秒后旋转父模型
taskMgr.doMethodLater(3.0, rotate_parent, "rotate_parent")
return task.done
def rotate_parent(task):
print("\n=== 旋转父模型45度 ===")
parent_model.setHpr(45, 0, 0) # 绕Z轴旋转45度
print(f"父模型新旋转: {parent_model.getHpr()}")
print(f"子模型新世界位置: {child_model.getPos(world.render)}")
# 选择子节点进行测试
taskMgr.doMethodLater(1.0, test_child_drag, "test_child_drag")
return task.done
def test_child_drag(task):
print("\n=== 测试2选择子模型 ===")
world.selection.updateSelection(child_model)
# 检查子节点的坐标轴
if world.selection.gizmo:
gizmo_pos = world.selection.gizmo.getPos()
gizmo_hpr = world.selection.gizmo.getHpr()
parent_hpr = parent_model.getHpr()
print(f"子模型坐标轴位置: {gizmo_pos}")
print(f"子模型坐标轴朝向: {gizmo_hpr}")
print(f"父模型朝向: {parent_hpr}")
# 验证坐标轴朝向
if abs(gizmo_hpr.x - parent_hpr.x) < 0.1:
print("✓ 子模型坐标轴朝向正确跟随父模型")
else:
print("✗ 子模型坐标轴朝向未跟随父模型")
# 模拟拖拽测试
taskMgr.doMethodLater(2.0, simulate_drag_test, "simulate_drag_test")
return task.done
def simulate_drag_test(task):
print("\n=== 模拟拖拽测试 ===")
print("请手动测试以下操作:")
print("1. 点击子模型的红色X轴并拖拽")
print(" - 应该沿着父模型的局部X轴方向移动已旋转45度")
print(" - 而不是沿着世界X轴方向移动")
print("2. 点击子模型的绿色Y轴并拖拽")
print(" - 应该沿着父模型的局部Y轴方向移动已旋转45度")
print("3. 点击子模型的蓝色Z轴并拖拽")
print(" - 应该沿着Z轴方向移动Z轴未旋转")
# 添加更多旋转测试
taskMgr.doMethodLater(5.0, test_more_rotations, "test_more_rotations")
return task.done
def test_more_rotations(task):
print("\n=== 测试更复杂的旋转 ===")
# 旋转父模型到不同角度
parent_model.setHpr(30, 45, 15) # 复杂旋转
print(f"父模型复杂旋转: {parent_model.getHpr()}")
# 强制更新坐标轴
world.selection.updateSelection(child_model)
if world.selection.gizmo:
gizmo_hpr = world.selection.gizmo.getHpr()
print(f"子模型坐标轴新朝向: {gizmo_hpr}")
print("坐标轴朝向应该与父模型一致")
# 添加视觉验证指南
taskMgr.doMethodLater(2.0, visual_guide, "visual_guide")
return task.done
def visual_guide(task):
print("\n=== 视觉验证指南 ===")
print("观察要点:")
print("1. 子模型的坐标轴应该与父模型保持相同的旋转角度")
print("2. 拖拽子模型时,移动方向应该遵循坐标轴的视觉方向")
print("3. 红色X轴拖拽 → 沿红色轴方向移动")
print("4. 绿色Y轴拖拽 → 沿绿色轴方向移动")
print("5. 蓝色Z轴拖拽 → 沿蓝色轴方向移动")
print("\n如果拖拽方向与坐标轴视觉方向一致,则修复成功!")
return task.done
# 启动测试
taskMgr.doMethodLater(1.0, test_parent_drag, "test_parent_drag")
# 运行引擎
world.run()
if __name__ == "__main__":
test_rotation_drag()