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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1215
アキアキノヒロロHGIMG4のライトの設定13解決


アキアキノヒロロ

リンク

2020/12/15(Tue) 00:48:41|NO.91929

「HGIMG4プログラミングガイド」の「18.ライトの設定」に

デフォルトのライトだけでなく、シーン内にライトを複数設定して切り替えることも可能です。
gpnull id_alight ; ヌルノードを生成する
gplight id_alight, GPOBJ_LGTOPT_NORMAL ; ライトとして登録する
gpuselight id_alight ; デフォルトのライトに設定

とありますが、この命令をプログラムのどの位置にどう記述すれば、切り替え可能になるのでしょうか。
「sample/hgimg4/tamane1.hsp」に組込んで、いろいろやってみていますが、思うようになりません。
メインループ の前に [gpnull] [gplight] [setcolor] で、色違いのライトを2つ用意し、どちらかを
[gpuselight] でデフォルトにしておき、メインループ の中のキー操作でライトの切り替えをすればと
思ったのですが、うまくいきません。
一旦メインループ の外に出て、[gpreset] で初期化して、メインループ の前の全てをやり直し、
そこで切り替えようとするライトを[gpuselight] でデフォルトにして、メインループ に戻すような
ことをしないと、どうにも切り替えられません。これでは、プログラムを初めからやり直しているだけで、
途中での切り替えになりません。そもそも、[gpuselight] でデフォルトにしておいても、その色の
ライトにもなっていないようにも思えます。
よろしくお願いします。



この記事に返信する


youdai

リンク

2020/12/15(Tue) 15:09:47|NO.91930

HGIMG4においてライトの切り替えという概念は、
「ノードに対して、どのライトを反映させるか」というものだったと思います。

例えば、

gpuselight light1 ;なんらかのオブジェクト生成処理1 gpuselight light2 ;なんらかのオブジェクト生成処理2

という順序でスクリプトを組んだ場合、「なんらかのオブジェクト生成処理1」はlight1のライトの影響を受けて、
「なんらかのオブジェクト生成処理2」はlight2のライトの影響を受けます。

これは自分もよく迷った概念でした。
例えば、失敗例をあえて示すと以下のようになります。


gpuselight light1 ;なんらかのオブジェクト生成処理1 ;なんらかのオブジェクト生成処理2 gpuselight light2 ;なんらかのリピート処理

これだとlight2のライト設定を一見反映しそうですが、これはオブジェクトの生成する位置がgpuselight light2の前なので
light2の設定はどのオブジェクト(ノード)にも反映されません。



アキアキノヒロロ

リンク

2020/12/18(Fri) 06:06:05|NO.91945

youdai さん、毎回、有益な情報をお寄せいただき、ありがとうございます。

ということは、使おうとするライトを [gpuselight] するのは、反映させようとするオブジェクト生成前でなければならない、こういう理解でよろしいでしょうか。
だとすると、すでにあるオブジェクトに対して、メインループ内でライトを切り替えようとしても、そのオブジェクトは、前からのライトの影響下から抜け出せず、そのオブジェクトを削除して、新たに生成し直さなければならないことになります。これでは、ライトの切り替えとは言えないでしょう。

なぜ、こういうことになったのか、なんとなく思うところがあります。
それは、「17.カメラの設定」をそのまま「18.ライトの設定」に適用したのではないか、ということです。
		gpnull id_camera			; ヌルノードを生成する
gpcamera id_camera, 45, 1.5, 0.5, 768 ; カメラとして設定する gpusecamera id_camera ; 使用するカメラを選択する setpos id_camera, 0,20,20 ; カメラ位置を設定する
[gpusecamera] はあまり必要性を感じなかったので、使ったことがありませんでしたが、試してみると、しっかり機能しています。
ついでながら分かったことですが、プログラムに [setpos GPOBJ_CAMERA] を記述しなくとも、[GPOBJ_CAMERA] は既定で組み込まれているようで、
		gpnull GPOBJ_CAMERA			; ヌルノードを生成する
