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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0405
littlestream矢印キーでY軸に回転する立方体が段々横方向から潰れてくる2解決


littlestream

リンク

2020/4/5(Sun) 21:56:36|NO.89971


//矢印キーで左を押すと画面の正面から見て左側に点だけの立方体が //回転するのですが右を押しても小さくなるばかりで全然回転しません。 //左側に回転するのは良いのですが、やはり立方体が段々小さくなってしまいます。 //自分はHSPは最近になってやっとハマりだしたので、HSPの小数点の計算方法が //難しいと感じます。どうすれば、立方体が横方向に潰れずに済むか教えてください。 W=640 H=480 MAX=10 screen 0,W,H ddim x,MAX:ddim y,MAX:ddim z,MAX ddim sin_,360 ddim cos_,360 #define RAD (3.14159265/180.0) xx=1.00 yy=1.00 zz=1.00 dim poly,10,3 N=100.0 D=600.0 CZ=-810.0 zr=0.00 y33=5.0 t=0.0 t2=0.0 //variable prepare *main if(t==0.0){ SetV 0,N,N,N SetV 1,N,-N,N SetV 2,-N,N,N SetV 3,-N,-N,N SetV 4,N,N,-N SetV 5,N,-N,-N SetV 6,-N,N,-N SetV 7,-N,-N,-N } //side press bug fix for expect for i,0,360,1 sin_(i)=sin(double(i)*RAD)*256 cos_(i)=cos(double(i)*RAD)*256 next //sin,cos table create redraw 0 color 0,0,0 //fill screen black color boxf XDash=1.0 YDash=1.0 for i,0,8,1 XDash=(x(i)*D)/(z(i)+CZ)+(W/2) //simple projection translation YDash=(y(i)*D)/(z(i)+CZ)+(H/2) color 255,0,0 //red color PSET XDash,YDash //point set pos XDash,YDash //vertex number print i //index number next stick key,1 //key input stick key2,4 if key&1 : t=4.0 //left allow press if key2&4 : t=-4.0 //right allow press if key!=1 && key2!=4:t=0.0 //rotate stop c=1.0:s=1.0 xx=1.0:yy=1.0 //variable prepare c=(cos_(abs(int(t))))//cos,sin of tmp variable s=(sin_(abs(int(t)))) //bug's hide? for j,0,8,1 if t==-4.0 : sign=-1 : else: sign=1 xx = (z(j)*1.0* s) + (sign*(x(j)*1.0 * c)) zz = (z(j)*1.0* c) - (sign*(x(j)*1.0 * s)) x(j)=xx/256.0 z(j)=zz/256.0 next redraw 1 await 16 goto *main



この記事に返信する


砂時 計

リンク

2020/4/6(Mon) 20:04:16|NO.89974

こんな感じでしょうか。


W=640 H=480 MAX=10 screen 0,W,H // base vertices position ddim vx,MAX : ddim vy,MAX : ddim vz, MAX ddim x,MAX:ddim y,MAX:ddim z,MAX ddim sin_,360 ddim cos_,360 #define RAD (M_PI/180.0) xx=1.00 yy=1.00 zz=1.00 dim poly,10,3 N=100.0 D=600.0 CZ=-810.0 zr=0.00 y33=5.0 t=0.0 t2=0.0 //variable prepare if(t==0.0){ SetV 0,N,N,N SetV 1,N,-N,N SetV 2,-N,N,N SetV 3,-N,-N,N SetV 4,N,N,-N SetV 5,N,-N,-N SetV 6,-N,N,-N SetV 7,-N,-N,-N } //side press bug fix for expect for i,0,360,1 sin_(i) = sin(double(i)*RAD)*256 cos_(i) = cos(double(i)*RAD)*256 next //sin,cos table create degdir = 0 *main stick key,1|4 //key input if key&1 : t = 4 //left allow press if key&4 : t = -4 //right allow press if (key&5) == 0 : t = 0 //rotate stop degdir = (degdir + t + 360) \ 360 c = cos_(degdir) //cos,sin of tmp variable s = sin_(degdir) //bug's hide? for j,0,8,1 xx = vz(j) * s + vx(j) * c yy = vy(j) * 256.0 zz = vz(j) * c - vx(j) * s x(j) = xx/256.0 y(j) = yy / 256.0 z(j) = zz/256.0 next //draw routine redraw 0 color 0,0,0 //fill screen black color boxf XDash=1.0 YDash=1.0 for i,0,8,1 XDash=(x(i)*D)/(z(i)+CZ)+(W/2) //simple projection translation YDash=(y(i)*D)/(z(i)+CZ)+(H/2) color 255,0,0 //red color PSET XDash,YDash //point set pos XDash,YDash //vertex number print i //index number next redraw 1 await 16 goto *main //set vertex position #deffunc setv int ini, double inx, double iny, double inz vx.ini = inx vy.ini = iny vz.ini = inz return

どんどん小さくなっていくのは
おそらくノルムとして1.0をわずかに下回っている回転変換を
何度も繰り返し反映しているからではないでしょうか。
これは HSP3 に限らず一般的に発生する誤差の蓄積であるような気がします。

また回転しないのは符号を無理に付け外ししているからのように見えました。

なので両方一度にまとめてdegdir という変数で
基準からトータルでどれだけ回転しているかを管理するようにしました。
-1度は-359度、-2度は-358度になるようにしています。
毎回最初の基準頂点位置から描画時に決まった角度方向へ
1回だけ変換するようにしています。



littlestream

リンク

2020/4/6(Mon) 21:01:02|NO.89975

>>砂時 計さんへ

回答ありがとうございます。

degdirという変数と\という演算子をうまく使うのがコツだったんですね。
問題は解決しましたので、解決と致します。ありがとうございました!!



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