Skip to content

OrbitControls touch crashes on Expo mobile app #426

@williamdsw

Description

@williamdsw
  • three version: ^0.166.1
  • @types/three version: 0.183.1
  • three-stdlib version: ^2.35.6

Problem description:

As previously reported by @damistheanswer in the issue mrdoob/three.js#32116, OrbitControls does crash a mobile app on touch devices, such tablets and iPads, when using multi-touches to zoom in/zoom out an object.
I got the same message such as:

TypeError: Cannot read properties of undefined (reading 'x')

Reproduction steps

  1. Download the sample project or the apk file
  2. Start a two-finger pinch gesture (pinch-to-zoom)
  3. Lift one finger mid-gesture while the other finger remains touching
  4. The error occurs sporadically when the second pointer position becomes undefined

Relevant code:

Same as the issue #32116

In OrbitControls.js, the _getSecondPointerPosition() method returns undefined when a pointer is no longer tracked:

// Line ~1407-1411
_getSecondPointerPosition( event ) {
    const pointerId = ( event.pointerId === this._pointers[ 0 ] ) ? this._pointers[ 1 ] : this._pointers[ 0 ];
    return this._pointerPositions[ pointerId ]; // Can return undefined!
}

This undefined value is then used without null checking in multiple places:

// Line ~1234-1238 (handleTouchMoveDolly)
const position = this._getSecondPointerPosition( event );
const dx = event.pageX - position.x; // ❌ Crash: position is undefined
const dy = event.pageY - position.y;

Similar crashes occur at:

  • Line 1202-1204 (handleTouchStartRotate)
  • Line 1221-1223 (handleTouchStartPan)
  • Line 1269-1271 (handleTouchMoveRotate)
  • Line 1298-1300 (handleTouchMovePan)
  • Line 1317-1320 (handleTouchMoveDolly)

Live example

Same as the issue #32116:

  1. User starts two-finger gesture → both pointers tracked in _pointers array
  2. User lifts one finger → pointer is removed from _pointers
  3. Move event fires for remaining finger → tries to get second pointer position
  4. _pointerPositions[pointerId] returns undefined because pointer was removed
  5. Code attempts position.x → crash

Screenshots

Attached error on expo app:

Image

Please check this video for demonstration of the bug:

Device

Mobile

OS

Android

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions