Away 3Dを使ってみる(7)


太陽があまりにも大きいことは分かったが、どうしても“太陽-地球-月”系でグルグル回っているものを作りたくなった。
もしかしたら全国の小学校で見てもらえるかもしれない・・・なんていう大それた野望すら出てきた。

【今回の目的】
・“太陽-地球-月”系でグルグル回す。

【今回のサンプル】
・サンプル1 回っている・・・一見素晴らしいが、よく見ると間違っているw。
http://system.logosware.com/blogimag/0525/sample1/)。
・サンプル2 間違い探し・・・軸を表示してみた。
http://system.logosware.com/blogimag/0525/sample2/)。
・サンプル3 間違い探し・・・地球の公転面の真横から表示してみた。
http://system.logosware.com/blogimag/0525/sample3/)。


【今回の結果】
回るには回った。今日の段階では、非常に満足している。
「ObjectContainer3DとapplyRotations()」の使い方を一つ覚えたことが、今回の収穫。

しかし、
・地球の地軸まで首振りしている
・月の公転面までもが首振りしている
という“間違い”があるのは残念だ。

【次回の課題】
・首振りを修正する!

以下、今回の遊び。
【太陽は大きすぎ】
よって、
・太陽の大きさ
・太陽-地球の距離
を圧縮することにした。

【技術的なこと】
前回
>ObjectContainer3Dは入れ子構造にできないのだろうか?
>地球の公転のObjectContainer3Dの中に、月の公転のObjectContainer3Dを入れたら、月が表示されない。
と書いたが、実はちゃんといたw。
ものすごく遠くを飛んでいる月を発見したときには、感動した。

MoonPlatform.applyRotations();

これが、正解。

最近、コードを載せていないので、「地軸と月の公転が首振りだけど!」と強調しておいて、コードを公開する。

