|
|
|
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回だけ変換するようにしています。
| |
|
2020/4/6(Mon) 21:01:02|NO.89975
>>砂時 計さんへ
回答ありがとうございます。
degdirという変数と\という演算子をうまく使うのがコツだったんですね。
問題は解決しましたので、解決と致します。ありがとうございました!!
|
|