在 vis.js 中找到 'view' 坐标

Find 'view' co-ordinates in vis.js

我正在对 vis.js 的 Graph3d 进行修改以制作填充线图,如下所示:

困难的部分 - 不出所料 - 是计算多边形的渲染顺序。我想我可以通过检查从观察者到给定线 B 的光线是否穿过线 A:

来做到这一点

在这个例子中,由于A线是B线的"in the way",所以我们应该先画A线。我将使用 How do you detect where two line segments intersect? 中的一段代码来检查线条是否交叉。

但是,我还没有想出如何找到用户视图的位置。我有点假设这将是相机对象,所以写了一些调试代码来在图表上绘制相机:

var camera = this._convert3Dto2D(this.camera.getCameraLocation());
ctx.strokeStyle = Math.random()>0.5 ? 'ff0000' : '00ff00';
ctx.beginPath();
ctx.moveTo(camera.x, camera.y);
ctx.lineTo(camera.x, camera.y+5);
ctx.stroke();

事实上,由此测量的相机坐标始终位于图表上的 0,0,0(这将是上面屏幕截图的最右上角)。我认为我需要的实际上是屏幕底部。

我怎样才能找到这个?或者有更好的方法来实现我想要做的事情吗?

我不知道这是否仍然是一个活跃的问题,但 FWIW,Graph3D 有排序顺序的内部处理。

所有图形点都根据视点进行排序,使用称为 point.bottom 的代表性坐标。然后使用此顺序完成渲染,首先绘制距离最远的元素。只要元素的 none 相交,这就可以正常工作;在这种情况下,您可以期待人工制品。

基本上,您需要做的就是为每个图形多边形定义 point.bottom,然后 Graph3D 将从那里选取它。

如果您仍然对此感兴趣:

这发生在 Graph3d.js 方法 Graph3d.prototype._calcTranslations() 中。例如,查看 GridSurface 图形元素如何在 Graph3d.prototype._getDataPoints() 中初始化。相关代码为:

obj = {};
obj.point = point3d;
obj.trans = undefined;
obj.screen = undefined;
obj.bottom = new Point3d(x, y, this.zRange.min);