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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0506
アキアキノヒロロ[gpcnvaxis] 3D座標の変換、何か変。9解決


アキアキノヒロロ

リンク

2022/5/6(Fri) 23:50:10|NO.96292

[gpcnvaxis] 使って、モデルの位置にその名前を表示させて見ましたが、
カメラの反対側の位置をも誤変換表示してしまいます。
何故でしょうか。
これの対策が見つかりません。
https://twitter.com/akiakinohiroro/status/1522491837852041216

以下のテストスクリプトで、X,Y,Z値の変化も見られます。
よろしくお願いします。

#include "hgimg4.as" chdir dir_exe+"\\sample\\hgimg4" title "HGIMG4 Test" gpreset setcls CLSMODE_SOLID, $909090 // setcls CLSMODE_SOLID, gpload id_model.0,"res/tamane" ; モデル読み込み setscale id_model.0, 0.01,0.01,0.01 setpos id_model.0, -7,0,1 ; モデル位置を設定 addangr id_model.0, 0,64,0 gpact id_model.0 ; 全クリップを再生 name.0="tamane" gpload id_model.1,"res/tamane2" ; モデル読み込み setscale id_model.1, 0.01,0.01,0.01 setpos id_model.1, 7,0,1 ; モデル位置を設定 addangr id_model.1, 0,-64,0 gpact id_model.1 ; 全クリップを再生 name.1="tamane2" gpload id_model.2,"res/duck" ; モデル読み込み setscale id_model.2, 1,1,1 setpos id_model.2, 1,0,7 ; モデル位置を設定 name.2="duck" gpload id_model.3,"res/sphaceship" ; モデル読み込み setscale id_model.3, 0.5,0.5,0.5 setpos id_model.3, 1,0,-7 ; モデル位置を設定 name.3="sphaceship" gptexmat id_tex, "textile.png" ; テクスチャマテリアル作成 gpfloor id_floor, 30,30, , id_tex ; 床ノードを追加 setpos GPOBJ_CAMERA, 0,2.0,0 ; カメラ位置を設定 addangr GPOBJ_CAMERA, 0,64,0 repeat stick key,15 if key&128 : end redraw 0 ; 描画開始 ; カーソルキーでカメラ位置を動かす if key&1 : addang GPOBJ_CAMERA, 0, 0.015, 0 ; (←) if key&4 : addang GPOBJ_CAMERA, 0, -0.015, 0 ; (→) if key&2+8 { ; (↑)(↓) getang GPOBJ_CAMERA, xr, yr, zr fvset fvr, xr, yr, zr // mes "向き   : " + rad2deg(fvr(0)) + ", " + rad2deg(fvr(1)) + ", " + rad2deg(fvr(2)) if key&2 : fvset fv_vel, 0, 0, -0.1 if key&8 : fvset fv_vel, 0, 0, 0.1 fvmul fvr, -1,-1,-1 ;fvdir のバグ対策 fvdir fvr, fv_vel(0), fv_vel(1), fv_vel(2) // mes "進行方向 : " + fvr(0) + ", " + fvr(1) + ", " + fvr(2) ; 現在の向きに合わせた進行方向ベクトルを現在値に加算 selpos GPOBJ_CAMERAl objaddfv fvr } gpdraw ; シーンの描画 repeat 4 getpos id_model.cnt,x,y,z gpcnvaxis var_x.cnt,var_y.cnt,var_z.cnt,x,y,z, 0 ; 3D座標を 2D座標へ変換 pos var_x.cnt,var_y.cnt if cnt=0 : color 0,255,0 if cnt=1 : color 255,0,0 if cnt=2 : color 255,255,0 if cnt=3 : color 0,255,255 font "",25,1 mes name.cnt loop color 255,255,255 pos 8,8//:mes "HGIMG4 sample" mes name.0+" = "+var_x.0+" / "+var_y.0+" / "+var_z.0 mes name.1+" = "+var_x.1+" / "+var_y.1+" / "+var_z.1 mes name.2+" = "+var_x.2+" / "+var_y.2+" / "+var_z.2 mes name.3+" = "+var_x.3+" / "+var_y.3+" / "+var_z.3 redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 loop



この記事に返信する


法貴優雅

リンク

2022/5/6(Fri) 23:58:41|NO.96293

確かZ値が1.00を超えている時は画面外だっと思うので
gpcnvaxis var_x.cnt,var_y.cnt,var_z.cnt,x,y,z, 0の行の下に

if (var_z.cnt >= 1.00f):continue
を追加して実行してみてください。



youdai

リンク

2022/5/6(Fri) 23:59:45|NO.96294

対象のZ値がカメラの位置座標から裏側になった時、そのmesを表示しない(描画しない)という条件分岐処理を入れてみてはどうでしょうか?
現状のmesが裏側になっても表示される理由は上記のような仕組みがスクリプト内に入っていないからかもしれません。



法貴優雅

リンク

2022/5/7(Sat) 00:01:43|NO.96295

あ、よく考えたら、これ独自研究なので、これが正しいことなのかは
実際わかっていません。参考までにということで。



