コンテンツにスキップ

Moon

月 (夜、大気あり)

Mapray JS では月の位置・明るさ・大きさを指定して描けます。月は円盤として描かれるだけでなく、夜の空・地表・建物・点群・水面を月光で照らします。満ち欠けは太陽との位置関係から自動で決まります。

関連クラス

クラス 取得先 内容
Moon viewer.moon 月の方向・照度・視直径。空・地表・水面・月の円盤がこの値を読みます
MoonVisualizer viewer.moonVisualizer 月の円盤と円光の表示

MoonVisualizer は Viewer の生成時に、月の画像を指定して渡します。NASA の月画像 を Mapray のサイトで配信しています。

const viewer = new mapray.Viewer( "mapray-container", {
    // ...
    atmosphere: new mapray.Atmosphere(),
    moon_visualizer: new mapray.MoonVisualizer( "https://resource.mapray.com/assets/images/moon.jpg" ),
} );

Moon のメソッド

メソッド 単位 動作
setMoonDirection( v ) GOCS の単位ベクトル 月の方向。正規化はしないので、単位ベクトルを渡します。満ち欠けは太陽との位置関係から決まります
setIlluminance( v ) 太陽の照度に対する比 夜の月の照度。0 で月光なし。空の月光・地表・建物・点群・水面・月の円盤がすべてこの値を読みます
setAngularDiameterDegree( v ) 度 月の視直径。照度は変わらないので、大きくすると円盤は大きく暗くなります

getMoonDirection( dst ) で現在の方向を取得できます。

照度 0 0.05 0.2
0 0.05 0.2

月光は地表も照らします。下の図は夜の富士山を、月の照度だけを変えて撮ったものです。

照度 0 0.2
0 0.2

暗順応

物理的な満月の照度は太陽に比べてはるかに小さく、そのままでは暗すぎて見えません。標準値は、夜の暗さに目が慣れた状態 (暗順応) を表す値で、物理的な満月よりずっと明るく設定してあります。

setIlluminance で置くのは夜の値です。描画に使う照度は、カメラの位置から見た太陽の高さで自動的に変わります。

時間帯 描画に使う照度
夜 (太陽が十分に沈んでいる) 設定した値
薄明 設定した値から昼の値へ滑らかに下がります
昼 (太陽が地平線の上) 物理的な満月と同じ照度

そのため、昼間に setIlluminance を変えても、月の円盤も月光もほとんど変わりません。昼の月は空の明るさの中に淡く見えます。

昼の月

MoonVisualizer のメソッド

メソッド 動作
setVisibility( flag ) 月の円盤を描くか。非表示にすると円光も消えます (値は保持されます)
setGlowIntensity( v ) 円光 (月のまわりの暈) の強さ。暗順応後の月の照度と大気のもやの量にも比例します
標準の視直径 視直径 2° 円光 2.5
default 2 glow

大気との関係

  • 大気が有効なときは、月の円盤も大気の透過率で減光し、地平線近くで暗く赤くなります
  • 大気が無いときは、地表・建物・点群を月光で照らしません (月光 0 として扱います)。月の円盤は描きます
  • 大気の描画品質 minimal では、地形・建物・点群は固定のライティングになるので、月光で照らされません。空の月光・月の円盤・水面には効きます

非推奨の API

非推奨のメソッド 現在の動作
MoonVisualizer.setIntensity( v ) viewer.moon.setIlluminance() に、標準の月の照度の v 倍を書き込みます。円盤だけでなく空・地表・水面の月光も変わります
MoonVisualizer.setRadius( v ) viewer.moon.setAngularDiameterDegree() に、標準の視直径の v 倍を書き込みます。大気があると、大きくするほど円盤は暗くなります
Atmosphere.setMoonIlluminance( v ) viewer.moon.setIlluminance( v ) に書き込みます

サンプルコード

夜の月を描く例です。太陽を地平線の下に置き、月を東の空に置いています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script src="./v0.10.6/mapray.min.js"></script>
        <script src="./v0.10.6/maprayui.min.js"></script>
        <link rel="stylesheet" href="https://resource.mapray.com/styles/v1/mapray.css">
        <style>
            html, body, div#mapray-container { margin: 0; padding: 0; height: 100%; }
        </style>
    </head>

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

<script>
    async function main() {
        // Set up your Organization Token, which can be created in Mapray Cloud.
        const accessToken = "<YOUR_MAPRAY_ACCESS_TOKEN>";
        const uiviewer = new maprayui.StandardUIViewer( "mapray-container", accessToken, {
            dem_provider: new mapray.StandardDemProvider( {
                prefix:  "https://tiles.mapray.com/dem/",
                headers: { Authorization: "Bearer " + accessToken }
            } ),
            atmosphere: new mapray.Atmosphere(),
            moon_visualizer: new mapray.MoonVisualizer( "https://resource.mapray.com/assets/images/moon.jpg" ),
        });

        // Wait for the initialization process to complete.
        await uiviewer.viewer.init_promise;

        // Put the sun on the far side of the earth and the moon above Mt. Fuji.
        const sTheta = - Math.PI / 180.0 * ( 140.0 + 180.0 );
        const mTheta = - Math.PI / 180.0 * 140.0;
        uiviewer.viewer.sun.setSunDirection( [ Math.cos( sTheta ), Math.sin( sTheta ), 0 ] );
        uiviewer.viewer.moon.setMoonDirection( [ Math.cos( mTheta ), Math.sin( mTheta ), 0 ] );
        uiviewer.viewer.moon.setIlluminance( 0.1 );
        uiviewer.viewer.moon.setAngularDiameterDegree( 1.5 );

        uiviewer.setCameraPosition({
            longitude: 138.50687,
            latitude: 35.37715,
            height: 2500
        });

        uiviewer.setLookAtPosition({
            longitude: 138.724949,
            latitude: 35.363787,
            height: 3000
        });
    }

    main();
</script>

Info

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

その他のメソッドや詳細、各メソッドの範囲と既定値は リファレンスマニュアル (Moon) と リファレンスマニュアル (MoonVisualizer) を参照してください。

月の画像の出典

Mapray のサイトで配信している月の画像の出典です。

NASA's Scientific Visualization Studio