コンテンツにスキップ

Update model material

Experimental Feature

Update model material at runtime.

set_material_property.html
<!DOCTYPE html>
<!--   
    Model Information:
    * title:    Beach Ball
    * source:   https://sketchfab.com/3d-models/beach-ball-25e1816c0e22444bb62816d3999d1b0b
    * author:   MaggaModels (https://sketchfab.com/MaggaModels)

    Model License:
    * license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
    * requirements: Author must be credited. Commercial use is allowed.

    If you use this 3D model in your project be sure to copy paste this credit wherever you share it:
    This work is based on "Beach Ball" (https://sketchfab.com/3d-models/beach-ball-25e1816c0e22444bb62816d3999d1b0b) by MaggaModels (https://sketchfab.com/MaggaModels) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)

-->    
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Update model material</title>
    <meta property="og:description" content="Update model material at runtime." />
    <meta name="mapray-version" content="experimental-feature">
    <meta name="mapray-api-status" content="experimental">
    <meta name="mapray-api-package" content="model-pbr">
    <script src="./model-pbr/mapray.min.js"></script>
    <script src="./model-pbr/maprayui.min.js"></script>
    <link rel="stylesheet" href="./model-pbr/mapray.css">
    <style>
        body {margin: 0; padding: 0;}
        html, body, div#mapray-container { height: 100%; }
    </style>
</head>

<body>
<div id="mapray-container"></div>
</body>
</html>

<script>

    let red, blue, yellow, white;

    class AnimationView extends maprayui.StandardUIViewer {
        constructor(container, options) {
            super(container, options);
            this.count = 0;
            this.jump = true;
        }

        onUpdateFrame(delta_time) {
            super.onUpdateFrame(delta_time);

            if( this.getEntityNum() > 0 ) 
            {
                const entity = this.getEntity(0);

                this.count += delta_time;
                if (this.count > 1.0) {
                    if( this.jump ) {

                        entity.getNode("Sphere_yellow_0").setMaterialProperty(white);
                        entity.getNode("Sphere_blue_0").setMaterialProperty(white);
                        entity.getNode("Sphere_red_0").setMaterialProperty(white);
                        entity.getNode("Sphere_white_0").setMaterialProperty(red);
                        this.jump = false;
                    }
                    else {
                        entity.getNode("Sphere_yellow_0").setMaterialProperty(yellow);
                        entity.getNode("Sphere_blue_0").setMaterialProperty(blue);
                        entity.getNode("Sphere_red_0").setMaterialProperty(red);
                        entity.getNode("Sphere_white_0").setMaterialProperty(white);
                        this.jump = true;
                    }
                    this.count = 0.0;
                }
            }
        }
    }

    const cloudApi = new mapray.cloud.CloudApiV2({
        tokenType: mapray.cloud.CloudApi.TokenType.ACCESS_TOKEN,
        token: "<YOUR_MAPRAY_ACCESS_TOKEN>"
    });

    // The StandardUIView in the ui package includes mouse-based camera manipulation.
    const uiviewer = new AnimationView( "mapray-container", { 
        dem_provider: new mapray.StandardDemProvider( cloudApi.getDefaultDemAsResource() )
    });

    uiviewer.setCameraPosition({
        longitude: 139.76489,
        latitude: 35.67209, 
        height: 455
    });

    uiviewer.setLookAtPosition({
        longitude: 139.76489,
        latitude:  35.67209, 
        height: 455
    });



    const resource = cloudApi.get3DDatasetAsResource(  [ 5178883078881280 ] );
    const loader = new mapray.SceneLoader( uiviewer.viewer.scene, resource, {
        onEntity: ( loader, entity, prop ) => {
            red = entity.cloneMaterial("material");
            yellow = entity.cloneMaterial("yellow");
            blue = entity.cloneMaterial("blue");
            white = entity.cloneMaterial("white");
            uiviewer.addEntity(entity);
        }
    } );

    loader.load();

</script>

Info

このサンプルコードは、<YOUR_MAPRAY_ACCESS_TOKEN>を、あなたのMapray CloudアカウントのOrganization Tokenに置き換えるまで、期待通りに動作しません。