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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0629
名無産dxlib VGet取得方法13解決


名無産

リンク

2018/6/29(Fri) 12:15:54|NO.84660

dxライブラリにてVGetを使いたいのですが、どのように書いても38134...のような支離滅裂な
戻り値が出てしまいます。


#packopt name "Game" #packopt icon "data/game.ico" //DXlib読み込み #include "DxLib.as" #packopt hide 1 //Log出力 SetOutApplicationLogValidFlag FALSE // ウィンドウモードをOFF bgscr 0,ginfo_dispx,ginfo_dispy,0,0,0 ChangeWindowMode 0 // DxLibで描画するウィンドウをHSPのウィンドウに変更 SetUserWindow hwnd SetUserWindowMessageProcessDXLibFlag 0 //アンチエイジング SetFullSceneAntiAliasingMode anti , anti //描画精度 SetZBufferBitDepth accuracy // DxLibの初期化 DxLib_Init if stat=-1{dialog"dxlib初期化に失敗しました。",1,"tank flanker":end} //ロード //描画用意 SetUseZBuffer3D 1 SetWriteZBuffer3D 1 redraw 0 ;mouse -1 #packopt hide 0 //メイン描画 repeat getkey ect , 27 : if ect!0{end} tett = VGet( 0.0f , 20.0f , 0.0f ) ttaa = VGet( 0.0f , 0.0f , 0.0f ) ttbb = VGet( 0.0f , 20.0f , 0.0f ) paap = MGetRotVec2( ttaa , ttbb ) SetDrawScreen DX_SCREEN_BACK ClearDrawScreen 0 Positiont = ConvWorldPosToScreenPos(tett) DrawString 0,0 , str(Positiont)+"\n"+str(tett),getcolor(,,255) DrawString 300,0 , str(ttaa)+"\n"+str(ttaa)+"\n"+str(paap),getcolor(,255) ScreenFlip ProcessMessage await 1000./60. loop
書いている部分です。

間違っている部分、改善したほうがいい部分なんでもお願いします。



この記事に返信する


あらや

リンク

2018/6/29(Fri) 18:41:07|NO.84661

DxLib.asを確認していないので間違っているかもしれませんが
DXライブラリは基本的にfloat型を使用していたかと思います。

それに対してHSPはdouble型が基本なので
doubleとfloatの型変換を行なう必要があるのではないでしょうか。



名無産

リンク

2018/6/29(Fri) 19:58:15|NO.84663

ということは0.0fなどの部分は変数と認識されるのでしょうか…

あと、dxlib.asの最新版は2015/8/10のもので正しいですよね?



あらや

リンク

2018/6/29(Fri) 22:26:44|NO.84665

DxLib.asを確認しました。
#define global ctype VGet(%1,%2,%3) %1, %2, %3

VGetはマクロですね。 単に配列変数になってるだけのようです。
tett = VGet( 0.0f , 20.0f , 0.0f )

// 下記と同じ意味になる
ddim tett, 3
tett = 0.0, 20.0, 0.0

ConvWorldPosToScreenPosも使い方が少々違うようです。

// 戻り値が構造体です(VECTOR) // 第一引数に戻り値を返却します。パラメタは第二引数以降にずれます。 #func global ConvWorldPosToScreenPos "dx_ConvWorldPosToScreenPos" var,float,float,float
このようにasファイルで定義されているので


// 型変換用関数 #module // float型をdouble型へ #defcfunc todouble int p1 temp = 0.0; lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000); lpoke temp, 0, p1 << 29; return temp; // double型をfloat型へ #defcfunc tofloat double p1 temp = p1; return lpeek(temp) >> 29 & 7 | (p1 < 0) << 31 |lpeek(temp, 4) - (p1 ! 0) * 0x38000000 << 3; #global // 〜省略〜 SetDrawScreen DX_SCREEN_BACK ClearDrawScreen 0 dim Positiont, 3; // 戻り値用の配列(float型の数値が入る) ConvWorldPosToScreenPos Positiont, tofloat(tett(0)), tofloat(tett(1)), tofloat(tett(2)); ddim PositiontD, 3; // float型だと読めないので戻り値をdouble型に変換する repeat 3 PositiontD(cnt) = todouble(Positiont(cnt)); loop
このようにすると上手くいくかもしれません。



>dxlib.asの最新版は2015/8/10のもので正しいですよね?
https://hsp.moe/download/DxLib.as
このソースと同じものであれば、おそらくそれが最新かと思います。



名無産

リンク

2018/6/30(Sat) 11:07:49|NO.84675

モジュールまで…ありがとうございます!解決しました!



名無産

リンク

2018/6/30(Sat) 12:09:54|NO.84678

前言撤回です。
xyzすべて0.0ではうまくいったんですが、少しでもずれるととてつもない座標に飛びます。



あらや

リンク

2018/6/30(Sat) 13:50:54|NO.84679

よく考えたらカメラ位置や注視点の設定をしていないのでは?

SetCameraNearFar(近視距離・遠視距離の設定)
SetCameraPositionAndTarget_UpVecY(カメラ位置・注視点の設定)
SetCameraPositionAndTargetAndUpVec(カメラ位置・注視点・上方向の設定)

これらの関数を使用した上で
カメラの視界に入るような座標を指定しないと上手く変換できないようです。


ついでに、わざわざfloat型に変換しなくても
それぞれdouble型用の関数が用意されていたようです。

SetCameraNearFarD
SetCameraPositionAndTarget_UpVecYD
SetCameraPositionAndTargetAndUpVecD
ConvWorldPosToScreenPosD

全部末尾にDが入るだけですね。。。
変換モジュールは微妙に誤差があるので忘れてください。



名無産

リンク

2018/6/30(Sat) 15:22:18|NO.84680

