シーン

要約:
  • Scene は、3D 保持モードのグラフィックス モデリングを提供する 3D グラフィックスのシーン グラフ パッケージです。
  • SceneObject のサブクラスにより Scene および内部のオブジェクトを作成します。
  • SceneGraphic は、Scene の表示に使用される Graphic の特別なサブクラスです。

Scene 概要

Scene は 3D グラフィックス シーン グラフ パッケージで、3D 保持モードのグラフィックス モデリングを提供しています。保持モードのグラフィックス システムは、モデルを記述するデータのコピー、およびモデルが置かれている環境の設定情報を保持します。CURL.GRAPHICS.SCENE パッケージを構成する各種のクラスを使用して、3D モデルの作成および操作を行なうことができます。
Curl® 言語では、Renderer3dPrimitive クラスによりイミーディエイト モードの 3D グラフィックスが用意されています。これらのクラスにより描画オブジェクトの頂点やプロパティを直接指定することができます。このモードでは高度な制御が可能であると同時に、オブジェクトを記述する全データの管理や操作が必要になります。
保持モードはさらに高いレベルのモードで、3D シーンの 3D オブジェクトを操作する目的で設計されています。シーンの作成や操作、およびシーンの一部として表示される 3D オブジェクトの操作を実行するための機能が用意されています。
SceneRenderer3d の上のクラスに組み込まれていて、低レベルの詳細に触れずにすべての機能を使用します。
Scene クラス階層」のセクションでは、SCENE パッケージに含まれるすべてのクラスが各階層の関係において一覧表示されています。

シーンの使用

次のリストは、Scene を使用するために必要な手順の概要を示します。

シーンの作成

次の例では、変数 scene を宣言してクラス Scene のインスタンスに対してこれを初期化し、シーンを作成します。プロシージャ make-axis-object は、x、y、z 軸を表す線で構成される PolygonSet を返します。この例では Scene.add-object を使ってこの PolygonSet をシーンに加えます。PolygonSet は、「PolygonSet の使用」で詳しく説明されています。
この例では SceneGraphic にシーンを表示します。SceneGraphic では、マウス ポインタの移動によりカメラを移動することができるように既定のマウス イベント処理が提供されています。SceneGraphic.camera-motion-mode は使用できるカメラの移動モードとその意味を示します。この例を表示するときには、左マウス ボタンを使用して軸の周囲にカメラを回転させ、右マウス ボタンでカメラの倍率 ("ズーム") を変更します。"Reset Camera" ボタンによりカメラを元の位置に戻します。

例: シーンの作成
{import * from CURL.GRAPHICS.SCENE}
{import * from CURL.PGUIDE.SCENEUTILS,
    location = "../../default/support/SceneUtils.scurl"}


{paragraph x axis is red, y axis is green, z axis is blue}
{value
    let scene:Scene = {Scene}
    let camera:Camera = scene.camera
    let camera-target:Distance3d = {Distance3d 0ft, 0ft, 0ft}
    let camera-position:Distance3d = {Distance3d 5ft, -3ft, 5ft}
    let camera-direction:Direction3d =
        {(camera-target - camera-position).direction}
    let up:Direction3d = {Direction3d 0, 0, 1}
    {camera.set-orientation-and-position
        camera-direction, up, position = camera-position}
    set camera.projection = Projection.perspective
    set camera.near-clipping-plane = 1in
    set camera.far-clipping-plane = 20ft
    set camera.field-of-view = 90degrees
   {scene.add-object {make-axis-object 1m}}
    let scene-graphic:SceneGraphic =
        {SceneGraphic
            scene,
            width=4in,
            height=4in,
            background = {FillPattern.get-black}
        }
    let reset-camera:CommandButton =
        {CommandButton
            label = "Reset Camera",
            {on Action at b:CommandButton do
                {camera.set-orientation-and-position
                    camera-direction, up, position = camera-position}
                {scene-graphic.update-drawable}
            }
        }
    {VBox
        scene-graphic,
        reset-camera
    }
}

SceneGraphicocclusion-performance-mode

SceneGraphicは、 Renderer2dGraphicRenderer3dGraphic のように、 DrawableGraphic からプロパティー DrawableGraphic.occlusion-performance-mode を継承します。

このプロパティーはパフォーマンスに影響し、 正しく設定されないと様々な機能的な不調和が生じてくる可能性があります。 特に、グラフィックが一部または全体を他のグラフィカルオブジェクトで覆い隠す場合は注意が必要です。 規定値は OcclusionPerformanceMode.best-effort で、パフォーマンスと描画正確性の調和をとることができます。
以下では、生じる可能性のある問題を例で示します。

Canvas には SceneGraphic および 赤色の Frame 含まれています。  FrameSceneGraphic を正しく覆い隠していません。 occlusion-performance-mode が設定されている行のコメントを取り除き、 実行をクリックすると、 この例のコードは正しく実行されます。

例: Text が正しく Scene をカバーしていない例
{import * from CURL.GRAPHICS.SCENE}

{value
    let canvas =
        {Canvas width = 8cm, height = 7cm, background = "#e0e0e0"}
    {canvas.add
        x = 3cm,
        y = 1cm,
        {value
            {let sc: Scene = {Scene}}
            {sc.add-object
                {Triangle 
                    {Distance3d 2cm, 2cm, 0cm},
                    {Distance3d 8cm, 4cm, 0cm},
                    {Distance3d 4cm, 8cm, 0in},
                    fill-pattern = {FillPattern.get-blue}}
            }
            {SceneGraphic 
||--                    occlusion-performance-mode = 
||--                        OcclusionPerformanceMode.accurate-occlusion,
                width = 5cm,
                height = 5cm,
                sc
            }
        }
    }
    {canvas.add
        x = 0cm,
        y = 3cm,
        {Frame
            background = "red",
            {text font-size = 18pt, Should Cover Scene}
        }
    }
    canvas
}