#!/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()