gpcamera GPOBJ_CAMERA, 45, 1.5, 0.5, 768 ; カメラとして設定する gpusecamera GPOBJ_CAMERA ; 使用するカメラを選択する setpos GPOBJ_CAMERA, 0,0,100 ; カメラ位置を設定する
となっているようです。もちろん、上記の[GPOBJ_CAMERA] では、エラーになりますが、 [setpos GPOBJ_CAMERA] を記述しなかった場合と、上記を[id_camera] に書き換えた場合を比べると、同等です。
[gpusecamera] は、プログラムのどこに記述しても、求めた通りに機能します。メインループ内で切り替えた場合、[redraw 0] の前に置いたほうが、切り替えの瞬間がスムースなのは当然ですが。
ところが、「カメラの設定」のこの感覚がそのまま「ライトの設定」に持ち込めるものではなかった、ということなのではないか。
「カメラの設定」は、その位置のその都度の確定から、全てのオブジェクトとの位置関係が確定するが、「ライトの設定」の場合は、各々のノードに対してすでに反映させ確定させてセットしたものを描画するため、メインループ内では「カメラの設定」のようには切り替えができない訳です。
なぜ、機能しないものを機能するように、「HGIMG4プログラミングガイド」で解説してしまったのか、

(現在のバージョンでは、スポットライト、ポイントライトはサポートしていません)

これでしょう。スポットライト、ポイントライトをサポートするためには、ノードに対する反映の仕方を制御しなければなりません。これができて初めて、ライトの切り替えも機能するはずです。これがまだ未サポートである段階で、切り替えだけならばできるはず、と判断してしまったためではないでしょうか。



アキアキノヒロロ

リンク

2020/12/20(Sun) 08:27:28|NO.91962

E3D では、

[E3DCreateLight] [E3DSetDirectionalLight] [E3DDestroyLight]

の命令で光源操作ができていましたが、HSP そのものでは、そのような命令は備わっていなかったでしょうか。HGIMG4 の

[gpnull id_camera] [gpcamera id_camera] [gpusecamera id_camera] [setpos id_camera]

では、同じようなことができません。E3D のサポート終了後として、HGIMG4 でこれができないのは残念です。



リンク

2020/12/23(Wed) 12:47:42|NO.91990

登場から8年でまだこんなところと。正直ガタガタな印象受けるんですけど
絶望的なんでしょうか?



アキアキノヒロロ

リンク

2020/12/24(Thu) 07:06:34|NO.91996

NO.91962 の次の箇所

「HGIMG4 の

 [gpnull id_camera] [gpcamera id_camera] [gpusecamera id_camera] [setpos id_camera]

 では、同じようなことができません。」

は、
 
[gpnull id_alight] [gplight id_alight] [gpuselight id_alight]

の間違いでした。訂正して、お詫び致します。



おにたま(管理人)

リンク

2021/1/7(Thu) 00:32:14|NO.92027

>アキアキノヒロロ さん

ライトの仕様については、youdaiさんが書かれている内容で問題ありません。
gplightでライトを生成→gpuselightでデフォルトのライトとして登録→モデルを生成
という流れになります。生成するモデルごとにライトを切り替えるという意味で、設定の切り替えと言っていました。
現状では、1度モデルとして生成したライトの設定は変更できません。
これだと色々大変というのもわかりますので、次回のβ版ではライトの設定を更新できる命令が追加される予定です。
また、ポイントライト、スポットライトなども含めて複数のライトを反映させる機能も盛り込んでいますので、もう少しお待ちください。



アキアキノヒロロ

リンク

2021/1/7(Thu) 16:05:48|NO.92030

おにたまさん、ご準備されているとのこと、大変ありがたく、感謝いたします。


こう言いながら、心苦しいのですが、

「生成するモデルごとにライトを切り替えるという意味で、設定の切り替えと言っていました。」

というのは、ちょっと無理があるように思います。
「HGIMG4プログラミングガイド」では、

「デフォルトのライトだけでなく、シーン内にライトを複数設定して切り替えることも可能です。」

とあります。
そして、これは「カメラの設定」の解説

「デフォルトのカメラだけでなく、シーン内にカメラを複数設定して切り替えることも可能です。」

のすぐ後です。こうなると、どうしても「カメラの設定」と同様の方法で、「ライトの設定」ができるのだ、との意味に取るのが自然というか、当然です。

カメラは、「gpnull / gpcamera / gpusecamera / (setpos)」

ライトは、「gpnull / gplight / gpuselight」

という命令のセットのかたちも同じなので、なおさらです。

初心者同然の者が、偉そうなことを言って、申し訳ありません。
次回のβ版、とても楽しみにしております。感謝申し上げます。



Drip

リンク

2021/1/8(Fri) 01:05:51|NO.92034

アキアキノヒロロさん

横から失礼します。以前からHgimg4のライトについて問題を提起していらっしゃいますが、
この予めライトを生成して任意のライトをオブジェクトに対して割り当てるという仕様は
順序こそ変わったもののHgimg3の頃から続いているもので、
リファレンスガイドの説明自体にも然程違和感を感じません。

