飛行機をぐるぐる回す

飛行機をぐるぐる回す

 前回は色々な絵を描くための額縁を作って、その額縁の中に例として基本的な絵を描いてみました。
前回は立方体の絵でしたが、もう少し複雑な絵を描いて、3D表示してグルグル回してみましょう。

 何の絵を描くかは、例として飛行機を選んでみました。複雑な絵を細かく三角形に切り刻むとより滑らかな3D表示になるのは分かっているのですが、位置計算等に時間がかかってしまい、気持ちよくグルグル回せなくなってしまうんじゃないかと思い三角形を少なくします。
飛行機雑誌にビーチの飛行機三面図が載っていましたので、その図を三角形に区分けしてデータを作りました。球面を表現しようとすると三角形が多くなりますので、XYZ面に沿った三角形ばかりになっています。ですので飛行機は箱型になってしまいます。
ちまちまと飛行機図面を三角形で区分けして埋めて、定規で三角形の頂点位置を出します。その三角形頂点から左回り三角形の面データを作ります。ちまちました手作業なので面倒ですし、出来上がりもいまいちですが、素人のお遊びなのでこんなもんで自己満足します。
できあがったデータを配列にしたのが以下のとおりです。
頂点データが64個、面データが94個となりました。


    //Vertex data Air Plane
  	  static float bx0[] ={
  			   -20.0f, -17.6f, -17.6f, -17.6f, -17.6f 	//top 0-4
  			  , -11.2f, -11.2f, -11.2f, -11.2f			// mado mae 5-8
  			  , -9.0f ,  -9.0f,  -9.0f,  -9.0f			//mado 9-12  
  			  ,  6.0f,    6.0f,   6.0f,   6.0f 			//dou 13-16
  			  ,19.4f									// oshiri 17
  			  ,-6.8f, -5.2f, -5.1f, -1.8f,  0.0f,0.0f		//LWing 18-23
  			  ,-6.8f, -5.2f, -5.1f, -1.8f,  0.0f,0.0f		//RWing 24-29
  			  ,-13.2f, -10.8f,-10.8f,-10.8f, -10.8f		//Reng 30-34
  			  ,-2.4f,  -2.4f, -2.4f, -2.4f,  -1.2f			//Reng 35-39
  			  ,-13.2f, -10.8f,-10.8f,-10.8f, -10.8f		//Leng 40-44
  			  ,-2.4f,  -2.4f, -2.4f, -2.4f,  -1.2f			//Reng 45-49
  			  ,12.6f,15.8f,18.4f,17.3f				//Rtwing 50-53
  			  ,12.6f,15.8f,18.4f,17.3f				//Ltwing 54-57
  			  ,17.0f,20.0f,17.8f,12.0f		//V 58-61
  			  ,13.2f,5.0f				//V 62-63  			  
  			  };
  	  //		  0       1       2       3       4 
  	  static float by0[] ={
  			     0.0f,  -1.2f,  1.2f,   -1.2f,   1.2f	//top 0-4
  			    , -2.0f,   2.0f, -2.0f,    2.0f			// mado mae 5-8
  			    , -2.0f,   2.0f, -2.0f,    2.0f			//mado 9-12  
  			    , -2.0f,   2.0f, -2.0f,    2.0f			//dou 13-16  
  			    , 0.0f							// oshiri 17
  			    , -2.2f, -8.6f, -20.0f, -20.0f,-8.6f,-2.2f	  //LWing 18-23
  			    , 2.2f, 8.6f, 20.0f, 20.0f,8.6f,2.2f	  //RWing  24-29
  			    ,-5.6f,-6.4f,-4.8f,-6.4f,-4.8f			//Reng 30-34
  			    ,-6.4f,-4.8f,-6.4f,-4.8f,-5.6f		//Reng 35-39
  			    ,5.6f,6.4f,4.8f,6.4f,4.8f			//Leng 40-44
  			    ,6.4f,4.8f,6.4f,4.8f,5.6f		//Reng 45-49
  			    ,-1.2f,-9.6f,-9.6f,-0.6f	//Rtwing 50-53
  			    ,1.2f,9.6f,9.6f,0.6f	//Ltwing 54-57
  			    ,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f		//V 58-63
   			  };
  	  static float bz0[] ={
  			    -0.8f,   0.5f,   0.5f,  -1.4f,  -1.4f	//top 0-4
  				, 2.0f,   2.0f,  -1.6f,  -1.6f 			// mado mae 5-8
  			    , 3.4f,   3.4f,  -1.6f,  -1.6f  		//mado 9-12
  			    , 3.0f,   3.0f,  -1.6f,  -1.6f  		//dou 13-16 
  			    , 2.0f							//ketsu 17 
  			    ,-0.4f,-0.0f,0.9f,0.9f,-0.5f,-1.2f 	//LWing  18-23
  			    ,-0.4f,-0.0f,0.9f,0.9f,-0.5f,-1.2f 	//RWing  24-29
  			    ,0.0f,0.8f,0.8f,-0.8f,-0.8f		//Reng 30-34
  			    ,0.8f,0.8f,-0.8f,-0.8f,0.0f		//Reng 35-39
  			    ,0.0f,0.8f,0.8f,-0.8f,-0.8f		//Reng 40-44
  			    ,0.8f,0.8f,-0.8f,-0.8f,0.0f		//Reng 45-49
  			    ,2.0f,3.2f,3.0f,1.8f			//Rtwing 50-53
  			    ,2.0f,3.2f,3.0f,1.8f		//Ltwing 54-57
  			    ,8.4f,8.4f,2.4f,2.7f		//V 58-61
  			    ,4.0f,3.0f						//v62-63
  			  };

  	    // Air Plane面データ
  	    static int bsurfdata[][] = {
  	    		{0,1,2},{0,3,1},{0,2,4},{0,4,3} //top 0-3
  	    		,{1,5,2},{2,5,6},{1,3,7},{1,7,5},{2,6,8},{2,8,4},{4,8,7},{3,4,7}// mado mae 4-11
  	    		,{5,9,6},{6,9,10},{5,7,11},{5,11,9},{6,10,12},{6,12,8},{7,8,11},{8,12,11}//mado 12-19
  	    		,{9,13,10},{10,13,14},{9,11,15},{9,15,13},{10,14,12},{12,14,16},{11,16,15},{12,16,11}//dou 20-27
  	    		,{14,13,17},{13,15,17},{14,17,16},{15,16,17}	//ketu 28-31
  	    		,{18,22,23},{18,19,22},{19,21,22},{19,20,21}	//LWing top 32-35
  	    		,{18,23,22},{18,22,19},{19,22,21},{19,21,20}	//LWing bot 36-39
  	    		,{24,28,25},{24,29,28},{25,27,26},{25,28,27}	//RWing top 40-43
  	    		,{24,25,29},{25,28,29},{25,26,28},{26,27,28}	//RWing bot 44-47
  	    		,{30,31,32},{30,33,31},{30,32,34},{30,34,33}	//Reng 48-51
  	    		,{31,35,32},{32,35,36},{31,33,37},{31,37,35}	//Reng 52-55
  	    		,{32,38,34},{32,36,38},{33,34,37},{34,38,37}	//Reng 56-59
  	    		,{35,39,36},{35,37,39},{36,39,38},{37,38,39}	//Reng 60-63
  	    		,{40,42,41},{40,44,42},{40,41,43},{40,43,44}	//Leng 64-67
  	    		,{41,46,45},{41,42,46},{42,48,46},{42,44,48}	//Leng 68-71
  	    		,{41,45,47},{41,47,43},{48,44,43},{48,43,47}	//Leng 72-75
  	    		,{45,46,49},{46,48,49},{45,49,47},{48,47,49}	//Leng 76-79
  	    		,{50,52,53},{50,51,52},{50,52,51},{50,53,52}	//Rtwing 80-83
  	    		,{54,56,55},{54,57,56},{54,55,56},{54,56,57}	//Ltwing 84-87
  	    		,{61,60,58},{58,60,59},{58,60,61},{58,59,60}	//V 88-91
  	    		,{63,61,62},{63,62,61}	
  	    		
  	    };	

 これらの配列をCubeVert.javaに設定して、初期処理で読み込んでいます。表示はDrawGraphi.javaです。三角形の枠線やxyz座標の線などは消しました。また前回の立方体のまま表示すると、飛行機が拡大され過ぎますので、scaleを小さい値に変更しています。



実行すると、右図のようになります。
表と裏の境目を表示するときなのでしょうか、変な表示になったりしているようです。よくわからないのでこのままにしています。

前から「lang.NullPointerException」という警告がコンソールに表示されます。出ないときもあるようです。
エクセルで0割り算してる時と同じで、何もない空虚なところを操作しにいっているみたいなことでしょうか。よくわかりません。たぶん処理の順序で、こちらが想像している順序と違う順序でプログラムが動いて、まだ初期処理していないところを覗きにいっているみたいなことが起きているのでしょうか?初期処理にタイマーを入れた方がいいのでしょうか?
私が作ったjavaプログラム名はALM表示されていませんし、例外処理をしているだけで、問題なく動いていますので、このいまま何も修正もせずにしています。
工業製品でもないし、アマチュアの適当なプログラムですので、気にもせずです。







今回のプログラム一式を添付しておきましょう。