すいません、double用関数使ってみたのですが、まためちゃくちゃな数が出てきてしまいました…

https://drive.google.com/open?id=1tIqxvfMCXUVPCSWDdMUzs1QSbSo3b4WT

押し付けがましいのですが、文全部載せます。main.hspの146行目、的の座標を2d変換して距離を
表示する部分です。



名無産

リンク

2018/6/30(Sat) 15:39:51|NO.84681

positiontをddimにするの忘れてました…



名無産

リンク

2018/6/30(Sat) 15:55:34|NO.84682

もうひとつ…戻り値が構造体の関数ってどのように取り出せばいいでしょうか



あらや

リンク

2018/6/30(Sat) 17:04:09|NO.84683

>positiontをddimにするの忘れてました…
ddimにしたら解決したという事でしょうか?
こちらで確認したところ、ちゃんと座標変換出来ているようですが
真後ろを向いた時に画面内に[TGT]の文字が入ってしまいますね。



>戻り値が構造体の関数ってどのように取り出せばいいでしょうか
DxLib.asファイルでそれぞれの関数を確認してみると
わかりやすいと思います。

ConvWorldPosToScreenPosを例にすると
公式の説明では

VECTOR ConvWorldPosToScreenPos( VECTOR WorldPos ) ;

となっていますが
ASファイルでは

// 戻り値が構造体です(VECTOR)
// 第一引数に戻り値を返却します。パラメタは第二引数以降にずれます。
#func global ConvWorldPosToScreenPos "dx_ConvWorldPosToScreenPos" var,float,float,float

このように第一引数が戻り値になるようにされているようです。
ほかの関数も戻り値が構造体の関数は同様になっています。



名無産

リンク

2018/6/30(Sat) 17:43:41|NO.84684

真後ろのもの等修正しました。
セミコロンつけてるとこに
MV1CollCheck_Line
という命令を用いていますが、それの戻り値が

 MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )に含まれるポリゴンと線分との当たり判定を行います。 ( この関数でモデルのポリゴンと線分との当たり判定を行う場合は対象となるフレーム( 若しくはモデル全体 )に対して事前に MV1SetupCollInfo を呼んで準備を行っておく必要があります、 また、MV1SetupCollInfo で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります )  戻り値である MV1_COLL_RESULT_POLY は当たり判定の結果が代入されている構造体で、以下のような内容になっています。 // コリジョン結果代入用ポリゴン struct MV1_COLL_RESULT_POLY { // どれかのポリゴンに当たったかどうか // ( 1:当たった 0:当たらなかった ) int HitFlag ; // 線分とポリゴンが交差した座標 VECTOR HitPosition ; // 当たったポリゴンが含まれるフレームの番号 int FrameIndex ; // 当たったポリゴンのフレーム内番号 int PolygonIndex ; // 当たったポリゴンが使用しているマテリアルの番号 int MaterialIndex ; // 当たったポリゴンを形成する三点の座標 VECTOR Position[ 3 ] ; // 当たったポリゴンの法線 VECTOR Normal ; } ;  注釈の通りですが、 どれかのポリゴンに当たったかどうかはメンバ変数 HitFlag が 1 かどうかで判断することができ、 線分とポリゴンが交差した座標は HitPosition に代入されます。  当たったポリゴンが含まれるメッシュを所有しているフレームの番号はメンバ変数 FrameIndex に、 当たったポリゴンが使用しているマテリアルの番号はメンバ変数 MaterialIndex に、 当たったポリゴンを形成する三頂点の座標はメンバ配列 Position に、 当たったポリゴンの法線はメンバ変数 Normal にそれぞれ代入されます。
とのことで…HitPoly.HitFlagなどのかたちで戻り値はどう取り出せばいいでしょうか。



あらや

リンク

2018/6/30(Sat) 18:58:09|NO.84685

MV1CollCheck_Lineはfloat型用の関数しかないみたいですね。
引数も戻り値もfloat型になると思うのでそこは注意してください。

こういう複数の型を使った構造体の場合、
必要なメモリ領域を持つ配列変数で受け取る形でやってみてください。

dim HitStruct, 19; // 戻り値を受け取る配列変数 MV1CollCheck_Line HitStruct// 以下省略 /* // 配列の内容 // どれかのポリゴンに当たったかどうか HitStruct( 0) = HitFlag // 線分とポリゴンが交差した座標 HitStruct( 1) = HitPosition.X HitStruct( 2) = HitPosition.Y HitStruct( 3) = HitPosition.Z // 当たったポリゴンが含まれるフレームの番号 HitStruct( 4) = FrameIndex // 当たったポリゴンのフレーム内番号 HitStruct( 5) = PolygonIndex // 当たったポリゴンが使用しているマテリアルの番号 HitStruct( 6) = MaterialIndex // 当たったポリゴンを形成する三点の座標 HitStruct( 7) = Position[0].X HitStruct( 8) = Position[0].Y HitStruct( 9) = Position[0].Z HitStruct(10) = Position[1].X HitStruct(11) = Position[1].Y HitStruct(12) = Position[1].Z HitStruct(13) = Position[2].X HitStruct(14) = Position[2].Y HitStruct(15) = Position[2].Z // 当たったポリゴンの法線 HitStruct(16) = Normal.X HitStruct(17) = Normal.Y HitStruct(18) = Normal.Z */
繰り返しになりますが
HitPosition、Position、NormalのVECTOR構造体はfloat型になると思います。
これらの座標や法線ベクトルを使用する場合は
いらない子だと思った先日の変換モジュールでdouble型に変換してください。



名無産

リンク

2018/6/30(Sat) 20:12:19|NO.84686

ありがとうございます。1週間ほど悩んでいたことがようやく解決しました!
真昼間からお目汚しすいません。



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