HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
1231
3deasy3dでオブジェクトを端に表示させる方法4解決


3d

リンク

2009/12/31(Thu) 19:08:28|NO.29647

今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

長々となりましたが皆さんのご返答待っています



この記事に返信する


ORZ

リンク

2009/12/31(Thu) 19:47:56|NO.29650

少しでもわかりやすくと思うなら黙ってpreタグをつかいんさい。
それはさておいて、平行移動でいいはずだが、どうしてもだめだというなら

①銃を後ろに下げる
②銃を左に90度回転させる
③銃を前進させ、座標を取得してカメラをそこに置く
④逆の手順で銃を元の位置に戻す

としてやればなんとかなる。左右にシュレッダーのように引き裂かれた様に描写するには
スプライトにレンダリングしてやって動かす必要がある



GENKI

リンク

2009/12/31(Thu) 20:03:24|NO.29652

プログラムや図を載せるときは、この掲示板の「使い方」の「投稿時の注意」の11で説明している方法でpreタグを指定してやるとレイアウトが崩れませんよ。


> うまくカメラが後ろに回りません

どのような結果になってしまうのでしょうか?


ちなみに

E3DCameraShiftUp E3DCameraShiftLeft E3DCameraShiftRight E3DCameraShiftUp
これらの命令は全体の絶対座標を基準にしてx,y,z方向に移動しているだけのようです。
カメラの向きや注視点の位置の影響をうけません。
キャラクターに追従するカメラの位置調整には向かない命令です。



3d

リンク

2010/1/1(Fri) 01:42:35|NO.29658

>ORZさん
すみません

を入れ忘れてしみました
ご指摘ありがとうございます
それと、やり方のご説明ありがとうございました
そんなやり方があったんですね、思いつきませんでした
とてもわかりやすかったです

>GENKIさん
>プログラムや図を載せるときは、この掲示板の「使い方」の「投稿時の注意」の11で説明している方法でpreタグを指定してやるとレイアウトが崩れませんよ。
そうだったんですか、ありがとうございます正直しっていなくて恥ずかしいです
左に平行移動など書いていましたけど、絶対座標が基礎なんてorz
でも、理解できないまま終わることがなくてよかったです
>どのような結果になってしまうのでしょうか?
えっと、一応たとえますと
向いている方向はそのままで円を書いて回っているものを
カメラが後ろで見ているというような感じです

●=物体             ↑ ■=カメラ            ● ↑=向いている方向    ↑/     \↑              ●       ●                \  ↑  /                   ●                                    ■
  ・・・とまぁ・・こんな感じです表現下手ですみません    



3d

リンク

2010/1/1(Fri) 01:47:38|NO.29659

>すみません

ここのスペースには
<pre>
</pre>
が入ります
直入力してしまいました

>を入れ忘れてしみました



ONION software Copyright 1997-2023(c) All rights reserved.