|
2009/10/15(Thu) 03:21:22|NO.28300
解決済みのスレにすいません。
過去に同じようなことをしたので、少し長いですがソースを貼っておきます。
といっても、今みるとさっぱりな計算なんですが・・・;
もっと計算量の少ない式があるかもしれません。
#include "d3m.hsp"
camx=-600.0 : camy=1800.0 : camz=1800.0 ;カメラ位置
gazx=0.0 : gazy=0.0 : gazz=0.0 ;注視点
fov=1.0 ;視野角
repeat
stick key
if key&128 : end ; 終了
d3setcam camx,camy,camz, gazx,gazy,gazz ,fov
;カメラの向きのベクトル
focx=gazx-camx
focy=gazy-camy
focz=gazz-camz
;カメラの横方向のベクトル
tmpx=focx
tmpy=focy
;長さを1にする
temp=d3dist(focx,focy,focz)
focx/=temp
focy/=temp
focz/=temp
temp=d3dist(tmpx,tmpy,0)
tmpx/=temp
tmpy/=temp
;カメラの縦方向のベクトル
tatex= focz * tmpx
tatey= focz * tmpy
tatez=-focx * tmpx - focy * tmpy
mx=-double(d3wincx-mousex)
my=-double(d3wincy-mousey)
mz=double(ginfo_winy)/fov
;マウスカーソルのある方向のベクトルを出す
tgtx= tmpy*mx + tatex*my + focx*mz
tgty=-tmpx*mx + tatey*my + focy*mz
tgtz= tatez*my + focz*mz
;高度0地点のX,Y座標を出す
if tgtz<0 {
temp=camz/tgtz
zx=-tgtx*temp+camx
zy=-tgty*temp+camy
}
;zx,zyが高さ0地点のX,Y座標
redraw 0
color 255,255,255 : boxf
;グリッド
color 100, 100, 100
for c,-1000,1000+100,100
d3line c,-1000,0,c,1000,0
d3line -1000,c,0,1000,c,0
next
;表示
color 255,0,0
d3line zx,-1000,0 ,zx,1000,0
color 0,255,0
d3line -1000,zy,0 ,1000,zy,0
color 0,0,255
d3circle zx, zy, 0 ,100 ,0
redraw 1
await 20
loop

| |