5

我正在尝试制作用于构建模型的 3D 查看器。我们已经加载了模型,并试图与模型进行某种交互。因此,我们使用 OrbiControls 来旋转、平移和缩放模型。

我们希望在查看器中具有这样的行为:当用户单击并拖动(因此旋转)时,旋转中心位于用户单击的建筑物的点。

我认为通过这样更改 OrbitControl 的目标是明智的:

control.target.set(newX, newY, newZ);

但是,我在 OrbitControl.js 文件的源代码中发现,当控件更新时,

camera.lookAt() 

函数被调用,这导致相机跳到一个新的位置。

有没有办法解决这个问题?我已经尝试了几个小时,但似乎没有任何效果。

尝试更改 target0,然后在控件上调用 reset()。还尝试将相机改回旧位置(这可能是它的完成方式,但我可能尝试得很糟糕。

4

3 回答 3

3

有没有办法解决这个问题?

简短的回答是“是的,但它没有使用标准版本的 OrbitControls.js”。

请继续阅读我的详细推理......

我刚刚花了一些时间查看OrbitControls.js(r87) 的源代码,考虑实施一种增强功能的想法,该功能允许您提供一个可选的第二点,它将用作相机目标。

然而,在探索了代码之后,我认为添加到标准公共版本中将是一个不好的功能。OrbitControls 有许多功能,例如限制视角的能力、最小和最大旋转以及假设相机和轨道中心相同的小车距离。如果有一个选项 2nd camera tagret 这些都需要修改为使用轨道中心或相机目标,或者有一个可配置的参数来切换它使用哪一个。这将增加数百行额外的代码,使其更难理解,而且都是为了一个非常小众的功能。

所以......解决方案

因为您正在构建一个技术工具,我怀疑您不关心有限的视角、距离或旋转,所以如果我是您,我会复制OrbitControls.js到您的项目中,将其重命名OrbitControls_customised.js并进行您需要的更改:

在下面添加 2 个新参数,this.target称为this.cameraTargetthis.coupleCenters

// "target" sets the location of focus, where the object orbits around
this.target = new THREE.Vector3();

// "cameraTarget" is where the camera is looking (by default the same as target
this.cameraTarget = new THREE.Vector3();

// Whether the camera should be locked to the orbit center
this.coupleCenters = true;

在它指示相机看向中心的线上...

scope.object.lookAt( scope.target );

...更改它,使其仅在 CoupleCenters 为真时更新相机...

if( scope.coupleCenters ){
    scope.cameraTarget = scope.target;
}
scope.object.lookAt( scope.cameraTarget );

现在,进行这些更改后,您可以放置​​一个onMouseDown事件,该事件使用RayCasting来查找对象上的点,设置并设置controls.decoupleCenters为光线投射的相交/交叉点。然后是一个将back 设置为以使其正常运行的事件。falsecontrols.targetonMouseUpcontrols.targetcontrols.cameraTarget

我希望这能回答您的问题,并为您提供一些粗略的工作路线图。

于 2017-09-20T09:54:14.250 回答
0

尝试这个:

首先将控件的位置设置为:

control.center.set(0, 0, 0);

然后这样做:

camera.position.copy(control.center).add(new THREE.Vector3(x, y, z+10));

其中 x、y 和 z 是您的建筑模型的位置。

请注意,我已将 +10 添加到 z,以便相机位于模型前面。将 +10 更改为其他值以更接近/远离模型。

于 2016-02-26T21:13:12.753 回答
0

以下是此codepen中实现的 Martin Joiner 的解决方案(谢谢!!!) :

从此更改第 45 行:

controls.coupleCenters = false;

对此:

controls.coupleCenters = true;

然后按任意键(或单击鼠标左键)查看 Wouter Coebergh 描述的原始行为,然后将 Martin 推荐的逻辑添加到自定义轨道控制。

于 2018-05-31T19:15:50.200 回答