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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0318
竹糸HGIMGで2D座標を3D座標に変換するには2解決


竹糸

リンク

2009/3/18(Wed) 03:14:06|NO.23968

また質問失礼します。
HSPから少し離れている気もするのですが、もし関係ないようでしたら削除しますのでお知らせください。

タイトル通り、2D座標を3D座標に変換したいのですがやり方がさっぱり分かりません。
現在ツールを作っていまして、マウスカーソルが平面のどこを指しているのかを取得したいのですが
どのように計算すればよいものやら検討がつきません…。

検索してみても3D座標を2D座標に変換するものばかりで、目的のサイトはいくつか見つけたのですが、
どれも関数1つでいきなり処理が進んでいて、HSPでは出来ない処理が多く参考にすることが出来ませんでした…

また、3D座標を2D座標に変換する関数の逆関数を求めようと頑張ってみたのですが、
式がとんでもないことになって計算できるようなものではありませんでした…

今日丸1日潰して何の進歩も無く、とても困っています…
ヒントだけでもいいですので、どうかご教授頂けたら幸いです。



この記事に返信する


いなえ

リンク

2009/3/18(Wed) 13:06:13|NO.23972

説明するのが面倒なので作ってみました。
参考:
http://d.hatena.ne.jp/setuna-kanata/20090122/1232632892


#include "hgimg3.as" #const PI 3.1415926 #const CAMERA_FOV PI/4 screen 0,320,240 hgini //注視点モードでカメラを設置 cammode CAM_MODE_LOOKAT setdir HGOBJ_CAMERA,0,5,0 setpos HGOBJ_CAMERA,20,-10,10 setefx HGOBJ_CAMERA,CAMERA_FOV,0.5,768.0 //マウスカーソルが指している平面上の位置をBOXオブジェクトで表示 setcolor 192,255,192 addbox boxModel,2.0,2.0 regobj box,boxModel //平面をPLATEオブジェクトで表示 setcolor 64,64,64 addplate plateModel,0,30,30 regobj plate,plateModel setpos plate,-5,10,-5 addang plate,-PI/4 //平面上の点face_pと平面に垂直なベクトルface_nで平面を指定 //face_nは単位ベクトルである必要はない fvset face_p,-5.0,10.0,-5.0 fvset face_n,0.0,-1.0,1.0 *main /* ここから */ //カメラ位置取得 selcpos objgetfv camera //カメラ注視点取得 selcint objgetfv look //視線ベクトル計算 fvset view,camera.0,camera.1,camera.2 fvsub view,look.0,look.1,look.2 //スクリーン上X方向ベクトル scr_x.0=view.2 scr_x.1=0.0 scr_x.2=-view.0 //スクリーン上Y方向ベクトル scr_y.0=view.1*scr_x.2 - view.2*scr_x.1 scr_y.1=view.2*scr_x.0 - view.0*scr_x.2 scr_y.2=view.0*scr_x.1 - view.1*scr_x.0 //スクリーンからワールド座標へのサイズ合わせ view_norm=sqrt(view.0*view.0+view.1*view.1+view.2*view.2) fvunit scr_y scr_y_scale=view_norm*tan(CAMERA_FOV/2) fvmul scr_y,scr_y_scale,scr_y_scale,scr_y_scale fvunit scr_x scr_x_scale=view_norm*tan(CAMERA_FOV/2)*ginfo_winx/ginfo_winy fvmul scr_x,scr_x_scale,scr_x_scale,scr_x_scale //マウス位置をワールド座標に変換 scr_x_scale=double(mousex*2-ginfo_winx)/ginfo_winx fvmul scr_x,scr_x_scale,scr_x_scale,scr_x_scale scr_y_scale=double(mousey*2-ginfo_winy)/ginfo_winy fvmul scr_y,scr_y_scale,scr_y_scale,scr_y_scale fvset scr,look.0,look.1,look.2 fvadd scr,scr_x.0,scr_x.1,scr_x.2 fvadd scr,scr_y.0,scr_y.1,scr_y.2 //直線[カメラ→マウス位置]と平面の交点を求める fvsub scr,camera.0,camera.1,camera.2 fvset inner_tmp1,face_p.0,face_p.1,face_p.2 fvsub inner_tmp1,camera.0,camera.1,camera.2 fvinner inner_tmp1,face_n.0,face_n.1,face_n.2 fvset inner_tmp2,scr.0,scr.1,scr.2 fvinner inner_tmp2,face_n.0,face_n.1,face_n.2 tmp=inner_tmp1/inner_tmp2 fvmul scr,tmp,tmp,tmp fvadd scr,camera.0,camera.1,camera.2 /* ここまで */ //BOXオブジェクトの位置=マウスカーソルが指している平面上の位置 setpos box,scr.0,scr.1,scr.2 hgdraw hgsync 20 goto *main



竹糸

リンク

2009/3/18(Wed) 21:51:20|NO.23982

わざわざ長いサンプルまで書いていただき本当にありがとうございます…!
頑張って解読して理解を深めたいと思います。

ご回答ありがとうございました!



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