« Celestia スクリプト ― カメラの位置と方向 (Part 1) | トップページ | 診療報酬削減で保険者は黒字 »

2008年7月11日 (金)

Celestia スクリプト ― カメラの位置と方向 (Part 2)

簡単に解説をします。

座標系 "Ecliptical (Follow)"

”Celestia .CEL Scripting Guide"1 に説明があります。

The X axis points away from the Sun in the direction of the Julian 2000.0 vernal equinox. The Y axis is normal to the ecliptic with positive Y north. The Z axis completes the right-handed coordinate system.

”Celestia's Coordinate Systems”, p.12

すなわち :

  • X軸は春分点の方向
  • Y軸は黄道面の法線で、北の方向が正
  • Z軸は右手系をなすように定める

XZ 平面が黄道面になる黄道座標みたいですね。

位置

”Celx Objects and Methods”2 によりますと :

  newposition (x, y, z)
      Creates a new position object, from numbers or from URL-style Base64-
      encoded values.
        x, y, z: The components of the new position. Either as numbers (unit
                 is microlightyears), or as x, y, z string-values taken from
                 a cel-style URL.

ここで、”microlightyears” とはいかなる単位なのかといいますと、以下のようにあります。

MLY used as a DISTANCE:
   One MLY = 9,466,411.842 km. Define a constant of this value (ie. KM_PER_MLY
   = 9466411.842) and use it in your scripts where you need to convert from/
   to km/MLY.

方向

同じく、以下のようにあります。

 newrotation (axis, w) -OR- (w, x, y, z)
      Creates new rotation object (i.e. a quaternion).
           axis: Vector describing the axis of this rotation.
              w: The angle of this rotation (for details check out
                 quaternions).
      Or ...
        w,x,y,z: Number values for this quaternion.

ベクトル・角度(ラジアン)か、もしくは、 四元数(しげんすう、quaternion;クオータニオン) で回転/方向を指定するようです。 方向を指定する (setorientation) 場合、ゼロ度は Z 軸の反対方向、 XZ 平面に平行となるようです。

以下のスクリプトを実行して、結果を確かめます。 X 軸上に太陽の光が当たっていること、 Z軸上では角度がゼロとなること、などに着目していただければ。

-- test02.celx

KM_PER_MLY = 9466411.842

myearth = celestia:find("Earth")
celestia:select(myearth)
distance = myearth:radius() * 10.0 / KM_PER_MLY

myobserver = celestia:getobserver()
myframe = celestia:newframe("ecliptic", myearth)
myobserver:setframe(myframe)
myobserver:follow(myearth)

deftim = celestia:gettime()
defort = myobserver:getorientation()
defpos = myobserver:getposition()

celestia:print("test02", 3)
wait(3)

-- 春分
celestia:settime(celestia:tojulianday(2008, 3, 20, 0, 0, 0.0))

-- x軸上にカメラ移動
mypos = celestia:newposition(
  distance,
  0.0,
  0.0)
myobserver:gotolocation(mypos, 3)
wait(3)

celestia:print("shot 1", 3)
wait(3)

-- 地球中心方向へカメラ向き設定
myrot = celestia:newrotation(celestia:newvector(0.0, 1.0, 0.0), math.pi * -0.5)
myobserver:setorientation(myrot)
wait(1)

celestia:print("shot 2", 3)
wait(3)

-- z軸上にカメラ移動
mypos = celestia:newposition(
  0.0,
  0.0,
  distance)
myobserver:gotolocation(mypos, 3)
wait(3)

celestia:print("shot 3", 3)
wait(3)

-- 地球中心方向へカメラ向き設定
myrot = celestia:newrotation(celestia:newvector(0.0, 1.0, 0.0), 0.0)
myobserver:setorientation(myrot)
wait(1)

celestia:print("shot 4", 3)
wait(3)

-- y軸上にカメラ移動
mypos = celestia:newposition(
  0.0,
  distance,
  0.0)
myobserver:gotolocation(mypos, 3)
wait(3)

celestia:print("shot 5", 3)
wait(3)

-- 地球中心方向へカメラ向き設定
myrot = celestia:newrotation(celestia:newvector(1.0, 0.0, 0.0), math.pi * 0.5)
myobserver:setorientation(myrot)
wait(1)

celestia:print("shot 6", 3)
wait(3)

-- 元に戻す
celestia:settime(deftim)
myobserver:setorientation(defort)
myobserver:setposition(defpos)

celestia:print("fin", 1)
wait(1)

実行結果は以下のとおりです。

Test0200

Test0201

Test0202

Test0203

Test0204

Test0205

Test0206

|

« Celestia スクリプト ― カメラの位置と方向 (Part 1) | トップページ | 診療報酬削減で保険者は黒字 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/22209545

この記事へのトラックバック一覧です: Celestia スクリプト ― カメラの位置と方向 (Part 2):

« Celestia スクリプト ― カメラの位置と方向 (Part 1) | トップページ | 診療報酬削減で保険者は黒字 »