有没有办法解决这个问题?
简短的回答是“是的,但它没有使用标准版本的 OrbitControls.js”。
请继续阅读我的详细推理......
我刚刚花了一些时间查看OrbitControls.js
(r87) 的源代码,考虑实施一种增强功能的想法,该功能允许您提供一个可选的第二点,它将用作相机目标。
然而,在探索了代码之后,我认为添加到标准公共版本中将是一个不好的功能。OrbitControls 有许多功能,例如限制视角的能力、最小和最大旋转以及假设相机和轨道中心相同的小车距离。如果有一个选项 2nd camera tagret 这些都需要修改为使用轨道中心或相机目标,或者有一个可配置的参数来切换它使用哪一个。这将增加数百行额外的代码,使其更难理解,而且都是为了一个非常小众的功能。
所以......解决方案:
因为您正在构建一个技术工具,我怀疑您不关心有限的视角、距离或旋转,所以如果我是您,我会复制OrbitControls.js
到您的项目中,将其重命名OrbitControls_customised.js
并进行您需要的更改:
在下面添加 2 个新参数,this.target
称为this.cameraTarget
和this.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 设置为以使其正常运行的事件。false
controls.target
onMouseUp
controls.target
controls.cameraTarget
我希望这能回答您的问题,并为您提供一些粗略的工作路线图。