Я создал расширение, которое вращает камеру вокруг модели Revit, которая была загружена в созданном ведре, но как мне заставить камеру постоянно вращаться вокруг модели после нажатия кнопки на панели инструментов. Кроме того, как мне снова нажать ту же кнопку, чтобы остановить вращение? Приведенный ниже код - это то, что я использовал для поворота камеры после нажатия кнопки.
var _this = this;
var _viewer = _this.viewer;
var turnTableToolbarButton = new Autodesk.Viewing.UI.Button('turnTableButton');
turnTableToolbarButton.onClick = function (e) {
const nav = _viewer.navigation;
const up = nav.getCameraUpVector();
var pos = nav.getPosition();
const axis = new THREE.Vector3(0, 0, 1);
const speed = 10.0 * Math.PI / 180;
const matrix = new THREE.Matrix4().makeRotationAxis(axis, speed * 0.1);
pos.applyMatrix4(matrix);
up.applyMatrix4(matrix);
nav.setView(pos, new THREE.Vector3(0, 0, 0));
nav.setCameraUpVector(up);
var viewState = _viewer.getState();
_viewer.restoreState(viewState);
};



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, что вам нужно здесь использовать requestAnimation, когда ваша кнопка останавливает или запускает запрос нового кадра:
let started = false;
let rotateCamera = () => {
if (started) {
requestAnimationFrame(rotateCamera);
}
const nav = viewer.navigation;
const up = nav.getCameraUpVector();
const axis = new THREE.Vector3(0, 0, 1);
const speed = 10.0 * Math.PI / 180;
const matrix = new THREE.Matrix4().makeRotationAxis(axis, speed * 0.1);
let pos = nav.getPosition();
pos.applyMatrix4(matrix);
up.applyMatrix4(matrix);
nav.setView(pos, new THREE.Vector3(0, 0, 0));
nav.setCameraUpVector(up);
var viewState = viewer.getState();
// viewer.restoreState(viewState);
};
turnTableToolbarButton.onClick = function (e) {
started = !started;
if (started) rotateCamera()
};
Проверьте мое репо расширений, чтобы увидеть полный код на основе вашего фрагмента и живой иллюстрации.
Спасибо, я использовал приведенный выше код, и теперь модель отлично вращается.
Я оставил ваш подход как есть, чтобы показать, что он работает, но, боюсь, он требует некоторой оптимизации. Я проведу некоторые исследования и обновлю свое репо позже, выбрав более оптимальный подход к тому, что вы делаете.