Azure-Samples / Azure-Samples/AzureMapsCodeSamples

Blazor 3D Integration

オープン
#163 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
JavaScript
スター
373
フォーク
468
PR マージ指標
30日以内にマージされた PR はありません

説明

Hi , I am trying to load a 3d model to azure maps in Blazor .net9 webassembly , I can load the maps ok , but I cannot get to load the 3 model, I am following this example https://github.com/Azure-Samples/AzureMapsCodeSamples/blob/main/Samples/3D-layer/three.js/three.js.html , but i am having problem converting the html code to blazer , I have created a map.js script that load the map fine but I dont how to create the render and add the layer to the map.

is there a blazor example available or can someone explain to me how to write a new script , sorry I am c# developer but never used JS before .

this the current script but i have an error on the loader: new GLTFLoader(), ReferenceError: GLTFLoader is not defined

```
//script map.js
var map, layer;

// 3D model to render
var modelDetails = {
url: "/3d-layer/three.js/parrot.glb",
origin: [-122.128929, 47.644042],
mercatorOrigin: atlas.data.MercatorPoint.fromPosition([-122.128929, 47.644042]),
rotateX: Math.PI / 2,
rotateY: 0,
rotateZ: 0,
scale: 1e-7,
animate: true
};

// Create a renderer that implements atlas.WebGLRenderer
var renderer = {
renderingMode: "3d",
loader: new GLTFLoader(),
modelDetails: modelDetails,

// Method called when the layer is added to the map
onAdd: function (map, gl) {
this.map = map;
this.camera = new THREE.Camera();
this.scene = new THREE.Scene();
this.clock = new THREE.Clock();

// Create lights to illuminate the model
var directionalLight = new THREE.DirectionalLight(0xffffff);
directionalLight.position.set(0, 70, 100).normalize();
this.scene.add(directionalLight);

var ambientLight = new THREE.AmbientLight(0x808080);
this.scene.add(ambientLight);

// Load the model
this.loadModel();

// Use the Azure Maps map canvas for three.js
this.renderer = new THREE.WebGLRenderer({
canvas: map.getCanvas(),
context: gl
});

this.renderer.autoClear = false;
},

// Method called on each animation frame
render: function (gl, matrix) {
var md = this.modelDetails;

if (md) {
var rotationX = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(1, 0, 0), md.rotateX);
var rotationY = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0, 1, 0), md.rotateY);
var rotationZ = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0, 0, 1), md.rotateZ);

var m = new THREE.Matrix4().fromArray(matrix);
var l = new THREE.Matrix4()
.makeTranslation(md.mercatorOrigin[0], md.mercatorOrigin[1], md.mercatorOrigin[2])
.scale(new THREE.Vector3(md.scale, -md.scale, md.scale))
.multiply(rotationX)
.multiply(rotationY)
.multiply(rotationZ);

this.camera.projectionMatrix.elements = matrix;
this.camera.projectionMatrix = m.multiply(l);
this.renderer.resetState();
this.renderer.render(this.scene, this.camera);
this.renderer.resetState();
}

map.triggerRepaint();
},

loadModel: function () {
var md = this.modelDetails;
this.mixer = null;

if (md) {
// Use the three.js GLTF loader to add the 3D model to the three.js scene
this.loader.load(
md.url,
function (gltf) {
this.gltfModelScene = gltf.scene;

this.scene.add(gltf.scene);

if (md.animate) {
this.mixer = new THREE.AnimationMixer(gltf.scene);
var action = this.mixer.clipAction(gltf.animations[0]);
action.play();

this.animate();
}
}.bind(this)
);

this.map.setCamera({
center: md.origin
});
}
},

animate: function () {
if (this.mixer) {
this.mixer.update(this.clock.getDelta());
this.renderer.render(this.scene, this.camera);
requestAnimationFrame(() => {
this.animate();
});
}
}
};

window.AzureMap = {
map: null,
layer: null,
LoadMap: function (subKey, lat, long) {

this.map = new atlas.Map("mapContainer", {
authOptions: {
authType: 'subscriptionKey',
subscriptionKey: subKey
},
view: "Auto",
center: [long, lat],
zoom: 17.5

});

map.events.add("ready", function () {
// Create a WebGL layer
layer = new atlas.layer.WebGLLayer("3d-model", { renderer });
// Add the layer to the map
map.layers.add(layer);

// Add controls
map.controls.add(
[
new atlas.control.ZoomControl(),
new atlas.control.PitchControl(),
new atlas.control.CompassControl(),
new atlas.control.StyleControl({
mapStyles: "all"
})
],
{
position: "top-right"
}
);
});
}
}
```

thanks for your help.

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。