WPF 3D 到 2D 投影出现错误?

问题描述 投票:0回答:1

有一种情况,PerspectiveCamera 的 LookDirection 矢量上的点没有投影到 Viewport3D 的中心。有什么想法为什么吗?

以下是案例的详细信息:Viewport3D 为 778, 405。相机直接看到的任何可见 Point3D 都会投影到 (389, 202.5)。透视相机位于 (1379.4, -577.7, 0.7)。

在第一种情况下,白色球体的中心为 (13,080.3,-6,491.9,-407.9),距相机 13,117 个单位。相机的 LookDirection 为 (0.89, -0.45, -0.03)。白色球体投影到 Viewport3D 的视觉中心。正如预期的那样,MathUtils.TryWorldToViewportTransform 将球体的中心点投影报告为 (389, 202.5)。添加黑线以显示 Viewport3D 的中心。

第一个案例屏幕截图:https://photos.app.goo.gl/Cc8ch2uYWUjWgoSV6

在第二种情况下,蓝色球体的中心为 (1,383.0,-579.6, 0.3),距相机 4.1 个单位。相机的 LookDirection 为 (0.88,-0.46,-0.11)。蓝色球体不会投影到 Viewport3D 的视觉中心。 MathUtils.TryWorldToViewportTransform 报告投影到 (389, 202.5) 的中心点,如预期。从视觉上看,虽然蓝色球体没有绘制在中心,但它更像是 (295, 303)。

第二个案例屏幕截图:https://photos.app.goo.gl/1RfZh6uvjfEinaiA7

将相机放置在距白色球体 4.1 距离的位置,它会正确投影到 Viewport3D 的中心。不同之处在于,白色球体比蓝色球体距离 (0, 0, 0) 原点更远。

如果相机距离它“很远”(例如靠近白色球体),蓝色球体将更正确地投影到 Viewport3D 的中心。

蓝色球体在数学上被定位在 Viewport3D 的中心。关于为什么在上面的第二种情况下蓝色球体没有在 Viewport3D 的中心渲染有什么想法吗?

谢谢!

c# wpf 3d projection
1个回答
0
投票

如果我手动计算相机方向,我会得到以下值:

Blue sphere:   1383.0,    -579.6,      0.3
Camera:        1379.4,    -577.7,      0.7
Difference:       3.6,      -1.9,      0.4
Normalized:  0.880146, -0.464521, 0.097794

这与您的视线方向非常接近 (0.88,-0.46,-0.11),但不一样。这不是舍入误差,因为 Z 方向超出了两位数。根据您发布的值,蓝色球体在数学上不是位于 Viewport3D 的中心。

您说使用

MathUtils.TryWorldToViewportTransform
手动计算位置可以得到预期的结果。这部分让我很困惑。我能想到的唯一解释可能是您发布的 LookDirection (和相应的转换矩阵)是过时的值,并且
MathUtils
库会根据需要重新计算所有内容,以便获得正确的值。

© www.soinside.com 2019 - 2024. All rights reserved.