2

使用thingiview.js、Three.js 和trackballControls,我建立了一个系统,我可以在其中上传一个STL 文件,然后在画布上渲染它。trackballControls 通过一些调整非常棒,但我遇到了一个问题:

我想放大鼠标光标的点而不是网格/平面的中心。

我已经完成了一个简单的 captureEvent 来获取鼠标的屏幕坐标并对其进行跟踪,但是我在确定在何处使用控制方案来执行此操作时遇到了问题。

我检查了 _zoomStart / _zoomEnd 的东西(这让我有点困惑,因为它离开了“y”,我认为它会是“z”)。但是当尝试添加 _zoomStart.x 时,它基本上会忽略它。

现在我可能不是大师,但我通常很舒服。

我还想确保当我平移时,缩放和旋转仍然基于对象的中心,而不是网格/平面的中心。

已经通过帖子和示例搜索了几天,但没有真正找到任何答案。

我确定我没有在正确的地方/朝着正确的方向寻找。在正确的方向上进行有用的轻推(或者更好的是快速踢)将真正受到赞赏。

编辑

this.zoomCamera = function () {

        var factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed;

        if ( factor !== 1.0 && factor > 0.0 ) {

            _eye.multiplyScalar( factor );

            if ( _this.staticMoving ) {

                _zoomStart.copy( _zoomEnd );

            } else {

                _zoomStart.y += ( _zoomEnd.y - _zoomStart.y ) * this.dynamicDampingFactor;

            }

        }

    };

我假设以上是我要进行缩放更改的地方。我不明白的是它被设置为_zoomStart.y。但是照原样,我将如何实现x?

我的意思是,如果 _zoomStart 和 _zoomEnd 是 Vector2,那么它在上面的代码中哪里定义了 x?

困惑

4

2 回答 2

1

放大 Trackballcontrols 实际上并不是在缩放(这将设置相机 fov)。两个对象只是在控件中移动......,另一个是相机(this.object),另一个是它正在查看的点(this.target)。我没有玩太多轨迹球控件,但我会冒险猜测它根本不会触及目标(因此所有移动和缩放都将围绕它进行)。

您可以尝试在 onclick 更改目标,例如:

mycontrols.target = new THREE.Vector3(newx, newy, newz);

您可能需要更新/重置一些其他 Trackballcontrols 内部变量,但它也可能像那样工作。

为了从 2D x/y 鼠标坐标中获取 3D x/y/z 坐标,我建议搜索光线投射或对象拾取,应该找到很多示例。

于 2013-01-22T16:54:48.080 回答
0

诀窍是_zoomStart_zoomEnd是为触摸缩放而创建的,当您使用鼠标滚轮进行缩放时,您只需传递一个变量来表示:“要缩放多少”。程序员没有为其创建新变量,而是使用了_zoom###.y组件。

因此_zoomStart_zoomEnd不提供有关如何执行缩放的信息,这些变量仅包含“指令”。然后软件将其转换为“ zoompan ”矢量,以 3D 形式表示相机所需的运动。

于 2015-10-26T13:46:00.537 回答