アキアキノヒロロ

リンク

2022/5/7(Sat) 00:17:40|NO.96296

youdai さん、カメラの位置座標での条件分岐は、カメラの向き(角度)も関係して、
どうにも上手く作れず、諦めていたところ、法貴優雅 さんの御教示で解決いたしました。

法貴優雅 さん、有難うございます。
> Z値が1.00を超えている時は画面外
知りませんでした。
Z値の変化を見ても、その法則のようなものが掴めなくて、
手立てが分かりませんでした。



アキアキノヒロロ

リンク

2022/5/7(Sat) 00:38:22|NO.96297

> Z値が1.00を超えている時は画面外
何故なのか、知りたくて、ググってみました。

『Zバッファ法(デプスバッファ法)』の「Zバッファ法詳細」
https://yttm-work.jp/gmpg/gmpg_0019.html#head_line_03

> 0.0を最小値、1.0を最大値として扱います。
とありました。また、

「まず、Zバッファの情報はレンダーバッファ(バックバッファ)と同様に
基本的には毎フレーム初期化します。
これは前回のフレームの深度情報が今回のフレームで影響が出ないようするためです。
Zバッファの各要素の初期値には最大値である1.0を設定することが多いです。」
とのことです。

なので、
> Z値が1.00を超えている時は画面外
ということなのだ、と理解しました。



アキアキノヒロロ

リンク

2022/5/7(Sat) 01:17:25|NO.96298

追記です。

> if (var_z.cnt < 1.00f) & (var_z.cnt >= 0.00f)
であっても、
> (var_x.cnt,var_y.cnt)
の座標が画面外なら、当然表示はない。

> if (var_z.cnt < 0.00f)
は、「カメラ位置=0」なのだから、「ー」なら、カメラの後ろであり、
この [gpcnvaxis] 命令の本来の仕様からして、表示しない、となっている。

こう考えればいいことになる。



GENKI

リンク

2022/5/7(Sat) 01:24:10|NO.96299

> Z値が1.00を超えている時は画面外

そんな仕様があったのか。どこに書いてるんだ…。(´・ω・`)
ちょっと試してみました。


#include "hgimg4.as" gpreset setpos GPOBJ_CAMERA, 0,0,5 gplookat GPOBJ_CAMERA, 0,0,0 ; ウィンドウサイズ mes "" + ginfo_winx + ", " + ginfo_winy ; ファークリップZ値より遠い場所 gpcnvaxis x,y,z, 0,0,5.0-1768.0, 0 mes "ファークリップZ値より遠い場所 " + x + ", " + y + ", " + z ; ファークリップZ値 gpcnvaxis x,y,z, 0,0,5.0-768.0, 0 mes "ファークリップZ値 " + x + ", " + y + ", " + z ; カメラの正面 gpcnvaxis x,y,z, 0,0,0, 0 mes "カメラの正面 " + x + ", " + y + ", " + z ; ニアクリップZ値 gpcnvaxis x,y,z, 0,0,5.0-0.5, 0 mes "ニアクリップZ値 " + x + ", " + y + ", " + z ; ニアクリップZ値より近い場所 gpcnvaxis x,y,z, 0,0,5.0-0.5+0.1, 0 mes "ニアクリップZ値より近い場所 " + x + ", " + y + ", " + z ; カメラ位置 gpcnvaxis x,y,z, 0,0,5, 0 mes "カメラ位置 " + x + ", " + y + ", " + z ; カメラの後 gpcnvaxis x,y,z, 0,0,10, 0 mes "カメラの後 " + x + ", " + y + ", " + z ; カメラの後 gpcnvaxis x,y,z, 0,0,5+768, 0 mes "カメラのもっと後 " + x + ", " + y + ", " + z ; カメラの後 gpcnvaxis x,y,z, 0,0,16777216, 0 mes "カメラのずっと後ろ " + x + ", " + y + ", " + z redraw 1
ニアクリップ〜ファークリップの間だとZバッファ値は、0.0〜1.0になるようです。それ以外だとマイナスまたは1より大きな値になりますね。
Z値が1を超えている場合は、使わないようにすればだいたい大丈夫そう。Zバッファ値ってこういう値だったのか…。

どうしてもファークリップより遠い部分を使いたい場合は、内積でマイナスならカメラの後ろという感じで判定する必要があります。



法貴優雅

リンク

2022/5/7(Sat) 08:08:01|NO.96300

皆さんのおかげで、私も理解することができました(ぉ



アキアキノヒロロ

リンク

2022/5/7(Sat) 10:29:10|NO.96302

追記の追記です。

Zバッファ値は、ニアクリップを0.0、ファークリップを1.0とする、ということですから、
カメラに近い方の位置(ニアクリップ=0.0)より手前(<0.0)と、
遠い方の位置(ファークリップ=1.0)より向こう側(>1.0)とは、
カメラに映らない、カメラで捉えない、カメラは無視する、
ということで、結局、描画されない。
カメラの能力を限定して、描画の効率化を図っているわけですね。



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