158 lines
6.0 KiB
Python
158 lines
6.0 KiB
Python
#!/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() |