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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions