fix: 贴合地面:恢复git版本旋转逻辑 + 底边贴地高度修正

This commit is contained in:
tian 2026-06-09 10:06:12 +08:00
parent 034acb1d65
commit 999fffcaa7
2 changed files with 20 additions and 2 deletions

4
build-and-deploy.bat Normal file
View File

@ -0,0 +1,4 @@
@echo off
call "%~dp0compile.bat"
if %ERRORLEVEL% NEQ 0 exit /b 1
call "%~dp0deploy-plugin.bat"

View File

@ -2265,8 +2265,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
if (d > 0.9999f) overrideQ = Quaternion.Identity;
else if (d < -0.9999f) overrideQ = Quaternion.CreateFromAxisAngle(Vector3.UnitX, (float)Math.PI);
else overrideQ = Quaternion.CreateFromAxisAngle(Vector3.Normalize(Vector3.Cross(cadWorldN, t)), (float)Math.Acos(d));
// 直接施压 OverridePermanentTransform不走 ApplyRotationCorrectionInPlace
// 旋转git 版本逻辑,已验证正确)
var center = item.BoundingBox().Center;
var tp = new Vector3((float)center.X, (float)center.Y, (float)center.Z);
var rtp = Vector3.Transform(tp, overrideQ);
@ -2275,6 +2274,21 @@ namespace NavisworksTransport.UI.WPF.ViewModels
id.Translation = new Vector3D(center.X - rtp.X, center.Y - rtp.Y, center.Z - rtp.Z);
doc.Models.OverridePermanentTransform(modelItems, id.Combine(), true);
// 旋转后再平移:旋转后边界盒最低点贴地
var hst = CoordinateSystemManager.Instance.ResolvedType;
var newBounds = item.BoundingBox();
var newCenter = newBounds.Center;
var ps = CurrentPathRoute?.Points?[0];
double objectBottom = hst == CoordinateSystemType.YUp ? newBounds.Min.Y : newBounds.Min.Z;
double groundLevel = hst == CoordinateSystemType.YUp ? ps.Y : ps.Z;
var delta = new Vector3D(
ps.X - newCenter.X,
hst == CoordinateSystemType.YUp ? groundLevel - objectBottom : ps.Y - newCenter.Y,
hst == CoordinateSystemType.YUp ? ps.Z - newCenter.Z : groundLevel - objectBottom);
doc.Models.OverridePermanentTransform(modelItems, Transform3D.CreateTranslation(delta), false);
resultCorrection = ObjectPassageProjectionOptimizer.CanonicalQuaternionToHostEulerCorrection(overrideQ);
LogManager.Info($"[贴合地面] raw=({_pendingAlignToGroundNormal.X:F4},{_pendingAlignToGroundNormal.Y:F4},{_pendingAlignToGroundNormal.Z:F4}) cadWorldN=({cadWorldN.X:F4},{cadWorldN.Y:F4},{cadWorldN.Z:F4}) t=({t.X:F4},{t.Y:F4},{t.Z:F4}) overrideQ=({overrideQ.X:F4},{overrideQ.Y:F4},{overrideQ.Z:F4},{overrideQ.W:F4})");
}
_pathAnimationManager?.SetObjectRotationCorrectionDirect(resultCorrection);