太陽があまりにも大きいことは分かったが、どうしても“太陽-地球-月”系でグルグル回っているものを作りたくなった。
もしかしたら全国の小学校で見てもらえるかもしれない・・・なんていう大それた野望すら出てきた。
【今回の目的】
・“太陽-地球-月”系でグルグル回す。
【今回のサンプル】
・サンプル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(); } } }
ロゴスウェア
最新記事 by ロゴスウェア (全て見る)
- Amazon Linux(EC2)と PHPSTORM で Xdebug を行う - 2018年9月26日
- やらないことの合意 - 2018年6月27日
- 卒園アルバムとプロジェクトマネジメント - 2018年3月30日
Comments are closed.