|
|
|
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
を追加して実行してみてください。
|
|
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] 命令の本来の仕様からして、表示しない、となっている。
こう考えればいいことになる。
|
|
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)とは、
カメラに映らない、カメラで捉えない、カメラは無視する、
ということで、結局、描画されない。
カメラの能力を限定して、描画の効率化を図っているわけですね。
|
|