有一种情况,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 的中心渲染有什么想法吗?
谢谢!
如果我手动计算相机方向,我会得到以下值:
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
库会根据需要重新计算所有内容,以便获得正确的值。