three.js mousedown не работает, когда включены элементы управления трекболом

Трекбол хорошо работает в моей программе three.js вместе с прослушивателями событий onMouseClick и onMouseUp. Я включаю трекбол с помощью строки: -

controls = new THREE.TrackballControls( scene01camera02 , DOM_container);

Но прослушиватель событий onMouseDown не работает.

Если я отключу трекбол (закомментировав строку кода, показанную выше) и отключу любой другой связанный код, тогда onMouseDown будет работать нормально.

Есть ли способ одновременно использовать управление onMouseDown и Trackball?

Причина в том, что когда происходит событие mousedown, я могу определить, где на экране оно произошло, а затем переключить переменную управления, чтобы трекбол контролировал соответствующий scene_camera_container.

    In HTML
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <div id="ThreeJScontainer" style="position: absolute; left:0px; top:0px"></div>

    In F_Init()
    renderer = new THREE.WebGLRenderer( {antialias:true} );
    DOM_container = document.getElementById( 'ThreeJScontainer' );
    DOM_container.appendChild( renderer.domElement );

    renderer.setSize( window.innerWidth, window.innerHeight );

    controls = new THREE.TrackballControls( scene01camera02 , DOM_container);

    document.addEventListener( 'mousemove', onDocumentMouseMove, false );  //works OK
    document.addEventListener( 'mousedown', onDocumentMouseDown, false );
    document.addEventListener('click', SOW_onDocumentMouseClick, false);  //works OK

    //in SOW_onDocumentMouseClick event handler 
    // I reset the controls to point to a new scene_camera according to the viewport clicked on. 
    //Example:-
    controls = new THREE.TrackballControls( scene01camera01 , DOM_container);

    //if onDocumentMouseDown was working as I expected I would do the resetting in there 

    In F_Update()
    controls.update();

    In F_Render()
    renderer.setViewport( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
    renderer.clear();   

    //...BOTTOM STRIP (DASHBOARD)
    renderer.setViewport( bottomPanelXmin, bottomPanelYmin, bottomPanelWidth, bottomPanelHeight );  
    renderer.render( scene02, scene02camera04 );
    // etc 
    // etc for other "Panels" (my name for viewports)

Пример прототипа, работающего по адресу: - http://www.zen226082.zen.co.uk/TRI_VP.html (лучше всего в Chrome или Opera, проблемы с выравниванием в Firefox).


person steveOw    schedule 15.09.2013    source источник
comment
У меня есть пакет кода, в котором трекбол (который меняет представления) и onMouseDown работают одновременно. Я подозреваю, что может быть больше, можете ли вы показать нам свои объявления прослушивателя событий, возможно, где этот DOM_container инициализируется. Как правило, больше кода, чтобы попытаться понять это?   -  person Darryl_Lehmann    schedule 16.09.2013
comment
Возможно, это как-то связано с отменой события TrackballControls до того, как ваш обработчик получит управление. К какому элементу вы привязываетесь и делаете ли вы это до или после создания экземпляра TrackballControls?   -  person IceCreamYou    schedule 16.09.2013
comment
Для справки, в моем рабочем сценарии сначала устанавливается TrackballControls, затем addEventListener( 'mousedown', ...) захватывается в том же контейнере, что и мой контекст webgl. Надеюсь это поможет   -  person Darryl_Lehmann    schedule 16.09.2013
comment
Спасибо обоим. Я добавил выдержки из кода в вопрос. Также я обнаружил, что onmousedown получает событие, когда я нажимаю на любую полосу прокрутки.   -  person steveOw    schedule 17.09.2013
comment
Хорошо, поэтому я установил прослушиватели событий на объект DOM_container вместо документа, и теперь mousedown обнаруживается нормально. Здорово. Спасибо. Но теперь возникла новая проблема, связанная с обеспечением надежной работы трекбола.   -  person steveOw    schedule 17.09.2013
comment
Под ненадежным вы подразумеваете, что он дергается и обычно ведет себя странно после смены камеры, как будто мышь заблокирована на нем? Если это так, вы можете попробовать сбросить трекбол перед заменой его с помощью controls.reset();, это может быть нежелательно, так как ориентация будет сброшена в начальные положения. Если это так, вы можете попробовать установить controls.target0, controls.position0 и controls.up0 перед выполнением controls.reset()   -  person Darryl_Lehmann    schedule 18.09.2013
comment
Спасибо. Я должен был сказать непредсказуемый.   -  person steveOw    schedule 21.09.2013
comment
У меня есть три камеры, отправляющие в три окна просмотра, выровненные последовательно слева, посередине, справа на одном рендерере (привязанном к одному dom_container). Теперь я могу переключать область просмотра/камеру, которой управляет трекбол, по нажатию мыши и фильтровать в соответствии с сохраненными координатами области просмотра. Но теперь я обнаружил, что входные данные трекбола измеряются относительно центра dom_container. Я не знаю, как повторно центрировать функцию трекбола относительно центра соответствующего окна просмотра. Я не уверен, что должны делать control.target0,controls.position0 иcontrols.up0.   -  person steveOw    schedule 21.09.2013


Ответы (3)


я знаю, что это старо, но на этот ответ еще нет ответа, но недавно я столкнулся с той же проблемой.

убедитесь, что ваш container.append(renderer.domElement); выполняется до инициализации THREE.TrackballControls( camera, renderer.domElement );

person user151496    schedule 03.02.2016
comment
Это выдвинуло на первый план причину моей проблемы с происхождением трекбола, не определяющим местонахождение того места, где я этого хотел. Мне нужно было инициализировать TrackballControls для конкретного domElement (а не только для контейнера three.js). Большое спасибо. - person steveOw; 19.06.2020

Я обнаружил, что модуль управления трекболом предполагает выполнение цикла анимации, но в моем случае это не так. Мне нужно было изменить код для вызова _this.update(); по мере обработки событий (практически всякий раз, когда он вызывает _this.dispatchEvent, например, в конце mousewheel и других функций обработки событий.

person Karl Rosaen    schedule 06.07.2017

Всем, у кого есть эта проблема: просто отредактируйте TrackballControls.js и удалите строку event.stopPropagation(); в

function mousedown( event ) {

функция. Таким образом, все последующие прослушиватели событий mousedown остаются активными.

person Christian Lehmann    schedule 04.06.2020