From ef2c8b777c1f9303f379fe3cd041f286b2a72a70 Mon Sep 17 00:00:00 2001 From: Hector <2055590199@qq.com> Date: Fri, 15 Aug 2025 15:06:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=A9=E6=94=BE=E5=BD=B1?= =?UTF-8?q?=E5=93=8D=E5=AD=90=E8=8A=82=E7=82=B9=E7=A7=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/AugmentWebviewStateStore.xml | 2 +- .../__pycache__/Panda3DWorld.cpython-312.pyc | Bin 5776 -> 5776 bytes .../QMouseWatcherNode.cpython-312.pyc | Bin 1851 -> 1851 bytes .../QPanda3DWidget.cpython-312.pyc | Bin 12720 -> 12720 bytes ...anda3D_Buttons_Translation.cpython-312.pyc | Bin 2580 -> 2580 bytes .../QPanda3D_Keys_Translation.cpython-312.pyc | Bin 29227 -> 29227 bytes ...da3D_Modifiers_Translation.cpython-312.pyc | Bin 947 -> 947 bytes QPanda3D/__pycache__/__init__.cpython-312.pyc | Bin 245 -> 245 bytes __pycache__/main.cpython-312.pyc | Bin 37575 -> 37575 bytes .../CustomMouseController.cpython-312.pyc | Bin 6345 -> 6345 bytes core/__pycache__/selection.cpython-312.pyc | Bin 60291 -> 58892 bytes core/__pycache__/world.cpython-312.pyc | Bin 39638 -> 39638 bytes core/selection.py | 168 +++++++----------- .../__pycache__/scene_manager.cpython-312.pyc | Bin 51092 -> 51092 bytes .../interface_manager.cpython-312.pyc | Bin 12762 -> 12762 bytes ui/__pycache__/main_window.cpython-312.pyc | Bin 42722 -> 42962 bytes ui/__pycache__/property_panel.cpython-312.pyc | Bin 233956 -> 233956 bytes ui/__pycache__/widgets.cpython-312.pyc | Bin 19620 -> 19620 bytes ui/main_window.py | 3 +- 19 files changed, 66 insertions(+), 107 deletions(-) diff --git a/.idea/AugmentWebviewStateStore.xml b/.idea/AugmentWebviewStateStore.xml index a67ef38e..a6b0ca0d 100644 --- a/.idea/AugmentWebviewStateStore.xml +++ b/.idea/AugmentWebviewStateStore.xml @@ -3,7 +3,7 @@ diff --git a/QPanda3D/__pycache__/Panda3DWorld.cpython-312.pyc b/QPanda3D/__pycache__/Panda3DWorld.cpython-312.pyc index c3c7a60c9f068cb143c1894ffe289f426b9adc63..d887787044c056ecc9a78900ad2ef0f25fd25e14 100644 GIT binary patch delta 20 acmbQBJ3*KGG%qg~0}#~DnYWR@G%qg~0}#~DnYWRflM4VefCSS3 delta 20 acmbOtGDU>@G%qg~0}$}en!AyklM4VbQ3PH9 diff --git a/QPanda3D/__pycache__/QPanda3D_Keys_Translation.cpython-312.pyc b/QPanda3D/__pycache__/QPanda3D_Keys_Translation.cpython-312.pyc index 971da875de7e6e6e21d5dae7e4f91fa4e8c0f772..98f78c672e896bad050ec2ccf7577afb9f561fae 100644 GIT binary patch delta 22 ccmZ4egmLu~M()$Ryj%=GP(NqhMs9^709up>A^-pY delta 22 ccmZ4egmLu~M()$Ryj%=Gz&mU1Ms9^709R!OtpET3 diff --git a/QPanda3D/__pycache__/QPanda3D_Modifiers_Translation.cpython-312.pyc b/QPanda3D/__pycache__/QPanda3D_Modifiers_Translation.cpython-312.pyc index 24e5ba36e7230288ece0195fcd5eb2674be4f993..f2cd37d140b61052f3c41ab72c95c56accdede39 100644 GIT binary patch delta 20 acmdnYzL}l-G%qg~0}#~DnYWR91v3CReFcvI delta 20 acmdnYzL}l-G%qg~0}$}en!AyE1v3COP6ZkO diff --git a/QPanda3D/__pycache__/__init__.cpython-312.pyc b/QPanda3D/__pycache__/__init__.cpython-312.pyc index 868b2e22d18118b9cb79ef002d90a49330073b64..8519d1969a129bb6153e373f275226d2ba8f7a9d 100644 GIT binary patch delta 19 Zcmey$_?40SG%qg~0}#~DnKzO96#zR-1||Ri delta 19 Zcmey$_?40SG%qg~0}$}enmdvE6#zJr1+f4C diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index e35aa17c970d224f62c67c68205b8a6dfa09d1fc..c1b6b80689e6f1378fe5196aa655f204e1c100d0 100644 GIT binary patch delta 22 ccmX@UlIOOh delta 20 acmX?Uc+!yjG%qg~0}u$zn!AyEp9BCt&;`f< diff --git a/core/__pycache__/selection.cpython-312.pyc b/core/__pycache__/selection.cpython-312.pyc index da8b40dddd5302961b8d25008ccda77dd73a93b8..68ef7ea41cf3d67756c7aa6bbd59c0dbac3f62c5 100644 GIT binary patch delta 3992 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 {world_axis_vector}") else: - # 顶级节点,直接使用世界轴向量 world_axis_vector = local_axis_vector - print(f"世界轴向量: {world_axis_vector}") - - # 计算轴的端点位置(用于屏幕投影) + # 顶级模型:使用世界坐标系 + # print(f"顶级模型拖拽 - 使用世界坐标系") + # transform_context = self.world.render axis_end = gizmo_world_pos + world_axis_vector # 投影到屏幕空间 @@ -1279,83 +1267,62 @@ class SelectionSystem: projected_distance = (mouseDeltaX * screen_axis_dir[0] + mouseDeltaY * screen_axis_dir[1]) - # 计算动态比例因子,基于相机距离和视野角度 - cam_pos = self.world.cam.getPos() - distance_to_object = (cam_pos - gizmo_world_pos).length() + scale_adjustment = 1.0 + if parent_node and parent_node!= self.world.render: + current_node = parent_node + total_scale = 1.0 + while current_node and current_node != self.world.render: + node_scale = current_node.getScale() + avg_scale = (node_scale.x+node_scale.y + node_scale.z)/3.0 + total_scale *= avg_scale + current_node = current_node.getParent() + if total_scale>0: + scale_adjustment = 1.0 / total_scale + # parent_scale = parent_node.getScale() + # avg_scale = (parent_scale.x+parent_scale.y+parent_scale.z)/3.0 + # if avg_scale>0: + # scale_adjustment = 1.0 / avg_scale - # 获取相机的视野角度 - fov = self.world.cam.node().getLens().getFov()[0] # 水平视野角度 - fov_radians = math.radians(fov) - # 获取窗口尺寸 - winWidth, winHeight = self.world.getWindowSize() + fixed_pixel_to_world_ratio = 0.01 # 1像素 = 0.01世界单位 + scale_factor = fixed_pixel_to_world_ratio * scale_adjustment - # 计算一个像素在世界坐标系中的大小(在目标物体的距离处) - # 使用透视投影公式:world_size = screen_size * distance * tan(fov/2) / (screen_width/2) - pixel_to_world_ratio = distance_to_object * math.tan(fov_radians / 2) / (winWidth / 2) - - # 【改进修复】:智能缩放补偿,区分继承缩放和本体缩放 - # 计算父节点链的累积缩放(不包括目标节点本身) - parent_cumulative_scale = 1.0 - current_node = self.gizmoTarget.getParent() - while current_node and current_node != self.world.render: - node_scale = current_node.getScale() - # 使用缩放的几何平均值作为累积因子 - scale_magnitude = (abs(node_scale.x) * abs(node_scale.y) * abs(node_scale.z)) ** (1.0/3.0) - parent_cumulative_scale *= scale_magnitude - current_node = current_node.getParent() - - # 获取目标节点自身的缩放 - target_scale = self.gizmoTarget.getScale() - target_scale_magnitude = (abs(target_scale.x) * abs(target_scale.y) * abs(target_scale.z)) ** (1.0/3.0) - - # 智能补偿策略: - # 1. 只对父节点链的小缩放进行完全补偿(这通常是单位转换导致的) - # 2. 对目标节点自身的缩放进行部分补偿(避免大模型缩小后移动过快) - parent_compensation = 1.0 / parent_cumulative_scale if parent_cumulative_scale > 0 else 1.0 - - # 对目标节点自身的缩放使用平方根补偿,减少过度补偿 - target_compensation = 1.0 / math.sqrt(target_scale_magnitude) if target_scale_magnitude > 0 else 1.0 - - # 限制目标补偿的最大值,避免移动过快 - target_compensation = min(target_compensation, 10.0) # 最大10倍补偿 - - # 综合补偿因子 - total_compensation = parent_compensation * target_compensation - scale_factor = pixel_to_world_ratio * 0.5*total_compensation - - # 【关键修复】:在正确的坐标系中计算移动向量 - # 计算移动距离(标量) movement_distance = projected_distance * scale_factor - - # 在正确的坐标系中计算移动向量 - if transform_context != self.world.render: - # 子节点:在父节点的局部坐标系中移动 - if self.dragGizmoAxis == "x": - movement_local = Vec3(movement_distance, 0, 0) - elif self.dragGizmoAxis == "y": - movement_local = Vec3(0, movement_distance, 0) - elif self.dragGizmoAxis == "z": - movement_local = Vec3(0, 0, movement_distance) - - # 将局部移动向量转换到父节点的坐标系中 - # 由于我们要应用到目标节点上,而目标节点相对于父节点,我们直接使用局部移动 - movement = movement_local - print(f"子节点移动向量(局部): {movement}") + # 获取当前位置并只修改选中轴的坐标 + currentPos = self.gizmoTargetStartPos + + # 根据拖拽的轴,只修改对应的坐标分量 + if self.dragGizmoAxis == "x": + newPos = Vec3(currentPos.x + movement_distance, currentPos.y, currentPos.z) + print(f"X轴移动:{currentPos.x} -> {newPos.x}") + elif self.dragGizmoAxis == "y": + newPos = Vec3(currentPos.x, currentPos.y + movement_distance, currentPos.z) + print(f"Y轴移动:{currentPos.y} -> {newPos.y}") + elif self.dragGizmoAxis == "z": + newPos = Vec3(currentPos.x, currentPos.y, currentPos.z + movement_distance) + print(f"Z轴移动:{currentPos.z} -> {newPos.z}") else: - # 顶级模型:在世界坐标系中移动 - if self.dragGizmoAxis == "x": - movement = Vec3(movement_distance, 0, 0) - elif self.dragGizmoAxis == "y": - movement = Vec3(0, movement_distance, 0) - elif self.dragGizmoAxis == "z": - movement = Vec3(0, 0, movement_distance) - print(f"顶级模型移动向量(世界): {movement}") - - # 应用移动到目标节点 - newPos = self.gizmoTargetStartPos + movement - self.gizmoTarget.setPos(newPos) + print(f"未知轴: {self.dragGizmoAxis}") + return + + # 应用新位置到目标节点 + light_object = self.gizmoTarget.getPythonTag("rp_light_object") + if light_object: + light_object.pos = newPos + self.gizmoTarget.setPos(newPos) + else: + self.gizmoTarget.setPos(newPos) + + # 更新坐标轴位置 - 计算新的中心位置 + minPoint = Point3() + maxPoint = Point3() + if self.gizmoTarget.calcTightBounds(minPoint, maxPoint, self.world.render): + center = Point3((minPoint.x + maxPoint.x) * 0.5, + (minPoint.y + maxPoint.y) * 0.5, + (minPoint.z + maxPoint.z) * 0.5) + self.gizmo.setPos(center) + # 实时更新属性面板 self.world.property_panel.refreshModelValues(self.gizmoTarget) # 每次拖拽都输出调试信息(但限制频率) @@ -1365,18 +1332,9 @@ class SelectionSystem: import time current_time = time.time() if current_time - self._last_drag_debug_time > 0.1: # 每0.1秒最多输出一次 - print(f"拖拽更新成功 - 轴:{self.dragGizmoAxis}, 距离:{distance_to_object:.2f}, 比例:{scale_factor:.6f}, 投影:{projected_distance:.2f}") + print(f"拖拽更新成功 - 轴:{self.dragGizmoAxis}, 比例:{scale_factor:.6f}, 投影:{projected_distance:.2f}") self._last_drag_debug_time = current_time - newPos = self.gizmoTargetStartPos + movement - light_object = self.gizmoTarget.getPythonTag("rp_light_object") - if light_object: - light_object.pos = newPos - self.gizmoTarget.setPos(newPos) - else: - self.gizmoTarget.setPos(newPos) - self.gizmo.setPos(newPos) - except Exception as e: print(f"更新坐标轴拖拽失败: {str(e)}") import traceback diff --git a/scene/__pycache__/scene_manager.cpython-312.pyc b/scene/__pycache__/scene_manager.cpython-312.pyc index 4bded0812979b6ec19ec33d8a4b74d37ba8d8c16..17a23d1f283bc401c4dda73694b6e2b7fb93d8b0 100644 GIT binary patch delta 22 ccmbQz&pf4{nfo*^FBbz4)X$l>k-PIa083*B3;+NC delta 22 ccmbQz&pf4{nfo*^FBbz42+W$hk-PIa07yv&ng9R* diff --git a/ui/__pycache__/interface_manager.cpython-312.pyc b/ui/__pycache__/interface_manager.cpython-312.pyc index 7bd170e24c231f2898d5488852f552f8e4d313ee..d09cfa6e952279ba756ffc99ee982bbfed6e5658 100644 GIT binary patch delta 20 acmcbWd@GszG%qg~0}zxinYWSqydeNfs|M-- delta 20 acmcbWd@GszG%qg~0}u$zn!AzvydeNcnFe?O diff --git a/ui/__pycache__/main_window.cpython-312.pyc b/ui/__pycache__/main_window.cpython-312.pyc index 022d69214d486054aaab2f57a932462dee2a340f..392e3cbaf48b208a3df031f4be8551fe8e075d37 100644 GIT binary patch delta 1605 zcmaJ>YfKzf6rQ_pC=22)yJevWND9lNKno3tVtEN|X<-{EmQ4V+>;MbfUA!|;mWM!u z1OkCJr!@p(TZHxxNt0$0qrZHmYNJIKNHC+(#7C-s#UJ{^>OC{iRi zagSFg!P5|@=`4fM+=IGFuCoH}6ec36gvBHayyZ%lHXG)ME@X4srPXuqM8Q{0=13h2 zWnuTWA3ki(CzBBN+n^@e0!HZNJxsHy5Wr>2JDi&F<@+V($7M;Mp)wf0cT2gDO1 ze*seX(!41qQgAZU?<3s1_3yjib8i(lhKn25+|65VU)b&2a`%MYJsa+eYoY#);sF@q zpC>u6$S+&0J{F{o_w%iyFBmBA@C4eSz3mtBvvj82pmCVE2=i>rWXzT+J8a6{G8KeP z1sjC}o2Egj-`Aiau@LUcA{O|w>j0UP68xnavMe%Nw6@KNmAjHq2uHyDdzP8?Qki^C_^YmC_$(| zc$q8Z2=gcv zQZvH!@jPOb*2Y&gq!g}Cq{6j{1o&p6(eZTsP&*m_!aoH+p*N0Y=ubH9@daM-1-!wF zhk}7qL62AMSf$U;@0XS)voYJ+)M0~C*|T7pPC1GRWv!nNs8!peUmXuQT2MRR;%6~g z%U#eiT|hFVE7Nxgi3j)0bLkjocbb$jFbJYY>=6VlE9axK+Tg}a3dxr~nn@F5Lh_Q-f4NF)OlK=Kv;;o8Qoh@f*sJx!ndqp@LKd>e zy}5_oJkHkS2#wxUd# zwio}UkrRw?dm)cBOW!R->8-KMK{j@H1dk|EwR8da>qe0kBk$B-*7LpWH^%y1y?BHS zO2doIq{@Pkl}{`mMJr|e0GSmHcah;V(od1ukl7JF#@8g&j_=cU=D zGGdEnUb0pQ39`;Z+k0smx_RNjaz delta 1535 zcmaJ>TTEPK5Z>79%{@L_D+TkOf*5R{T$4$MDqNgYec3@3?q03Jw zdV;QZ!0-TP_ve^FPwA0!9cA?Lv`BYbZipkA%Ap$w5{wYHI6Z(M~4IEh}*h_51|C^2bAVbBW!QoR-KK&sa<fSCE?pGC7ETWo2j!Mr*#9bc1>iBRT#aIm;B-2F?s`6n~gD|Vb&*D|!#k=ux z_<|P>d909&zL8zv#$zKJp%|}>1mJuA=SZz(bO+UFAhVN&O9IxK`zZ-5NygnhLBPPbG!OrK# zzBJ?PctP@yuT1_halylUm>AE;8{<#r-~S%yo5-ubm-s5)S)$WW!97CQ9g~8_=9)?)W2ieZrl%blkI*8fun^95tr5<{pMzv~HAW;mEjbBZc!ZyA%SqyGNcC>=k zm1^|?V(rN-u$}jwY_>Qa5|K7Bun%AJuWSZRb&i%3P}f8SdH?L_8kKAoF)djNF3-bI ziELZ89plW@P&&+g|wXIX*hG6E>s@lx9)lie{Bq&mb!$ zSQjq7x!pD@j;1j0Qm6eel^RCn(gKWP;Bq0ngx#0-