一つ または複数の Visual Display ウィンドウを制御する

最初は scene と名付けられた Visual display ウィンドウがあります。display オブジェクトは使われない限り表示装置にウィンドウを作りません。ですからプログラムの最初に display オブジェクトを作ったとしても、scene の見え方について悩む必要はありません。単純に sphere のようなオブジェクトを単純に作ることから始めても scene の上に描かれます。(訳注: scene や display() 命令なしでも sphere() だけで scene の上に描かれます。)

display():  display オブジェクトを生成します。様々の属性を指定する引数を指定することにより、望みの display オブジェクトにできます。たとえば下のように 高さ 200 幅 600 の、タイトルバーには 'Graph of position' のついている、 中損座標は (5,0,0) で背景は青緑色のウィンドウとなる display オブジェクトを、下のように作れます。

scene2 = display(title='Graph of position',

     width=600, height=200,

     center=(5,0,0), background=(0,1,1))

General-purpose options

select()    display オブジェクトを選択された状態にします。例えば scene2.select() によって選択された後は visual オブジェクトはデフォルトで scene2 に描かれるようになります。

関数 display._selected() は 現在使われているデフォルトの display オブジェクトへの参照を返します。(display オブジェクトが未だ生成されていないとき None を返します).

foreground  sphere などの visual オブジェクトを生成するときのデフォルトの色を指定します。最初のデフォルトの foreground 色は白色です。例:scene.foreground = (1,0,0)

background display ウィンドウを埋め尽くす背景色を指定します。デフォルトは黒色です。

stereo    立体的に見せるためのオプションです。 scene.stereo = 'redcyan' オプションは、赤色フィルタを装着した左目のためのシーンと、青色フィルタを装着した右目のためのシーンを生成します。(もちろん 'redblue''yellowblue' などのオプションも可能です。注意:Visual オブジェクト自身が白色でないと薄暗くなります。)

scene.stereo = 'crosseyed' を設定すると、二つのイメージを左右に並べて表示します。こうすると、より目で見ながらスクリーンに焦点が合っている状態にすることで、十分に小さいものまで 3D 状態で見ることができます(これには若干の練習が必要です。)。scene.stereo = 'passive' を設定すると、このときも二つのイメージを左右に並べて表示します。ただし今度は遠目で見ながらスクリーンに焦点が合っている状態にすることで、十分に小さいものまで 3D 状態で見えます(こちらも若干の練習が必要です)。

scene.stereo = 'active' は液晶シャッター眼鏡で見るための左目用/右目用イメージを交互に描きます。そのためには、quad buffered stereo を扱えるグラフィック・システムが必要です。立体視のためのハードウェアが無いときは、このオプションの設定は何らの効果ももたらしません。scene.stereo の値は 'nostereo' になります。二つの偏光プロジェクタ(立体視のために単純な偏光ガラス眼鏡を使います)を使った quad buffered stereo 向けに scene.stereo = 'passive' も使えます。「Quad buffered 'active' stereo は PC 向けのnVidia Quadro graphics カードのような専用の回路とシャッタ付き眼鏡へのコネクタを備えた専用の画像システムでのみ有効です。このシステムは、右目/左目に対応した視点のわずかに違えた二つをフレーム毎に描くことで、奥行きのあるように錯覚させた画像を生成します。特別なシャッタ付きの眼鏡を使って、交互に表示する左右の画像に同期させることで、左右の目は立体視にマッチしたフレーム画像のみを見ることになります。これは 'quad buffered' を呼んでいます。スムーズに表示させるためのダブル・バッファとなっている OpenGL バッファが、左右の目に合わせて組で存在するからです。'Passive' 立体視のためには二つのモニタ、またはプロジェクタを表示できるビデオカードが必要です。」