//このようにいくつライトを生成しても複数のライトをオブジェクトに対応させることはできません。 //ライトを選択してシーンのライトをまとめて切り替えるような機能もありません。 //Hgimg3の頃からそれぞれのライトは独立しており影響を与えるオブジェクトも固定です。 #include "hgimg3.as" hgini addbox mdl,8,8 //箱モデル登録 repeat 3 //箱とライトをそれぞれ3つ生成する reglight light(cnt) //ライトを生成 regobj box(cnt),mdl //箱を生成 objlight box(cnt),light(cnt),4 //箱にライトのアンビエントを割り当てる setpos box(cnt),(cnt-1)*15,0,0 //箱の座標を設定 setang box(cnt),0.01*rnd(628),0.01*rnd(628) //箱に角度を設定 loop repeat repeat 3 //3つの異なるライトの色を変えながら回す addang box(cnt),0.001 //箱回転 addang light(cnt),0.1,0.1 //ライト回転 if time\200>100 & time\100/30=cnt:{ //一定間隔でライトのアンビエントを消す //(消しても他のオブジェクトは影響を受けない) setdir light(cnt),0,0,0 }else{ //アンビエント色を割り当てる //(対象オブジェクト以外色の影響は受けない) c=0.1*time+cnt,0.1*time+cnt+1.5,0.1*time+cnt+3 //色を確定 setdir light(cnt),sin(c)*127+128,sin(c(1))*127+128,sin(c(2))*127+128 } loop time++ hgdraw hgsync 16 loop
アキアキノヒロロさんの仰るような別の解釈も可能と言えば可能だなとは思いますが、
仕様通りには動作しており、取り立ててあげつらう問題とも思えません。
Hgimg3ではオブジェクトに対応させるライトの再割り当てが可能でしたので、
そのような命令もあれば大変便利ですが、
ライトの生成と割り当てを工夫することで対応することも検討されてはいかがでしょうか。

//ちなみにこちらは上のスクリプトのHgimg4の場合の書き方です。 //※resフォルダの存在する場所で実行しないと何も表示されないかエラーします #include "hgimg4.as" setreq SYSREQ_CLSCOLOR,0 repeat 3 //箱とライトをそれぞれ3つ生成する gpnull light(cnt):gplight light(cnt):gpuselight light(cnt) //ライトを生成 gpbox box(cnt),15 //現在のライト設定で箱を生成 setpos box(cnt),(cnt-1)*30,0,0 //箱の座標を設定 setang box(cnt),0.01*rnd(628),0.01*rnd(628) //箱に角度を設定 loop repeat redraw 0 repeat 3 //3つの異なるライトの色を変えながら回す addang box(cnt),0.001 //箱回転 addang light(cnt),0.1,0.1 //ライト回転 if time\200>100 & time\100/30=cnt:{ //一定間隔でライトのアンビエントを消す //(消しても他のオブジェクトは影響を受けない) setdir light(cnt),0,0,0 }else{ //アンビエント色を割り当てる //(対象オブジェクト以外色の影響は受けない) c=0.1*time+cnt,0.1*time+cnt+1.5,0.1*time+cnt+3 //色を確定 setdir light(cnt),sin(c)*0.5+0.5,sin(c(1))*0.5+0.5,sin(c(2))*0.5+0.5 } loop time++ gpdraw redraw 1 await 16 loop



アキアキノヒロロ

リンク

2021/1/8(Fri) 12:05:54|NO.92035

Dripさん、有難うございます。自分の理解力不足がよく解りました。

私は、HSPを一時休眠していて、「Hgimg3」の時を経ずして、「E3D」から「Hgimg4」へ来てしまったものです。
それで、知らず知らずのうちに、「E3D」のライトの仕様を「Hgimg4」に当てはめて求めていたようです。
今では、その「E3D」もうろ覚えになってしまっていますが。

失礼ながら、Dripさんのものを色々書き換えて、「gpplate / gpfloor」に対しても試してみました。
Dripさんの仰る通り、しっかり動作していました。
これが、3Dモデルデータ(.gpbファイル)にも適用されたら素晴らしいな、と思いましたが、これはなかなか難しいことなのでしょうか。
「E3D」では、確か3Dモデル(.sigファイル?)にも適用されたように記憶していますが、「E3D」環境をなくしてしまったので、確認できません。

「取り立ててあげつらう問題とも思えません。」とのお言葉、自分の思い込みに、一撃をいただきました。
有難うございました。



アキアキノヒロロ

リンク

2021/1/8(Fri) 12:17:13|NO.92036

解決とし、一応の一区切りといたします。

最後に希望を一つ。
出来れば、Dripさんのようなベテランの方たちに、もっと「Hgimg4」について、語って頂きたいです。



