今easy3dで両手でハンドガンを持ちマップの的を壊して回るゲームを作っているのですが
画面は手と銃が画面に表示されている一人称です
流れは図1です
図1 図2
両手つきハンドガンの表示......____________________......____________________
......↓......................|//////////////////|......|//////////////////|
マップ読み込み................|//////////////////|......|//////////////////|
......↓......................|//////////////////|......|//////////////////|
背景読み込み..................|//////////////////|......|//////////////////|
......↓......................|////////銃////////|......|////////////////銃|
keyで手・銃移動←←←←........|////////手////////|......|////////////////手|
......↓............↑........|__________________|......|__________________|
追跡カメラ..........↑................今.......................要望.........
......↓............↑......................................................
地面との当たり判定..↑......................................................
......→→→→→→→↑......................................................
いまはここまでできているんですが
問題がひとつありまして下にもスクリプトを載せますが
追尾カメラの仕様がいったん銃の向いている方向よりいくつか下がって
その座標をカメラに代入して後ろにカメラを持ってくるといううものなのでもちろん
表示は図2の左側のようになります
それを右のようにしたいんですが亀他の平行移動を使うとe3drotaney命令でオブジェクトを回転させたときに
うまくカメラが後ろに回りません
ほかにいいほうはないでしょうか
右上の図2参照
下のスクリプトは
今の状況です
ファイルがないので動きませんが少しでもわかりやすくなればと思いまして
#include "e3dhsp3.as"
;初期化
;screen 0,1000,700
e3dinit 0,-1,1,16,1,scid1
;キー認識用配列変数作成
dim key,256
dim keycnt,256
huremu=50
;音声ロード
oto1="足1.wav"
oto2="銃声.wav"
mmload oto2,2
e3dloadsound oto1,otono
;sigファイル場所
basyo=dir_cur
sigfail=basyo+"\\fps.sig"
;sigファイルロード
objx=30000
objy=0
objz=30000
e3dsigload sigfail,hsid1,,0.1
e3dsetpos hsid1,objx,objy,objz
;moaファイル場所と補正フレーム
moafail=basyo+"\\打つ.moa"
hosei=10
;moaファイルロード
e3dloadmoafile hsid1,moafail,hosei
//メタセコイアからマップ作成
;マップ
;map=basyo+"\\マップ.mqo"
;mapx=0
;mapy=0
;mapz=0
;マップ作成
;e3dloadmqofileasground map,1000,hsid2
;e3dsetpos hsid2,mapx,mapy,mapz
//bmpからマップ作成
picid1 = basyo + "\\地面.bmp" ;地面の座標情報
picid2 = basyo + "\\道.bmp" ;地面の道の情報
picid3 = basyo + "\\川.bmp" ;地面の川の情報
picid4 = basyo + "\\iro2.bmp" ;地面、道、川の模様を決める、BMPファイル
;地面作成用の値
posx = 0
posy = 0
posz = 0
mapsize=60000
mapdive=60
E3DLoadGroundBMP picid1,picid2,picid3,picid4,mapsize,mapsize,mapdive,mapdive,100,hsid2
E3DSetPos hsid2, posx0, posy0, posz0 ;地面表示位置を設定
//メタセコイア用
;壁
;kabe=basyo+"\\壁.mqo"
;壁作成
;e3dloadmqofileasmovablearea kabe,1000,hsid3
//bmp用
;壁
kabe=basyo+"\\道.bmp"
;壁作成
e3dsetmovablearea kabe,mapsize,mapsize,mapdive,mapdive,2000,hsid3
e3dsetpos hsid3,0,0,0
;背景
haikei=basyo+"\\19.jpg"
haikei2=basyo+"\\19.jpg"
;背景作成
e3dcreatebg scid1,haikei2,haikei,0,0,1
//手動
;カメラ位置
;cx=200
;cy=20
;cz=600
;カメラ位置変更
;e3dsetcamerapos cx,cy,cz
;カメラ向き
;cdxz=-30
;cdy=0
;カメラ向き変更
;e3dsetcameradeg cdxz,cdy
//自動取得
gosub*camera
;ライト位置
lightx=0
lighty=-10000
lightz=1
;ライトの色
lightr=255
lightg=255
lightb=255
;ライト作成
e3dcreatelight light1
e3dsetdirectionallight light1,lightx,lighty,lightz,lightr,lightg,lightb
;メインループ
*mein
huremu++
;視界に入っているか調べる
e3dchkinview scid1,hsid1
e3dchkinview scid1,hsid2
;イベント番号初期化
ibennto=0
; キー設定
e3dgetkeyboardstate key
e3dgetkeyboardcnt keycnt
;キー入力確かめ
if key.VK_ESCAPE=1 : end
if key.('W')=1 : e3dposforward hsid1,100 : gosub*saisei
if key.('S')=1 : e3dposforward,-100 : gosub*saisei
if key.('A')=1 : gosub*saisei
if key.('D')=1 : gosub*saisei
if keycnt.VK_LBUTTON=1&huragu=0 : ibennto=2 : huremu=0 : huragu=1
;当たり判定
gosub*当たり判定
gosub*当たり判定壁
gosub*camera
if huremu=10&huragu=1 : mmplay 2
if huremu=30 : huragu=0
;moa再生
e3dsetnewposebymoa hsid1,ibennto
;レンタリング準備
e3dbeginscene scid1
;レンタリング
e3drender scid1,hsid1,0
e3drender scid1,hsid2,0
;レンタリング終了
e3dendscene
;最終的に描画
e3dpresent scid1
await 1
goto*mein
;音声再生
*saisei
asioto++ ;asiotoが40に達するたびに音を鳴らす
if asioto\40=0 : e3dplaysound otono,0
; カメラ位置変更
*camera
;いったん今の銃の位置を保存
e3dgetpos hsid1,zyux,zyuy,zyuz
;① 20度位置を傾ける
e3drotatey hsid1,20
;② 向いている方向にー200戻す
e3dposforward hsid1, -200
;③ ①②の位置を保存
e3dgetpos hsid1, cx, cy, cz
;オブジェクトの位置をさっきの変数から取り出す
e3dsetpos hsid1, zyux , zyuy , zyuz
;オブジェクトの角度を戻す
e3drotatey hsid1,-20
;③の位置をカメラの位置として使う
e3dsetcamerapos cx , cy , cz
e3dsetcameratarget zyux,zyuy,zyuz,0,1,0
e3dcamerashiftup ;うまくいかなった
e3dcamerashiftdown ;うまくいかなった
e3dcamerashiftleft ; うまくいかなかった
e3dcamerashiftright ; うまくいかないかった
return
*当たり判定
e3dchkconfground hsid1,hsid2,1,1000,-1000,atari,zimennx,zimenny,zimennz,nx,ny,nz
e3dsetpos hsid1,zimennx,zimenny+300,zimennz
return
*当たり判定壁
e3dchkconfwall hsid1,hsid3,-10,atarikabe,zimennx1,zimenny1,zimennz1,nnx,nny,nnz
e3dsetpos hsid1,zimennx1,zimenny1,zimennz1
return
長々となりましたが皆さんのご返答待っています