stereodepth デフォルトではシーンの先端が物理スクリーンの位置にくるように左右の画像データを配置します。それにより目への負担を減らします。scene.stereodepth = 1 に設定することでシーンの中心が物理スクリーンの位置に来るように配置します。それによりスクリーンから劇的に飛び出しているように見えます。scene.stereodepth = 2 に設定することでシーンが物理スクリーンより全部出てしまうように配置します。これにより最大のステレオ視となります。

ambient  非直射(環境)光の量です。デフォルトで 0.2 です。次の light 属性も参照下さい。

lights    光源の方向を表すベクトルのリストです。ベクトルの長さは光の強度を表します。例えば scene.ambient = 0scene.lights = [vector(1,0,0)] のとき、光源は右側にあり左側を照らす環境光は 0 となります。デフォルトで二つの光源:(0.17, 0.35, 0.70):長さは 0.8, と (-0.26, -0.07, -0.13):長さは 0.3 が設定されます。 lightsambient 属性は注意して使わねばなりません。トータルの光の強さが 1 を超えると、その結果は予想がつかなくなってしまうからです。

cursor.visible カーソルをオン・オフさせます。scene.cursor.visible = 0 を設定することでマウス・カーソルが見えなくなります。これは Visual オブジェクトをマウスでドラッグするとき しばしば有効に使えます。scene.cursor.visible = 1 とすることでカーソル表示に戻せます。

objects   見えている Visual オブジェクト全てのリストです。見えていない Visual オブジェクトは含みません。例えば下のように、全ての見えている box オブジェクトを赤くできます。

    for obj in scene2.objects:
    if obj.__class__ == box # can say either box or 'box'
        obj.color = color.red

カメラ位置の取得についてはマウス入力を参照下さい。

 

ウィンドウの制御

x, y     スクリーン上でのウィンドウの位置です。(左上からのピクセル数です)

width, height width と height はピクセル値で表した表示領域です。例 scene.height = 200 (訳注: width/height 属性は表示前に限っての読み書きに限定されます)

title     ウィンドウのタイトルバーに表示する文字列です。 例 scene.title = 'Planetary Orbit'

visible    display オブジェクトを見えるようにします。scene2.visible = 1 scene2 の名前が付いた display オブジェクトを見えるようにします。新しい visual オブジェクトが追加されるかマウスが参照されるとき()、自動的に visible 属性が 1 にされます。 visible にすると見えなくなります。(訳注:メイン display オブジェクトの visible 属性を 0 にすると visual プログラムが終了します)

fullscreen  全画面にするオプションです。scene2.fullscreen = 1 とすると scene2 と名付けられている dispaly オブジェクトが全画面になります。このときクローズ釦も無くなってしまうので、エスケープ釦で終了させます。
 現在のところ Linux/Unix Mac OSX には fullscreen オプションにバグがあります。キーボード入力をエスケープ釦も含めて受け付けなくなります。これらの OS で fullscreen オプションを使うときは、マウス入力による終了プログラム操作を必ず追加ください。

exit      もし sceneb.exit = 0 にしてあると sceneb の名前の付いた display オブジェクトのクローズ釦をクリックしても終了しなくなります。デフォルトは sceneb.exit = 1 です。このときはクローズ釦をクリックすることでプログラムが終了します。

 

 

表示領域の制御

center    中心:center とは、カメラの視点が周囲を回っても、常に同じ位置を保つ場所です。center 中心を変えてやると、カメラはその方向に向かい続けながら動きます(別の中心を設定されるまで)。デフォルトの center は (0,0,0) です。 the camera forward でもカメラの向きを変えられます。下の forward 属性も見てください。

autocenter  自動中心:autocenter は、シーン全体を囲む box の真中を center とするように常に scene.center を更新します。これによる、プログラムがシーン全体を動かしても、シーンの真中が表示ウィンドウの中央となるように center が変更されつづけます。

forward  ベクトル:forward はカメラが見ている方向と同じ向きを指します。(すなわち、scene.mouse.camera で与えられる現在のカメラ位置から scene.center へ向かう方向です) ユーザーが回転させることにより、このベクトルは連続して変化します。逆に forward ベクトルが別の値に変更されると、カメラ位置は、その方向が scene.center を見るように変わります。その scene.center のデフォルト値は (0,0,-1) です。

