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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0927
アキアキノヒロロ「pronama3d/pronama3.hsp」鏡面反射について6解決


アキアキノヒロロ

リンク

2019/9/27(Fri) 11:05:26|NO.88520

 「hgimg4」の「gppbind」に続いてのことになりますが、
「hgimg4」用のサンプル「pronama3d/pronama3.hsp」鏡面反射についてです。

 鏡面反射といいながら、このサンプルでは、その姿が後ろ側に映るかたちに
なっているので、普通に手前側に反射するように変えられないかと、色々やって
見ていますが、どうにもうまく行きません。
 どなたか、ヒントだけでも、頂ければと思います。



この記事に返信する


K-s

リンク

2019/9/28(Sat) 14:09:09|NO.88529

106行目

gplookat id_camera, 0,0,0 ; カメラから指定した座標を見る

setpos id_camera, camx, -camy, camz gplookat id_camera, 0,0,0 ; カメラから指定した座標を見る addang id_camera, 0, 0, atan(-camz, camx) - M_PI / 2
にするとスケールは変ですが角度はいい感じになりました。



アキアキノヒロロ

リンク

2019/9/29(Sun) 12:11:59|NO.88537

 K-sさん、ありがとうございます。

 もとのサンプルに使われている命令もよく理解できていない状態で、まあ、色々数値を
変えてみれば、その意味も分かってくるだろうと、試していました。
 
 ここの [gpcnvaxis] は、カメラのY座標を反転させた、3D座標変換値を [id_camera] に
セットするためのものと思いますが、なぜその変換値に [ 0.8 ] を掛けるのか、その意味
がわかりません。 下からのカメラで撮った様子を求めるのであれば、そのままの変換値を
セットすればいいはず。 こう考えると、K-sさんが、[gpcnvaxis] せずに、Y座標を反転
させただけで、
 setpos id_camera, camx, -camy, camz
するのは、当然です。 ただ、このままだと、その姿がなぜか後ろ側に回った状態なので、
 addang id_camera, 0, 0, M_PI
と、カメラをZ軸で回転させる。 これでいいような気がするものの、カメラを横方向に
移動すると、上体が床の高さに浮き上がってしまう。 これを手直しするのが、K-sさんの
 addang id_camera, 0, 0, atan(-camz, camx) - M_PI / 2
と、考えていいのでしょうか。 Z軸回転が、 atan(-camz, camx) - M_PI / 2 になるのが
分かりませんが。



アキアキノヒロロ

リンク

2019/9/30(Mon) 07:38:44|NO.88538

 もとのサンプルや K-sさんのもので、また数値を色々変えてやってみていたところ、
  gpfloor id_floor, 8, 8, -1,id_texmat
の大きさを変えると、例えば、[ 8*2, 8*2,] にすると、その実行結果の反射映像も、
2倍になってしまいます。 [ 8/3, 8/3,] にすれば、1/3。 [id_floor] 自体の
大きさだけでなく、反射映像まで変わってしまい、[ 8 ] に固定していないと、うまく
いきません。これも、その訳がよく分かりません。 [id_floor] だけ大きさを変える
には、どうしたらいいのでしょう。



K-s

リンク

2019/9/30(Mon) 12:51:57|NO.88539

gpcnvaxisは僕もちょっとよく分からないです。ヘルプにはモード2までしか説明ないのにサンプルには3が設定されてますし…
	addang id_camera, 0, 0, atan(-camz, camx) - M_PI / 2

はモデルからカメラへの角度が欲しかったのでこうなってます。反射して目に飛び込んでくるならカメラ方向に傾くのが自然かと思ったので。 gpfloorはバッファid_shadowに描画したものをテクスチャ(マテリアル)にしているので、大きさが変われば反射映像の大きさも変わってしまいます。
	rt = sqrt(camx * camx + camy * camy + camz * camz) / 8 ; 8はid_floorの大きさ(大きさを変えてたらここも変える)
	bs = 0.025 ; モデルのスケール
	setscale id_model, bs * rt, bs * rt, bs * rt ; カメラの距離に応じてスケール変える
このスクリプトを前回のスクリプトの直後に追加して、
	setscale id_model, bs, bs, bs ; スケール戻す
を gsel id_render の上あたりに追加してください。
スケールも前回よりましになったと思います。(まだカメラの角度が浅いときが少し変ですが)
これで id_floor の大きさを変えても反射の大きさも追従すると思います。ただしテクスチャ(バッファ)の大きさによって解像度が異なります。

無理やりそれっぽく見せるための処理なので実際ちゃんとした方法は分かりません。
あと反射の力技としてモデルのスケールを反転させて床のしたにも配置する方法もありますね。ただスケール反転させると何故かモデルのメッシュが所々欠ける…



K-s

リンク

2019/9/30(Mon) 13:18:35|NO.88540

大事なこと忘れていました。
原点(0, 0, 0)にモデルがあること前提です。それ以外の場所だとズレます…



アキアキノヒロロ

リンク

2019/9/30(Mon) 14:45:42|NO.88541

 K-sさん、色々やって頂いてありがとうございます。

 モデル座標が固定でないとダメで、せっかくの3Dが足踏みやダンスどまり。
移動させられないとなると、ゲームへの応用がとても限定されそうで、残念です。
 もう少し応用の利く方法があると、使ってみたくなるのですが。

 このサンプルは、鏡面反射のそれというよりも、次の部分、
buffer id_shadow,sdx,sdy,screen_offscreen

gpscrmat id_texmat, id_shadow, GPOBJ_MATOPT_NOLIGHT|GPOBJ_MATOPT_NOMIPMAP|GPOBJ_MATOPT_MIRROR
gpfloor id_floor, 8, 8, -1,id_texmat
バッファ画面に描画したものを主画面にある 板ノード(床ノード含む)に、ある加工を
施して写し出すためのサンプルのように思います。

 解決という訳ではありませんが、一応ここで一区切りといたします。



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