|
|
|
2023/11/5(Sun) 12:51:02|NO.100434
昨日は別の質問をしましたが、直ぐに自己解決しましたのでスレッドは削除しました。
もし書き込みの途中の方がいらしたらすみません。
今回の質問は、hgimg3をインクルードして、3D上でメッセージウインドウを表示した時、左右で角度(視点)を
変えた場合、ウインドウが下に下がってしまうのですが、どのような処理をすれば
よいのでしょうか? よろしくお願いいたします。
(ウインドウの半透明処理に拘らなければ、2Dの画像表示で問題ないのですが)
#include "hgimg3.as"
screen 0,640,480,0,160,240
cls
hgini ;初期化
texmake 256,128 ;メッセージ用テクスチャ作成 statにテクスチャIDが入る
mest = stat ;テクスチャIDを変数へ
rot = 0.0
texcls mest,0 ;メッセージテクスチャを初期化
font "MS ゴシック",22
gsel 0
cammode CAM_MODE_NORMAL
cz=580
selcpos :objset3 0,-100,cz ;カメラの位置設定
selcang :objgetfv an2 ;リセット用カメラ角度取得
;地面 視点変更の確認の為に表示
texload "tex.bmp"
addplate id,0,320,480,0,0,320,480,stat
regobj tb,id
selang tb
setang tb,-1.6,0.0,0.0 ;オブジェクトの回転
;ウィンドウ メッセージウインドウ
texload "window.bmp"
texid=stat
addplate wd,0,680,160,0,0,0,0,texid
*main;
stick key,255
selcang:objgetfv an ;MOCのカメラ角度設定(宣言) ;今のMOC角度情報を取得
if key&1 :an(1)+=0.02 ;オブジェクトの角度加算
if key&4 :an(1)-=0.02 ;オブジェクトの角度加算
selcang:objsetfv an ;今のカメラMOC角度情報
if key=32:goto *message
hgdraw ;描画
hgsync 10
goto *main
*message
mxz=128
regobj mwd,wd,OBJ_XFRONT
setpos mwd,0.0,0,cz-240
texcls mest,0 ;メッセージテクスチャを初期化
color 255,255,255
texmes "おはようございます",mest,0,64
hgdraw
pos mxz+mx,320:gmode 2,256,128:hgrotate mest,0,0,0
hgsync 10
stop
goto *message
| |
|
2023/11/8(Wed) 12:56:07|NO.100451
こんにちわ
HGIMG3は、ものすごく久しぶりなので、的外れかもしれません
拝見すると、テキストメッセージ自体は、描画用テクスチャに描かれ、
そのメッセージの背景画像がウィンドウというオブジェクトなんだと推察します。
テキストは、常に2D空間に描画されるので、歪むことは無いと思います。
一方、ウィンドウは3D空間上にあるので、カメラが回転したら、ウィンドウもそれに合わせて位置と向きを変更してあげる必要があると思います。
⇒cz-240というのは、カメラのZ座標-240という意味だと思いますが、回転が考慮されていないのでは
確か、objchildという親子設定があった思うので、カメラを親とした位置と向きをダミーオブジェクトを挟むとかで、ウィンドウに親子付けすれば連動して動くんじゃないかと想像する。
具体的なスクリプトは、私はHGIMG4しかわからんのでごめんなさい。
※これから習得するならHGIMG4だよぉ(勧誘してみる)
|
|
2023/11/8(Wed) 18:36:40|NO.100458
ありがとございます!
早速Hgimg4試してみましたが、起動すらできませんでした。
どうやらスペック的なものを満たしていなかったみたいで、創作で使えるPCだと3が限界でした。
|
|
2023/11/8(Wed) 20:36:52|NO.100461
ふむ。標準のサンプルが動かないなら、仕方ないですが、サンプルのHGIMG4が動くなら、開発環境の設定が足りてないかな。
相当古いPCでも結構いけると思うから、諦めずに色々試してね
|
|
2023/11/9(Thu) 16:45:14|NO.100479
いくらやってもダメでした。
オブジェクトの親子で試して、カメラとオブジェクトの角度が揃っても
ウィンドウが下に下がるという、同じ結果になってしまいました。
どなたかこのスクリプトの修正問わず、ご提示していただけるとありがたいです。
どうかよろしくお願いいたします
#include "hgimg3.as"
screen 0,800,600,0,160,240
cls
dim an,5
hgini ;初期化
texmake 256,128 ;メッセージ用テクスチャ作成 statにテクスチャIDが入る
mest = stat ;テクスチャIDを変数へ
rot = 0.0
texcls mest,0 ;メッセージテクスチャを初期化
font "MS ゴシック",22
gsel 0
cammode CAM_MODE_NORMAL
cx=0.0:cy=-100.0:cz=0.0
selcpos :objset3 cx,cy,cz ;カメラの位置設定
selcang :objsetfv an ;リセット用カメラ角度取得
;地面
texload "tex.bmp"
addplate id,0,320,480,0,0,320,480,stat
texid=stat
regobj tb,id
setpos tb,0,0,-480
setang tb,-1.6,0.0,0.0 ;オブジェクトの回転
;box
cx2=cx:cy2=cy+50:cz2=cz-80
addbox id2,100,100
;ウィンドウ
texload "window.bmp"
texid=stat
addplate wd,0,800,190,0,0,0,0,texid
objchild box,mwd
*main;
color 0,0,0:boxf 0,0,0,0
stick key,255
selcang:objgetfv an ;今のカメラMOC角度情報
if key&1 :an(1)+=0.02 ;オブジェクトの角度加算
if key&4 :an(1)-=0.02 ;オブジェクトの角度加算
selcang:objsetfv an ;今のカメラMOC角度情報
selang box:objsetfv an
if key=32:goto *message
hgdraw ;描画
hgsync 10
;await 30
goto *main
*message
mxz=128
regobj box,id2,OBJ_XFRONT
setpos box,cx2,cy2,cz2
setang box:objsetfv an
;カメラの位置設定
texcls mest,0 ;メッセージテクスチャを初期化
color 255,255,255
texmes "おはようございます",mest,0,64
hgdraw
pos mxz+mx,320:gmode 2,256,128:hgrotate mest,0,0,0
hgsync 10
stop
goto *message
| |
|
2023/11/9(Thu) 18:46:20|NO.100480
いじってみました。完璧じゃないと思います。
ゲーム系のループとかは、結構、型があるので、それに慣れていく必要があるかなと思いました。
基本的にメインループをずっとぐるぐる回っているという書き方で、stopとかはしない。
ツール系はいいんですけどね。
#include "hgimg3.as"
screen 0,800,600,0,160,240
cls
dim an,5
hgini ;初期化
texmake 256,128 ;メッセージ用テクスチャ作成 statにテクスチャIDが入る
mest = stat ;テクスチャIDを変数へ
rot = 0.0
texcls mest,0 ;メッセージテクスチャを初期化
font "MS ゴシック",22
gsel 0
cammode CAM_MODE_NORMAL
cx=0.0:cy=-100.0:cz=0.0
selcpos :objset3 cx,cy,cz ;カメラの位置設定
selcang :objsetfv an ;リセット用カメラ角度取得
;地面
texload "tex.bmp"
addplate id,0,320,480,0,0,320,480,stat
texid=stat
regobj tb,id
setpos tb,0,0,-480
setang tb,-1.6,0.0,0.0 ;オブジェクトの回転
;box
cx2=cx:cy2=cy+50:cz2=cz-80
addbox id2,100,100
regobj box,id2,OBJ_XFRONT
setpos box,0,-500,-480
;ウィンドウ
texload "window.bmp"
texid=stat
addplate wd,0,800,190,0,0,0,0,texid
;objchild box,mwd
*main;
color 0,0,0:boxf 0,0,0,0
stick key,1+4
selcang:objgetfv an ;今のカメラMOC角度情報
if key&1 :an(1)+=0.02 ;オブジェクトの角度加算
if key&4 :an(1)-=0.02 ;オブジェクトの角度加算
selcang:objsetfv an ;今のカメラMOC角度情報
;selang box:objsetfv an
if key=32{
if msg_ON=1{
msg_ON=0
}else{
msg_ON=1
}
}
;======================================
;3D描画
hgdraw
;======================================
;2D描画
gosub *message
;======================================
;wait
hgsync 10
;await 30
goto *main
*message
if msg_ON=1{
mxz=128
;regobj box,id2,OBJ_XFRONT
;setpos box,cx2,cy2,cz2
;setang box:objsetfv an
;カメラの位置設定
//ボックスの位置
hgcnvaxis x,y,z,0,0,-360,2
setpos box,-x,y,z
texcls mest,0 ;メッセージテクスチャを初期化
color 255,255,255
texmes "おはようございます",mest,0,64
;hgdraw
pos mxz+mx,320:gmode 2,256,128:hgrotate mest,0,0,0
;hgsync 10
}else{
setpos box,0,-500,-480
}
return
;stop
;goto *message
| |
|
2023/11/9(Thu) 18:55:49|NO.100481
あ、そうだ、、
カメラの動きに対してボックスの動きがワンテンポ遅れるのは、「2D描画」の中でボックスの位置を設定してしまっているためで、
きっちり動かすには、hgdrawする前にボックスの位置設定を持ってくる必要があります。
だから3dのボックスの位置設定と、2dの文字列の描画は、別々に処理して別のタイミングで処理するようにしないとダメですね。
自分で書いてて、伝わってるか疑問ですが(ごめん
|
|
2023/11/10(Fri) 01:28:34|NO.100485
hgcnvaxis x,y,z,0,0,-360,2
この部分が重要だったのですね。
ー360 この部分はZ軸で、今回のカメラの左右に前後移動を加えたら
当然さらなる処理が必要と分かり何度も試しましたが、ここがどうしてもうまくいきませんでした。
当初の予定通りの挙動になりましたので解決ということにします。
buhioさん。ありがとうございました。
|
|
2023/11/10(Fri) 01:55:09|NO.100486
//ボックスの位置
hgcnvaxis x,y,z,0,0,-360,2 ;
setpos box,-x,y,z ;←これにカメラ座標足したら移動してもいけるんちゃうかな?
|
|
2023/11/10(Fri) 11:12:30|NO.100494
いろいろ試しましたがやっぱり駄目でした。
|
|
2023/11/10(Fri) 12:30:32|NO.100496
ある程度汎用性が出るようにfvdirを使う形を紹介します。
(もっといろんな良い方法があると思いますが)
3D空間で、ローカル位置や向いている方向は、常にベクトルを意識した計算を行う必要があると思います。
ワタシも苦労しましたが、操れるようになるととても楽しいので、是非頑張ってください。
#include "hgimg3.as"
screen 0,800,600,0,160,240
cls
dim an,5
hgini ;初期化
texmake 256,128 ;メッセージ用テクスチャ作成 statにテクスチャIDが入る
mest = stat ;テクスチャIDを変数へ
rot = 0.0
texcls mest,0 ;メッセージテクスチャを初期化
font "MS ゴシック",22
gsel 0
cammode CAM_MODE_NORMAL
cx=0.0:cy=-100.0:cz=0.0
selcpos :objset3 cx,cy,cz ;カメラの位置設定
selcang :objsetfv an ;リセット用カメラ角度取得
;地面
texload "tex.bmp"
addplate id,0,320,480,0,0,320,480,stat
texid=stat
regobj tb,id
setpos tb,0,0,-480
setang tb,-1.6,0.0,0.0 ;オブジェクトの回転
;box
cx2=cx:cy2=cy+50:cz2=cz-80
addbox id2,100,100
regobj box,id2,OBJ_XFRONT
setpos box,0,-500,-480 ;一旦、見えない位置へ配置
;ウィンドウ
texload "window.bmp"
texid=stat
addplate wd,0,800,190,0,0,0,0,texid
*main;
color 0,0,0:boxf 0,0,0,0
stick key,1+4+2+8
selcang:objgetfv an ;今のカメラMOC角度情報
if key&1 :an(1)+=0.02 ;オブジェクトの角度加算
if key&4 :an(1)-=0.02 ;オブジェクトの角度加算
selcang:objsetfv an ;今のカメラMOC角度情報
px=0:py=0:pz=0 ;数値の初期化
if key&2 :pz=-1 ;↑は、奥 に進むのでpzは-1
if key&8 :pz= 1 ;↓は、手前に進むのでpzは 1
getang HGOBJ_CAMERA,ax,ay,az ;自分(今回はカメラ)の角度を取得
fvset fv, -ax,-ay,-az ;自分が向いている方向を基準にした向かいたい位置(ローカル位置:0,0,-1)をベクトルにセット
fvdir fv, px,py,pz ;ローカル位置を自分の向いている方向に回転させた位置を計算して位置ベクトルにする
addpos HGOBJ_CAMERA,fv(0),fv(1),fv(2) ;自分の位置に加算⇒向いている方向を基準にローカル位置方向へ移動
gosub *boxpos ;boxの位置設定へ(hgdrawより前に処理)
if key=32{
if msg_ON=1{
msg_ON=0
}else{
msg_ON=1
}
}
;======================================
;3D描画
hgdraw
;======================================
;2D描画
gosub *message
;======================================
;wait
hgsync 10
goto *main
*boxpos
if msg_ON=1{
//ボックスの位置(カメラから見たローカル位置)
px=0:py=0:pz=-360 ;子のローカル位置を決める
fvset fv, -ax,-ay,-az ;親が向いている方向を基準にした向かいたい位置(ローカル位置:0,0,-360)
fvdir fv, px,py,pz ;ローカル位置を親の向いている方向に回転させた位置を計算
getpos HGOBJ_CAMERA,cx,cy,cz ;親の位置を取得
setpos box,fv(0)+cx,fv(1)+xy,fv(2)+cz ;子(box)の位置を親の位置とローカル位置の合計に移動
;※向きは、XFrontで常にカメラを向く
}else{
setpos box,0,-500,-480 ;見えない位置へ配置
}
return
*message
if msg_ON=1{
mxz=128
texcls mest,0 ;メッセージテクスチャを初期化
color 255,255,255
texmes "おはようございます",mest,0,64
pos mxz+mx,320:gmode 2,256,128:hgrotate mest,0,0,0
}
return
| |
|
2023/11/10(Fri) 18:23:06|NO.100505
ありがとうございます。
直感で組める2Dとは違って、やはり3Dは自分には難し過ぎました。
|
|
2023/11/10(Fri) 22:41:12|NO.100506
横から失礼します。
純粋にメッセージの背景として表示するだけならば
2Dスプライトの方が簡単ではないでしょうか。
描画位置はカメラ位置にかかわらず画面上の座標になります。
PLATEや3Dモデルでという事でしたらbuhioさんの言われる通り
カメラからの相対位置と角度を計算する必要がありますね。
#include "hgimg3.as"
screen 0 , 800 , 600
chdir dir_exe + "/sample/hgimg3" // hgimg3のサンプルフォルダへ
hgini
texmake 256,128 // メッセージ
mest = stat
texcls mest,0
font "MS ゴシック",20
color 255,255,255
texmes "動いているのはカメラです",mest,0,0
texload "chrome.bmp" // メッセージウインドウ
addspr mdl_window , 0 , 0 , 0 , 127 , 127 , stat // 2Dスプライトで作成
regobj obj_window , mdl_window
setpos obj_window , 0 , 200 , 0 // 座標
setscale obj_window , 5 , 1 , 1 // スケール
setefx obj_window , 127 // 半透明に
addxfile mdl_gnd , "sb_bg1.x" // 地面
regobj obj_gnd , mdl_gnd
setpos obj_gnd , 0 , 100 , 0
cam_ang = 0 // カメラ回転用
*main
cam_ang += 1 // 角度+1
fvset fv , 0 , deg2rad(cam_ang) , 0 // 原点を中心に
fvdir fv , 0 , 0 , 200 // 半径200で回転
setpos HGOBJ_CAMERA , fv(0) , fv(1) , fv(2) // カメラの座標
setang HGOBJ_CAMERA , deg2rad(-20) , deg2rad(-cam_ang) , 0 // カメラの角度
hgdraw
color 255,0,0:gmode 2,256,128 // メッセージ表示
pos 400 , 550
hgrotate mest,0,0,0
hgsync 33
getkey esc_key , 27 // ESCで終了
if esc_key { end }
goto *main
| |
|