Есть ли способ обойти это?
Короткий ответ: «Да, но он не использует стандартную версию OrbitControls.js».
читать для моего подробного рассуждения ....
Я только что провел некоторое время, глядя на исходный код OrbitControls.js
(R87) рассматривает идею внедрения аксессуара, который позволит вам обеспечить дополнительный 2-й пункт, который он будет использовать в качестве цели камеры.
Однако, после изучения кода, я думаю, что это будет плохая функция для добавления к стандартной общедоступной версии. Есть много особенностей OrbitControls, таких как способность ограничивать угол обзора, минимальное и максимальное вращение и расстояние между долями, которые предполагают, что камера и центр орбиты одинаковы. Если бы был вариант 2-й камеры, это все нужно было бы изменить, чтобы использовать либо центр орбиты, либо цель камеры, либо иметь настраиваемый параметр, который переключает ту, которую он использует. Это добавит сотни лишних строк кода, что усложнит понимание, и все это будет иметь очень нишу.
Итак ... Решение:
Поскольку вы строите технический инструмент, я подозреваю, что вы не заботитесь о ограниченный угол обзора, расстояния или вращения, так что если бы я тебя, я бы скопировать 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
в false
и устанавливает controls.target
на пересекающуюся/пересекающую точку raycast. Затем событие onMouseUp
, которое устанавливает controls.target
назад на controls.cameraTarget
, чтобы позволить ему вести себя как обычно.
Надеюсь, что это ответит на ваш вопрос и даст вам приблизительную дорожную карту для работы.
Вы решили это? :) –
Нет, у меня нет –
Думаю, я могу решить это для вас, если вы все еще заинтересованы, но я просто хочу понять ваш предполагаемый результат. Если пользователь нажимает на сторону здания, вы хотите, чтобы центральная точка элементов управления стала ближайшей точкой на сетке, которая была нажата? Или центральной точкой сетки здания, которое было нажато? Кто это, или я неправильно понял? –