package
{
	import away3d.containers.ObjectContainer3D;
	import mx.core.UIComponent;
	
	import away3d.containers.View3D;
	import away3d.containers.Scene3D;
	import away3d.cameras.Camera3D;
	import away3d.primitives.Sphere;
	import away3d.materials.BitmapMaterial;
	import away3d.core.utils.Cast;
	import away3d.core.math.Number3D;
	import away3d.primitives.Trident;

	import flash.events.*;
	
	public class App extends UIComponent
	{
		/* **************************************************
		 * 設定 
		 * ************************************************ */
			// 参考までに
			// 月の半径を1とすると(ちなみにradiusは半径)
			// 地球の半径:4
			// 太陽の半径:400			→20にする
			// 月-地球の距離:20
			// 太陽-地球の距離:8000	→400にする
		// 基本サイズ(月の半径)
		internal const BaseLength:Number = 30;   // default:30
		// 太陽サイズの縮小比
		internal const SunRatio:Number = 20;   // default:20
		// 基本時間太陽の自転速度の調整(逆数) nだとn回のonEnterFrameで1日進む
		static internal var rotaionRate:Number = 12;	
		
		/* **************************************************
		 * 変数 
		 * ************************************************ */		
		// Away3D View
		internal var view:View3D = null;
		// Away3D Camera
		internal var camera:Camera3D = null;
		// Away3D Scene
		internal var scene:Scene3D = null;
		// Away3D ObjectContainer
		internal var EarthPlatform:ObjectContainer3D = null;
		internal var MoonPlatform:ObjectContainer3D = null;
		// Away3D Objects
		internal var sun:Sphere = null;
		internal var globe:Sphere = null;
		internal var moon:Sphere = null;
		
		/* **************************************************
		 * 画像
		 * ************************************************ */
		[Embed(source = 'sunmap.jpg')]
		internal var SunMap: Class;
		[Embed(source = 'earthmap.jpg')]
		internal var EarthMap: Class;
		[Embed(source = 'moon.jpg')]
		internal var MoonMap: Class;		
			
		/* **************************************************
		 * メソッド
		 * ************************************************ */
		public function App() 
		{
			super();
			initVIew();
			initCamera();
			initScene();
			initObject();
		}
	
		private function initVIew():void {
			view = new View3D();
			view.x = 500;
			view.y = 375;
		
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			addChild(view);
		}
		
		private function initCamera():void {

			camera = new Camera3D();
			camera.zoom = 125;
			camera.focus = 100;
			camera.z = -300000;
			camera.y = 75000;
			view.camera = camera;
		}		
		
		private function initScene():void {
			scene = new Scene3D();
			view.scene = scene;
		}	
		
		private function initObject():void {
			// 地球の公転面(太陽を中心に)
			EarthPlatform = new ObjectContainer3D( { x:0, y:0, z:0 } );
			// 月の公転面(地球を中心に)
			MoonPlatform = new ObjectContainer3D();
				MoonPlatform.x = 0;
				MoonPlatform.y = 0;
				MoonPlatform.z = BaseLength * ( -8000) / SunRatio;	// 太陽-地球の距離・向き
				MoonPlatform.applyRotations();		// これで地球の周りを回れる
				MoonPlatform.rotationZ = 30;		// たぶんこれくらい傾いていると思う

			// 太陽
			sun = new Sphere( { material:"yellow#white", x:0, y:0, z:0, segmentsH:36, segmentsW:52 } );
				sun.radius = BaseLength * 400 / SunRatio;	// 太陽の半径
				sun.material = new BitmapMaterial(Cast.bitmap(new SunMap()));
				sun.rotationZ = -7;					// 太陽の自転軸の傾き
			// 地球
			globe = new Sphere( { material:"blue#white", x:0, y:0, segmentsH:18, segmentsW:26 } );
				globe.z = BaseLength * ( -8000) / SunRatio;	// 太陽-地球の距離・向き
				globe.radius = BaseLength * 4;		// 地球の半径
				globe.material = new BitmapMaterial(Cast.bitmap(new EarthMap()));
				globe.rotationZ = 23.4;				// 地軸の傾き
			// 月
			moon = new Sphere( { material:"glay#white", y:0, z:0, segmentsH:18, segmentsW:26 } );
				moon.x = BaseLength * ( -20);		// 月-地球の距離・向き
				moon.radius = BaseLength ;			// 月球の半径
				moon.material = new BitmapMaterial(Cast.bitmap(new MoonMap()));
			
			// 太陽-地球-月を配置
				MoonPlatform.addChildren(moon,new Trident());
				EarthPlatform.addChildren(MoonPlatform,globe);
				view.scene.addChildren(EarthPlatform, sun,new Trident(3000));

			// カメラの方向ベクトル
				camera.lookAt(new Number3D(0, 0, 0));

		}	
		
		private function onEnterFrame( event: Event ):void  {
		/* +++++++++++++++++++++++++++++++++++++++++++++++++++
		 * 星の動き 
		 * ++++++++++++++++++++++++++++++++++++++++++++++++ */
	 
			// 太陽の自転
			sun.rotationY = sun.rotationY - 14.2 / rotaionRate;	// 25.38日で1回り
			
			// 地球の公転
			EarthPlatform.rotationY = EarthPlatform.rotationY- 1 / rotaionRate;	// 約360日で1回り
			// 地球の自転
			globe.rotationY = globe.rotationY - 360 / rotaionRate;	// 1日で1回り
	
			// 月の公転
			MoonPlatform.rotationY = MoonPlatform.rotationY - 12 / rotaionRate;	// 約30日で1回り
			// 月の自転
				// 月は公転周期と自転周期が同じなので、公転だけでOKでしょ			

		/* +++++++++++++++++++++++++++++++++++++++++++++++++++
		 * 再描画 
		 * ++++++++++++++++++++++++++++++++++++++++++++++++ */
			view.render();
		}
		
	}
}
The following two tabs change content below.

ロゴスウェア

ロゴスウェア株式会社は、インターネットや情報技術を使って学習に革新的進化をもたらす製品を開発することを目標に、2001年7月に設立されたテクノロジー系ベンチャー企業です。

最新記事 by ロゴスウェア (全て見る)

Comments are closed.