コンテンツにスキップ

Sun

太陽 (大気あり、太陽の仰角 6°)

Mapray JS では太陽の位置・明るさ・大きさを指定して描けます。大気 (Atmosphere) と組み合わせると、空・地表・水面が同じ太陽で照らされ、地平線近くでは太陽が赤く減光します。

関連クラス

クラス 取得先 内容
Sun viewer.sun 太陽の方向・照度・視直径。空・地表・水面・太陽の円盤がすべてこの値を読みます
SunVisualizer viewer.sunVisualizer 太陽の円盤と円光 (まわりの暈) の表示

SunVisualizer は Viewer の生成時に渡します。

const viewer = new mapray.Viewer( "mapray-container", {
    // ...
    atmosphere: new mapray.Atmosphere(),
    sun_visualizer: new mapray.SunVisualizer(),
} );

Sun のメソッド

メソッド 単位 動作
setSunDirection( v ) GOCS の単位ベクトル 太陽の方向。正規化はしないので、単位ベクトルを渡します。空・地表・月の満ち欠け・夜景レイヤーがすべて読みます
setIlluminance( v ) 基準の太陽 = 1.0 太陽の照度 (明るさ)。空・空気遠近・地表・水面・太陽の円盤が一様に明るさを変えます
setIlluminanceLux( v ) lx 照度を lx で指定します。基準の太陽の照度 (mapray.Sun.SOLAR_ILLUMINANCE_LUX) で割った値を setIlluminance に渡すのと同じです
setAngularDiameterDegree( v ) 度 太陽の視直径。照度は変わらないので、大きくすると円盤は大きく暗くなり、地表の明るさは変わりません
  • getSunDirection( dst ) で現在の方向を取得できます
  • 太陽の方向の GOCS については 座標系 を参照してください
  • 描画に使う照度には下限があります。setIlluminance( 0 ) にしても、空・地表・太陽の円盤は下限の照度で描かれ、真っ暗にはなりません
照度 0.5 1.0 2.0
0.5 1.0 2.0
標準の視直径 視直径 2°
default 2

SunVisualizer のメソッド

メソッド 動作
setVisibility( flag ) 太陽の円盤を描くか。非表示にすると円光も消えます (値は保持されます)
setGlowIntensity( v ) 円光 (太陽のまわりの暈) の強さ。2〜3 が快晴らしさを保てる上限の目安です
  • 円光は大気の空のシェーダーの中で描きます。大気が無いとき、大気を無効にしたときは描きません
  • Atmosphere.applyPreset() も円光の強さ (aureole_intensity) を書き込みます。後から書いた方が残ります
  • new mapray.SunVisualizer( divide ) の divide は円盤の分割数です (小さすぎる値は例外になります)
円光 0 0.3 2.5
0 0.3 2.5

大気との関係

  • 大気が有効なときは、太陽の円盤も大気の透過率で減光し、地平線近くで赤くなります。ブルーム (Render Effects) が効く品質 (medium / high) では、円盤のまわりに光がにじみます
  • 大気が無いとき、または大気を無効にしたとき (setEnvironmentEnabled( false )) は、円盤を表示色の光輪で描きます。このとき視直径を変えると円盤は大きくなりますが暗くはならず、照度の下限もありません
  • 大気の描画品質 minimal では、地形・建物・点群は固定のライティングになるので、太陽の照度を変えても地表の明るさは変わりません。空・太陽の円盤・水面には効きます
大気あり 大気なし (setEnvironmentEnabled( false ))
atm noatm

非推奨の API

非推奨のメソッド 現在の動作
SunVisualizer.setIntensity( v ) viewer.sun.setIlluminance( v ) に書き込みます。円盤だけでなく空・地表・水面の明るさも変わります
SunVisualizer.setRadius( v ) viewer.sun.setAngularDiameterDegree() に、標準の視直径の v 倍を書き込みます。大気があると、大きくするほど円盤は暗くなります
SunVisualizer.setRayleigh / setMie / setScaleDepth 大気が無い (または無効な) ときに、キャンバスへ直接描く場合だけ、太陽の赤みに使います
SunVisualizer.setSunRate 描画に影響しません
Atmosphere.setAureoleIntensity 太陽と月の円光の両方に書き込みます。setGlowIntensity を使ってください

サンプルコード

Sun と SunVisualizer で、夕方の太陽を描く例です。

 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
<!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(),
            sun_visualizer: new mapray.SunVisualizer(),
        });

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

        const theta = - Math.PI / 180.0 * ( -47.5 );
        uiviewer.viewer.sun.setSunDirection( [ Math.cos( theta ), Math.sin( theta ), 0 ] );
        uiviewer.viewer.sun.setAngularDiameterDegree( 1.0 );
        uiviewer.viewer.sunVisualizer.setGlowIntensity( 1.0 );

        uiviewer.setCameraPosition({
            longitude: 139.09396,
            latitude: 35.42153,
            height: 5200
        });

        uiviewer.setLookAtPosition({
            longitude: 138.733876,
            latitude: 35.392069,
            height: 2200
        });
    }

    main();
</script>

Info

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

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