fov      カメラの視野角をラディアン単位で表したものです。これは水平/垂直視野角の最大値として定義されます。これはオブジェクトを見ている範囲を角度で表したものと考えられます。またはウィンドウの長いほうの座標軸側のユーザーから見える角度とも考えられます。デフォルトは pi/30.0 ラディアン(60度)です。

range     座標軸それぞれに沿った中心:center から対象領域への広がりを意味します。これは常に 1.0/scale であり、どちらを使うかは、貴方のプログラムを最大限に活用できるかで決まります。デフォルトでは (10,10,10) またはオートスケール:autoscaleとなります。

scale     単位角の中にどこまで入るかを意味します。スケール・ファクタと言われる量です。これは常に 1.0/range であり、 range, scale のどちらを使うかは、貴方のプログラムを、どちらが最大限に活用できるかで決まります。デフォルトでは (0.1,0.1,0.1) またはオートスケールとなります。

uniform = 0 座標軸ごとに異なる単位とスケールを使うことを意味します。

        オートスケールでは座標軸ごとに独立してスケールを定めます。

        x,y 軸はウィンドウの縦横比でスケールが定まります。

uniform = 1 座標軸すべてが共通のスケールを使うことを意味します。

        オートスケールは、座標軸すべてに同じスケールを定めます。

        ウィンドウの縦横比は x,y 軸のスケールに影響しません。

up      表示空間の上側を表すベクトルです。このベクトルは、常にスクリーン上での垂直線方向を向いています。(カメラの垂直方向を指し示す錘を考えてください。) ユーザーがマウスを水平に動かして表示されているオブジェクトを回転させるとき、カメラもこの up 軸の周りを回転します。デフォルトで y 軸が up ベクトルです。

       upベクトルはカメラが指し示す方向である forward属性を規定します。デフォルトでカメラは -z 方向 (0,0,-1)を向いています。この場合 x または y 軸(または x 軸と y 軸の間の任意方向)を up ベクトルに指定できます。しかし z 軸方向を up ベクトルとして指定できません。up 属性を指定したとき、その up 軸の周りをカメラが回転するからです。z 軸を up 方向にするには、最初に forward を -z 軸方向以外の、たとえば (1,0,0) など別の方向にせねばなりません。

autoscale = 0 のとき自動的にスケールを設定しません。(ユーザーが明示的に scale から range を設定します)

autoscale = 1 のときスケールを自動的に設定します。(デフォルト)

       Visual の最初の表示だけは autoscale = 1 で行わせ、その後の表示の変化ではオート・スケールが働かないように autoscale = 0 にするテクニックがあることを覚えておいてください。

userzoom = 0 により、ユーザーによるシーンのズーム・イン/アウトができなくなります。

userzoom = 1 でズームできます。(デフォルト)

userspin = 0 でユーザーによるシーンの回転ができなくなります。

userspin = 1 で回転させられます。(デフォルト)

訳注:ここに書いてある foward, fov, range,scale, up, などの説明は、読んだだけでは理解できないと思います。英語の原文でも適切な説明を諦めているように感じます。

下のコード例などを使って自分で実際に動かすことでも動作を確認ください。

//@@
#06.10.18 diplay() foward, up
from visual import *
scene2 = display(title='Graph of position',
     width=400, height=300, range=(3,3,3),
     center=(0,0,0)                 , background=(0,1,1)
)

#box(display = scene2,  size=(1,2,3))

a = arrow(display = scene2, pos=(0,0,0), axis=(1,0,0),  color=crayola.red)
b = arrow(display = scene2, pos=(0,0,0), axis=(0,1,0),  color=crayola.green)
c = arrow(display = scene2, pos=(0,0,0), axis=(0,0,1),  color=crayola.blue)

scene2.up = (1,0,0)
//@@@
//copy \#####.### temp.py /y