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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0520
SHINYA3D透視変換5解決


SHINYA

リンク

2006/5/20(Sat) 19:22:06|NO.800

 z=0 平面に、3Dオブジェクトを透視変換して表示したいのですが
うまくいきません。

 「サンプル」:Y軸に対してオブジェクトを回転させる
;------------------------------
#module #deffunc lineto int p1,int p2 x = ginfo_cx + p1 y = ginfo_cy - p2 line ginfo_cx, ginfo_cy, x, y pos x,y return #global ;------------------------------ ; ;「デカルト座標を用いる」 ;(図) ;y z ;↑/ ;└→x ;------------------------------ ;ポリゴンデータ x , y , z a.0 = 100,100,0 a.3 = 100,-100,0 a.6 = 0,-100,0 a.9 = -200,0,0 a.12 = 0,100,0 a.15 = 100,-100,-100 a.18 = 100,100,100 a.21 = -100,-100,100 a.24 = -100,100,-100 ay = 0.0 // 投影中心 v = -300 repeat redraw 0 color 255,255,255:boxf:color ay + 0.01 pos 300,200 repeat length(a)/3 x = double(a(cnt*3)) y = double(a(cnt*3+1)) z = double(a(cnt*3+2)) // 透視変換 z1 = (z*cos(ay) - x*sin(ay)) / v + 1 x1 = (x*cos(ay) + z*sin(ay)) / z1 y1 = y / z1 // lineto x1,y1 loop redraw 1 await 10 loop
 ,
 (x1,x2) を z1 で割らなければ、オブジェクトは正確に表示されるので、
透視変換のやり方自体に問題があるのでしょうか。おしえてください。



この記事に返信する


K

リンク

2006/5/21(Sun) 01:14:48|NO.804

データは前からの移動量なのに、計算は中心からの距離で計算してる

A 100,100,0
B 100,-100,0

90度回転させたら
A 0,100,100
B 0,-100,100

中心からのB座標はB 0,0,200 になるはず
しかし、計算は中心から0,-100,100ととして計算している

データはそのままで直してみる

#module #deffunc lineto int p1,int p2 line ginfo_cx, ginfo_cy, p1, p2 pos p1,p2 return #global ;------------------------------ ; ;「デカルト座標を用いる」 ;(図) ;y z ;↑/ ;└→x ;------------------------------ ;ポリゴンデータ x , y , z a.0 = 100,100,0 a.3 = 100,-100,0 a.6 = 0,-100,0 a.9 = -200,0,0 a.12 = 0,100,0 a.15 = 100,-100,-100 a.18 = 100,100,100 a.21 = -100,-100,100 a.24 = -100,100,-100 repeat length(a)/3-1 ;ローカル座標に変換 a((cnt+1)*3)+= a(cnt*3):a((cnt+1)*3+1)+= a(cnt*3+1):a((cnt+1)*3+2)+= a(cnt*3+2) loop ay = 0.0 // 投影中心 v = -300 repeat redraw 0 color 255,255,255:boxf:color ay + 0.01 psx=320.0:psy=240.0 ;ライン開始位置 pos psx,psy repeat length(a)/3 x = double(a(cnt*3)) y = double(a(cnt*3+1)) z = double(a(cnt*3+2)) // 透視変換 z1 = (z*cos(ay) - x*sin(ay)) / v + 1 x1 =psx+(x*cos(ay) + z*sin(ay)) / z1 y1 =psy-y / z1 // lineto x1,y1 xx=ginfo_cx:yy=ginfo_cy:mes x1:mes y1:mes z1:pos xx ,yy loop redraw 1 await 10 loop



K

リンク

2006/5/21(Sun) 01:34:45|NO.805

>repeat length(a)/3-1 ;ローカル座標に変換
これは、使用する時に

repeat length(a)/3 x += double(a(cnt*3)) y += double(a(cnt*3+1)) z += double(a(cnt*3+2))
でも、いんだけどね
(使う変数は実数型に初期化しとかないとダメだけど・・・)



naznyark

リンク

2006/5/21(Sun) 03:26:05|NO.806

計算上の空間座標と表示上の平面座標を
ごっちゃにして処理しているのでおかしくなっています。

処理の流れの考え方としては空間座標の算出と表示座標の算出は
別々に考えるべきです。

;ポリゴンデータ x , y , z a.0 = 100,100,0 a.3 = 100,-100,0 a.6 = 0,-100,0 a.9 = -200,0,0 a.12 = 0,100,0 a.15 = 100,-100,-100 a.18 = 100,100,100 a.21 = -100,-100,100 a.24 = -100,100,-100 ay = 0.0 // 投影中心 v = -300 repeat redraw 0 color 255,255,255:boxf:color ay + 0.01 pos 300,200 xo = 0.0 yo = 0.0 zo = 0.0 repeat length(a)/3 // 空間座標の算出 // 回転前の座標 xo += double(a(cnt*3)) yo += double(a(cnt*3+1)) zo += double(a(cnt*3+2)) // 回転後の座標 zr = (zo*cos(ay) - xo*sin(ay)) xr = (xo*cos(ay) + zo*sin(ay)) yr = yo // 表示座標の算出 // 透視変換 z1 = zr / v + 1 x1 = xr / z1 y1 = yr / z1 // line 300+x1, 200-y1 loop redraw 1 await 10 loop



SHINYA

リンク

2006/5/21(Sun) 12:10:14|NO.807

>データは前からの移動量なのに、計算は中心からの距離で計算してる
「う〜ん、肝心なことにきずきませんでした」ネットで資料をむさぼった
のが馬鹿みたいですよ。

>処理の流れの考え方としては空間座標の算出と表示座標の算出は
>別々に考えるべきです。
「なるほど〜」

 Kさん、naznyarkさん、ありがとうございます。
グラフィックスのポイントをつかむことが出来ました。またよろしくお願いします。



SHINYA

リンク

2006/5/22(Mon) 22:12:16|NO.825

 解決チェックを入れるの忘れていました。



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