説明するのが面倒なので作ってみました。
参考:
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