MapConductor React SDK Samples

Three.js ऑब्जेक्ट (केवल वेब) | MapLibre | MapConductor React SDK

MapLibre पर MapConductor React SDK का Three.js ऑब्जेक्ट (केवल वेब) सैंपल।

यह इंटरैक्टिव उदाहरण MapLibre पर MapConductor की एब्स्ट्रैक्शन के ज़रिए Three.js ऑब्जेक्ट (केवल वेब) दिखाता है।

कोड उदाहरण

import { useEffect, useMemo } from 'react';
import * as THREE from 'three';
import { createGeoPoint, createMapCameraPosition } from '@mapconductor/js-sdk-core';
import { useMapLoaded } from '@mapconductor/js-sdk-react';
import { MapLibreDesign, MapLibreMapView2D, useMapLibreViewState } from '@mapconductor/react-for-maplibre';


// (1) मैप बनाएँ


const initialCamera = createMapCameraPosition({
  position: createGeoPoint({ latitude: 35.6812, longitude: 139.7671 }),
  zoom: 12,
});


const mapViewState = useMapLibreViewState({
  mapDesignType: MapLibreDesign.OsmBrightJa,
  cameraPosition: initialCamera,
});


// (2) डेटा और इंटरैक्शन स्टेट तैयार करें
const position = useMemo(() => createGeoPoint({
  latitude: 35.6812,
  longitude: 139.7671,
}), []);


// (3) मैप और उसके ओवरले रेंडर करें


function ThreeMapObject({ mapViewState, position }) {
  const isMapLoaded = useMapLoaded();


  useEffect(() => {
    if (!isMapLoaded) return;
    const holder = mapViewState.getMapViewHolder();
    if (!holder) return;


    const scene = new THREE.Scene();
    const camera = new THREE.OrthographicCamera(0, 1, 1, 0, 0.1, 1000);
    camera.position.z = 200;
    const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
    const width = holder.mapView.clientWidth;
    const height = holder.mapView.clientHeight;
    renderer.setSize(width, height);
    camera.right = width;
    camera.top = height;
    camera.updateProjectionMatrix();
    renderer.domElement.style.position = 'absolute';
    renderer.domElement.style.inset = '0';
    holder.mapView.appendChild(renderer.domElement);


    const object = new THREE.Mesh(
      new THREE.TorusKnotGeometry(13, 4),
      new THREE.MeshNormalMaterial(),
    );
    scene.add(object);


    let frame = 0;
    const draw = () => {
      const offset = holder.toScreenOffset(position);
      if (offset && !(offset instanceof Promise)) {
        object.position.set(offset.x, height - offset.y, 0);
      }
      object.rotation.y += 0.02;
      renderer.render(scene, camera);
      frame = requestAnimationFrame(draw);
    };
    draw();


    return () => {
      cancelAnimationFrame(frame);
      renderer.domElement.remove();
      renderer.dispose();
    };
  }, [isMapLoaded, mapViewState, position]);


  return null;
}


<MapLibreMapView2D state={mapViewState}>
  <ThreeMapObject mapViewState={mapViewState} position={position} />
</MapLibreMapView2D>

कोड कैसे काम करता है

मैप के ऊपर एक पारदर्शी Three.js कैनवास रेंडर करें, और उसके 3D ऑब्जेक्ट को प्रोवाइडर-निरपेक्ष MapViewHolder.toScreenOffset() प्रोजेक्शन से बाँधें।

useMapLoaded इफ़ेक्ट को तब तक रोके रखता है जब तक मैप मौजूद न हो; फिर getMapViewHolder() एक होल्डर देता है, जिसका WebGL कैनवास मैप के ऊपर जोड़ दिया जाता है।

हर फ़्रेम पर holder.toScreenOffset(position) भौगोलिक निर्देशांक को पिक्सेल ऑफ़सेट में बदलता है, इसलिए मैप हिलने पर भी 3D ऑब्जेक्ट अपनी जगह टिका रहता है — वही कॉल हर प्रोवाइडर पर।