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


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1105
Morohgimg3での ウィンドウ表示について12解決


Moro

リンク

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



この記事に返信する


buhio

リンク

2023/11/8(Wed) 12:56:07|NO.100451

こんにちわ
HGIMG3は、ものすごく久しぶりなので、的外れかもしれません

拝見すると、テキストメッセージ自体は、描画用テクスチャに描かれ、
そのメッセージの背景画像がウィンドウというオブジェクトなんだと推察します。

テキストは、常に2D空間に描画されるので、歪むことは無いと思います。
一方、ウィンドウは3D空間上にあるので、カメラが回転したら、ウィンドウもそれに合わせて位置と向きを変更してあげる必要があると思います。
⇒cz-240というのは、カメラのZ座標-240という意味だと思いますが、回転が考慮されていないのでは

確か、objchildという親子設定があった思うので、カメラを親とした位置と向きをダミーオブジェクトを挟むとかで、ウィンドウに親子付けすれば連動して動くんじゃないかと想像する。

具体的なスクリプトは、私はHGIMG4しかわからんのでごめんなさい。

※これから習得するならHGIMG4だよぉ(勧誘してみる)



Moro

リンク

2023/11/8(Wed) 18:36:40|NO.100458

ありがとございます!
早速Hgimg4試してみましたが、起動すらできませんでした。
どうやらスペック的なものを満たしていなかったみたいで、創作で使えるPCだと3が限界でした。



buhio

リンク

2023/11/8(Wed) 20:36:52|NO.100461

 ふむ。標準のサンプルが動かないなら、仕方ないですが、サンプルのHGIMG4が動くなら、開発環境の設定が足りてないかな。

 相当古いPCでも結構いけると思うから、諦めずに色々試してね



Moro

リンク

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



buhio

リンク

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



buhio

リンク

2023/11/9(Thu) 18:55:49|NO.100481

あ、そうだ、、

カメラの動きに対してボックスの動きがワンテンポ遅れるのは、「2D描画」の中でボックスの位置を設定してしまっているためで、
きっちり動かすには、hgdrawする前にボックスの位置設定を持ってくる必要があります。

だから3dのボックスの位置設定と、2dの文字列の描画は、別々に処理して別のタイミングで処理するようにしないとダメですね。
自分で書いてて、伝わってるか疑問ですが(ごめん



Moro

リンク

2023/11/10(Fri) 01:28:34|NO.100485

hgcnvaxis x,y,z,0,0,-360,2
この部分が重要だったのですね。
ー360 この部分はZ軸で、今回のカメラの左右に前後移動を加えたら
当然さらなる処理が必要と分かり何度も試しましたが、ここがどうしてもうまくいきませんでした。


当初の予定通りの挙動になりましたので解決ということにします。
buhioさん。ありがとうございました。



buhio

リンク

2023/11/10(Fri) 01:55:09|NO.100486

//ボックスの位置
hgcnvaxis x,y,z,0,0,-360,2 ;

setpos box,-x,y,z ;←これにカメラ座標足したら移動してもいけるんちゃうかな?



Moro

リンク

2023/11/10(Fri) 11:12:30|NO.100494

いろいろ試しましたがやっぱり駄目でした。



buhio

リンク

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



Moro

リンク

2023/11/10(Fri) 18:23:06|NO.100505

ありがとうございます。
直感で組める2Dとは違って、やはり3Dは自分には難し過ぎました。



Makoto

リンク

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



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100434への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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