three-globe icon indicating copy to clipboard operation
three-globe copied to clipboard

Suggestion - Method(s) to get ThreeJS object references

Open nobu-sh opened this issue 2 years ago • 2 comments

It would be really helpful if there were getters on the constructed globe instance to get ThreeJS object references that were rendered by this lib.

It would enable higher customization; as you could get a certain set of objects rendered by this lib and pass it to something like three's raycaster to query intersecting objects.

Example Usage:

// Create Data Point
const gData = [
  {
      lat: 1100,
      lng: 10,
      color: 'red',
      size: 0.1,
  }
]
const colorInterpolator = (t: number) => `rgba(255,0,0,${1-t})`

// Setup camera
const camera = new THREE.PerspectiveCamera();

// Construct Globe & Pass Data Points
const Globe = new ThreeGlobe({
  animateIn: true,
})
  .globeImageUrl(ed)
  .pointsData(gData)
  .pointAltitude('size')
  .pointColor('color')

// Create Raycaster
const raycaster = new THREE.Raycaster()

// Check If Hovering Over A Data Point
function checkHover(vec2) {
  raycaster.setFromCamera(vec2, camera)

  // Globe.points() would be an accessor to all point mesh refs currently rendered
  return raycaster.intersectObjects(Globe.points(), true)
}

const intersections = checkHover(...)

nobu-sh avatar Feb 19 '22 00:02 nobu-sh

@nobu-sh thanks for your suggestion.

There is a way to do this already. Attached to each of your data points is an attribute called __threeObj. This attribute is a reference pointing to the corresponding Three mesh itself that you can use in your raycaster selection.

In fact, this is precisely how the abstraction layer in globe.gl implements the interactive functionality of object hover/clicks.

vasturiano avatar Feb 21 '22 19:02 vasturiano

Ah alright, thanks! Is this purposely not included in the typings? I was looking around for it based off of globe.gl abstraction and got lost haha.

nobu-sh avatar Mar 05 '22 17:03 nobu-sh