アキアキノヒロロ

リンク

2021/1/8(Fri) 17:54:20|NO.92039

追記.)
また余計なことと言われそうですが、「gpplate / gpfloor」に対して試みたものを載せさせて頂きたいと思います。
「sample/hgimg4」にいれてやって見てください。

#include "hgimg4.as" randomize setcls CLSMODE_SOLID, $eeffff ;================================================== // ライトを生成する gpnull light_A gplight light_A gpuselight light_A // アンビエントカラーのランダム部分 plus_r=0.01*rnd(51) : plus_g=0.01*rnd(51) : plus_b=0.01*rnd(51) // アンビエントカラーを確定 rgb=0 : c = 0.01*rgb+plus_r, 0.01*rgb+plus_g, 0.01*rgb+plus_b setdir light_A, c(0), c(1), c(2) ;================================================== gpfloor id_floor, 10, 10, $00ffff // 床ノードを追加 gpfloor id_floorA, 2.0, 2.0, $ffff00 // 床ノードを追加 setpos id_floorA, 0.0, 2.0, -2.0 setangr id_floorA, -64, -64, 0 // 床に角度を設定 ;================================================== gptexmat id_tex, "res/ball64.png" // 板ノードを追加 gpplate id_plate, 4.0, 4.0, , id_tex setpos id_plate, 0.0, 2.0, -2.0 ;================================================== gpbox box_A, 0.6, 0x00ff00 // 箱を生成 setpos box_A, -1.5, 0.3, 0.0 setangr box_A, 0, rnd(256), 0 // 箱に角度を設定 ;================================================== gpload id_model,"res/tamane2" // モデル読み込み setscale id_model, 0.008,0.008,0.008 ;================================================== setpos GPOBJ_CAMERA, 0,2,8 // カメラ位置を設定 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *main_loop stick key,15 redraw 0 ;================================================== // スペースキーで アンビエントカラーのランダム部分変更 if key&16 : plus_r=0.01*rnd(51) : plus_g=0.01*rnd(51) : plus_b=0.01*rnd(51) // 上下キーで アンビエントカラーの可変部分変更操作 if key&2 { ; (↑)キー rgb++ : if rgb>50 : rgb=50 } if key&8 { ; (↓)キー rgb-- : if rgb<0 : rgb=0 } // アンビエントカラー確定 c= 0.01*rgb+plus_r, 0.01*rgb+plus_g, 0.01*rgb+plus_b setdir light_A, c(0), c(1), c(2) ;================================================== addangr id_plate, 1, 0, 0 // id_plateを回転 addangr id_floorA, -1, 0, 0 // id_floorAを回転 addangr box_A, 0, 1, 0 // box_Aを回転 ;================================================== // タッチでカメラ位置を動かす if dragmd { // ドラッグ中 getkey a,1 if a=1 { dx=0.05*(mousex-dragx)+cx dy=0.05*(mousey-dragy)+cy setpos GPOBJ_CAMERA, dx,dy,cz } else { dragmd=0 } } else { // ドラッグなし getkey a,1 if a { dragx=mousex : dragy=mousey getpos GPOBJ_CAMERA, cx,cy,cz dragmd=1 } } gplookat GPOBJ_CAMERA, 0, 1, 0 // カメラから指定した座標を見る ;================================================== gpdraw color 0,0,0 pos 8, 8 : mes "HGIMG4 sample" pos 8, 50 : mes " r = "+c(0)+" / g = "+c(1)+" / b = "+c(2) redraw 1 await 16 goto *main_loop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓



名無し

リンク

2021/1/11(Mon) 03:20:41|NO.92042

HGIMG4を使ったコンテスト作品を実行したらエラーがでました
もっとちゃんとしてください



アキアキノヒロロ

リンク

2021/1/11(Mon) 08:36:33|NO.92043

名無しさん、おっしゃっている意味がよくわからないのですが。

私 アキアキノヒロロのコンテスト作品のことでしょうか。
でしたら、お詫び致します。テストプレイでエラーを発見解決できなかった私に責任がありますから。
(どうしても解決できなかった場合は、その旨を注記するなど)

それとも、「HGIMG4」の開発者様に対してのコメントでしょうか。
でしたら、「HGIMG4」のコンテスト作品の作者各自が本来持つべきはずの責任を全て開発者様に負わせることになります。
「HGIMG4」で出来ること出来ないことをわきまえて、その中で各自が創意工夫して作品を作るのであって、
「もっとちゃんとしてください」というのは、どう考えてもおかしいです。
開発者様に対する要望でしたら、その真意が伝わる言葉を使うべきだと思います。



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