10000 !========================================== 10010 ! フライトシミュレータ風 10020 ! 3D移動&角度制御サンプル 10030 !========================================== 10040 ! 10050 !========================================== 10060 ! 初期化 10070 !========================================== 10080 INIT ! 初期化 10090 TEXTMODE 2 ! テキストモード2 10100 RANDOMIZE ! 乱数の初期化 10110 PRINT "左スティック:ピッチ/ロール" 10120 PRINT "L1/R1 :ヨー" 10130 PRINT "×□ :前後" 10140 PRINT "右スティック:上下左右" 10150 PRINT "△○ :カメラ距離" 10160 PRINT "R3 :初期位置へ戻る" 10170 BGCOL 0,64,128 ! 見易い背景にする 10180 S11=LOG(100)/(255- 4) ! モデルの前進速度を決める係数 10190 S12=LOG(100)/(255- 4) ! モデルの後退速度を決める係数 10200 S21=LOG( 80)/( 95- 0) ! モデルの上昇速度を決める係数 10210 S22=LOG( 80)/(255-160) ! モデルの下降速度を決める係数 10220 S31=LOG( 80)/( 95- 0) ! モデルの左移動速度を決める係数 10230 S32=LOG( 80)/(255-160) ! モデルの右移動速度を決める係数 10240 RT=1/50*PI/180 ! モデルの回転速度を決める係数 10250 DIST=100 ! カメラと注目モデルの距離 10260 MODSET 1,7,5 ! モデル1に戦闘機をセット 10270 MODDISP 1 ! モデル1を表示 10280 CALL BACK_OBJ ! 背景をセット 10290 MODJOIN 998,997 ! 回転量計算用の設定 10300 MODJOIN 999,998 ! 回転量計算用の設定 10310 ! 10320 !========================================== 10330 ! メインループ 10340 !========================================== 10350 DO 10360 !PAD入力チェック 10370 CALL PAD_INP(DX,DY,DZ,S1,S2,S3,DIST) 10380 !ジンバルロック回避回転計算 10390 CALL MOD_ROT(MX,MY,MZ,DX,DY,DZ) 10400 !前後上下左右移動(主観)計算 10410 CALL MOD_MOV(PX,PY,PZ,MX,MY,MZ,S1,S2,S3) 10420 !実際にモデルを回転、移動する 10430 FSYNC 1 !回転、移動の直前に入れたほうが動きが綺麗になる 10440 IF PAD(1,18)=1 THEN PX,PY,PZ,MX,MY,MZ=0 10450 MODPOS 1,PX,PY,PZ 10460 MODROT 1,MX,MY,MZ 10470 !カメラ制御 10480 CALL CAM(1,MX,MY,MZ,DIST) 10490 LOOP 10500 ! 10510 !========================================== 10520 ! モデルの回転角を求める 10530 ! 入力 : MX,MY,MZ - 回転前の回転角(rad) 10540 ! DX,DY,DZ - 回転量(rad) 10550 ! 出力 : MX,MY,MZ - 回転後の回転角(rad) 10560 !========================================== 10570 SUB MOD_ROT(MX,MY,MZ,DX,DY,DZ) 10580 MODROT 997,MX,MY,MZ+DZ 10590 MODROT 998,DX,0,0 10600 MODROT 999,0,DY,0 10610 GETWPOS X_,Y_,Z_,999,0,0,100 10620 MX=-ANGLE(SQR(X_*X_+Z_*Z_),Y_) 10630 IF X_<>0 OR Z_<>0 THEN MY=ANGLE(Z_,X_) 10640 MODROT 1000,MX,MY,0 10650 GETWPOS X__,Y__,Z__,999,0,100,0 10660 GETLPOS X_,Y_,Z_,1000,X__,Y__,Z__ 10670 IF X_<>0 OR Y_<>0 THEN MZ=-ANGLE(Y_,X_) 10680 END SUB 10690 ! 10700 !========================================== 10710 ! モデルの座標を求める 10720 ! 入力:PX,PY,PZ - 移動前の座標 10730 ! MX,MY,MZ - モデルの回転角(rad) 10740 ! S1,S2,S3 - 前後、上下、左右移動量 10750 ! 出力:PX,PY,PZ - 移動後の座標 10760 !========================================== 10770 SUB MOD_MOV(PX,PY,PZ,MX,MY,MZ,S1,S2,S3) 10780 MODROT 1000,MX,MY,MZ 10790 GETWPOS X_,Y_,Z_,1000,S3,S2,S1 10800 PX=PX+X_ 10810 PY=PY+Y_ 10820 PZ=PZ+Z_ 10830 END SUB 10840 ! 10850 !========================================== 10860 ! PAD入力 10870 ! 左スティックでモデルの上下(ピッチ)、 10880 ! 左右きりもみ(ロール) 10890 ! L1R1でモデルの左右水平回転(ヨー) 10900 ! ×□でモデルの前後移動 10910 ! 右スティックでモデルの上下平行移動 10920 ! および左右平行移動 10930 ! △○でカメラ距離調整 10940 !========================================== 10950 SUB PAD_INP(DX,DY,DZ,S1,S2,S3,R) 10960 DX=PAD(1,13) 10970 DX=-MIN(MAX(DX-160,0),DX-95)*RT/2 10980 DZ=PAD(1,14) 10990 DZ=-MIN(MAX(DZ-160,0),DZ-95)*RT 11000 DY=PAD(1,9)-PAD(1,10) 11010 DY=-MIN(MAX(DY-4,0),DY+4)*RT/4 11020 S1=-EXP(S11*MAX(PAD(1,7)-4,0))+EXP(S12*MAX(PAD(1,8)-4,0)) 11030 S2=-EXP(S21*MAX(95-PAD(1,15),0))+EXP(S22*MAX(PAD(1,15)-160,0)) 11040 S3= EXP(S31*MAX(95-PAD(1,16),0))-EXP(S32*MAX(PAD(1,16)-160,0)) 11050 R=MIN(2000,MAX(50,R+(PAD(1,5)>4)-(PAD(1,6)>4))) 11060 END SUB 11070 !========================================== 11080 ! カメラ制御 11090 ! 入力:M - 注目モデルの番号 11100 ! MX,MY,MZ - 注目モデルの回転角(rad) 11110 ! D - 注目モデルとカメラの距離 11120 !========================================== 11130 SUB CAM(M,MX,MY,MZ,D) 11140 GETWPOS CX,CY,CZ,M,0,-D/6,D 11150 CAMPOS 1,CX,CY,CZ 11160 CAMROT 1,MX,PI-MY,MZ 11170 END SUB 11180 ! 11190 !========================================== 11200 ! 背景の作成 11210 !========================================== 11220 SUB BACK_OBJ 11230 FOGCOL 0,64,128 11240 FOGSET 1000,30000 11250 FOR I=100 TO 500 11260 DO 11270 A=INT(RND*8)+1 11280 B=INT(RND*10)+1 11290 IF A<>4 OR B<>10 THEN EXIT DO 11300 LOOP 11310 MODSET I,1,B 11320 MODOPT I,10,1,1,1 11330 MODPOS I,INT(RND*80000)-40000,INT(RND*80000)-40000,INT(RND*80000)-40000 11340 MODDISP I 11350 NEXT I 11360 END SUB