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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1010
質問者AHgimg3でワールド座標(3D)→スクリーン座標(2D)変換3解決


質問者A

リンク

2008/10/10(Fri) 16:31:12|NO.20032

Hgimg3で、3D空間上のとある頂点が、実際の2D画面上の何処に位置しているかを
調べたいのですが、実装方法がよく分かりません。

(おおもとのDirectXには変換関数が用意されているようですが、Hgimg3にはこれに
類する命令が見当たりません・・・。やはり自力で算出するしかないのでしょうか?)



この記事に返信する


あり

リンク

2008/10/10(Fri) 23:10:59|NO.20033

hgimg3には今のところ、3D座標を2D座標に変換する命令は無いみたい(?)ですので
平行投影などを使って自分で算出するしか無いように思います。
(厳密に精度を求めなくて良いならそれらしい動きを作る事は可能でしょうが・・・)

もし、hgimg3に固執するのでないのならば、座標変換命令のあるEasy3Dを
使ってみるのも、一つの手ではないかと思います。



ヒカリ

リンク

2008/10/12(Sun) 20:57:49|NO.20082

制作中のゲームの一部を持ってきてみました。
計算するならベクトル演算は必須だと思います。
解像度640*480です。

cx = 10.0 // 対象のX座標
cy = 0.0 // Y座標
cz = 5.0 // Z座標
getpos HGOBJ_CAMERA, x, y, z
fvset fv, x, y, z
fvface fv, cx, cy, cz
cammode CAM_MODE_NORMAL
getang HGOBJ_CAMERA, cx, cy, cz
cammode CAM_MODE_LOOKAT
x = int(640.0 * sin(cy + fv(1))) + 320
y = int(640.0 * sin(cx + fv(0))) + 240

カメラが注視モードの場合、cammodeで取得する角度を修正します。
Easy3Dと併用するのが不安な場合などにどうぞ。



質問者A

リンク

2008/10/14(Tue) 00:19:52|NO.20129

ありさん、ヒカリさん、回答ありがとうございます。
hgimg3には、お手軽変換命令は無いとの事でしたので、私の方でも腹をくくって
座標変換にとり組み、なんとか目的の挙動を達成することが出来ました。
ヒカリさんのコードほど洗練されてはおりませんが、一応、成果として貼っておきます。

#include "hgimg3.as"

scx=800:scy=600 ;画面のサイズ
screen 0,scx,scy,0
hgini

ddim ka,3
ddim pks,2,3

x=5.0 :y=3.0 :z=-10.0 ;物体のx,y,z
cax=0.0 : cay=0.0 : caz=30.0 ;カメラの初期x,y,z

scx=scx/2 :scy=scy/2
r=double(tan(3.141592*22.5/180.0))
setcolor 255,0,0
addplate plt1,0,3.0,3.0
regobj obj1,plt1
setpos obj1,x, y, z

*main
stick k,127
if k&128 : goto *owari ; [ESC]で終了

; キー操作でカメラ回転(スペースキー押しでカメラ移動)
if k&16 {
if k&2 :cay=cay-0.1
if k&8 :cay=cay+0.1
if k&4 :cax=cax+0.1
if k&1 :cax=cax-0.1
} else {
if k&1 : addang HGOBJ_CAMERA,0.0, -0.01, 0.0
if k&4 : addang HGOBJ_CAMERA,0.0, 0.01, 0.0
if k&2 : addang HGOBJ_CAMERA,0.01, 0.0, 0.0
if k&8 : addang HGOBJ_CAMERA,-0.01, 0.0, 0.0
}
setpos HGOBJ_CAMERA,cax,cay,caz
fvset ks,x,y,z
getang HGOBJ_CAMERA,ka.0,ka.1,ka.2
fvsub ks,cax,cay,caz
pks.0.0=ks.0*cos(ka.2)-ks.1*sin(ka.2)
pks.0.1=ks.0*sin(ka.2)+ks.1*cos(ka.2)
pks.1.0=pks.0.0*cos(ka.1)-ks.2*sin(ka.1)
pks.0.2=pks.0.0*sin(ka.1)+ks.2*cos(ka.1)
pks.1.1=pks.0.1*cos(ka.0)-pks.0.2*sin(ka.0)
pks.1.2=pks.0.1*sin(ka.0)+pks.0.2*cos(ka.0)
px=double(pks.1.0/(pks.1.2*r))
py=double(pks.1.1/(pks.1.2*r))
ppx=scx-px*scy
ppy=scy-py*scy

hgdraw :hgsync 1

color 255,255,255
boxf ppx-2,ppy-2,ppx+2,ppy+2
await 10

goto *main

*owari
end



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