;改造・流用・再配布 ご自由に.ただし責任はとりません. ;そのうちモジュール作るかも… title "3D sample for HSP" ;bgscr 2,dispx,dispy,1 dim opoint_dat,3,1024 ;物体座標系(これに点データを用意) dim wpoint_dat,3,1024 ;絶対座標系 dim vpoint_dat,3,1024 ;視野座標系(3D) dim spoint_dat,2,1024 ;スクリーン座標系(2D) dim obj_points,2,256 ;オブジェクトの最初の点,点の数 dim obj_pos,3,256 dim obj_angle,3,256 dim v_point,3 ;自分の位置 dim poly_dat,16,256 ;線データ dim v,4 ;//三角関数テーブル bd=10 tbsz=1<>1 repeat tbsz>>2+1 x=31416*cnt+2500/5000 ;if tbsz<800 :xc=x*tbsz :else: xc=x xc=x sin_x=x repeat 4,1 xd=cnt<<1+1*cnt<<1 xc=xc*x+h/tbsz*x+h/tbsz+(xd>>1)/xd*-1 sin_x+=xc loop ;if tbsz<800:sin_x=sin_x+h/tbsz sin.cnt=sin_x t=tbsz/4-cnt:cos.t= sin_x t=tbsz/2-cnt:sin.t= sin_x t=tbsz/4+cnt:cos.t=-sin_x t=tbsz/2+cnt:sin.t=-sin_x t=tbsz*3/4-cnt:cos.t=-sin_x t=tbsz-cnt:sin.t=-sin_x t=tbsz*3/4+cnt:cos.t= sin_x loop ; sx=winx sy=winy midx=sx>>1 midy=sy>>1 scr_d=1024 ;視点とスクリーンの距離 v_point=0,0,-800 ;視点の位置 v_angle=2,1,0 ;------------------------ データ ----------------------- objs=3 point_dats=20 polys=10 ;-------- 立方体 -------- obj_pos.0.0=0,0,0 obj_angle.0.0=0,0,0 ;obj_scale.0.0=1,1,1 obj_points.0.0=0,8 opoint_dat.0.0 = -100,-100,-100, 100,-100,-100, 100,100,-100, -100,100,-100 ; 手前の四角形 opoint_dat.0.4 = -100,-100,100, 100,-100,100, 100,100,100, -100,100,100 ;奥の四角形 poly_dat.0.0 = 0,1,2,3,0 ,-1 poly_dat.0.1 = 4,5,6,7,4 ,-1 poly_dat.0.2 = 0,1,5,4,0 ,-1 poly_dat.0.3 = 2,3,7,6,2 ,-1 ;-------- (偽)8面体 -------- obj_pos.0.1=0,0,0 obj_angle.0.1=0,0,0 ;obj_scale.0.1=1,1,1 obj_points.0.1=8,6 opoint_dat.0.8 = 0,0,100, 0,0,-100, 0,100,0, 0,-100,0, 100,0,0, -100,0,0 poly_dat.0.4 = 8,12,9,13,8 ,-1 poly_dat.0.5 = 8,10,9,11,8 ,-1 poly_dat.0.6 = 10,13,11,12,10 ,-1 ;-------- (偽)8面体2 -------- obj_pos.0.2=0,0,0 obj_angle.0.2=0,0,0 ;obj_scale.0.2=1,1,1 obj_points.0.2=14,6 opoint_dat.0.14 = 0,0,100, 0,0,-100, 0,100,0, 0,-100,0, 100,0,0, -100,0,0 poly_dat.0.7 = 14,18,15,19,14 ,-1 poly_dat.0.8 = 14,16,15,17,14 ,-1 poly_dat.0.9 = 16,19,17,18,16 ,-1 ;------------------------ メインループ ------------------------ repeat await 20 redraw redraw 0 ;キー入力 stick k,1023 if k&1 :v_point.0-=2 ;left if k&2 :v_point.1+=2 ;up if k&4 :v_point.0+=2 ;right if k&8 :v_point.1-=2 ;down getkey k,100 ;4 if k :v_angle.1=v_angle.1+1&1023 getkey k,102 ;6 if k :v_angle.1=v_angle.1-1&1023 getkey k,98 ;2 if k :v_angle.0=v_angle.0+1&1023 getkey k,104 ;8 if k :v_angle.0=v_angle.0-1&1023 getkey k,103 ;7 if k :v_angle.2=v_angle.2-1&1023 getkey k,105 ;9 if k :v_angle.2=v_angle.2+1&1023 getkey k,33 ;PgUP if k :v_point.2+=2 getkey k,34 ;PgDown if k :v_point.2-=2 if 1 { ;かってにぐるぐる ;x=cnt&1023 ;v_angle.1=x ;v_point.2=-cos.x ;v_point.0=sin.x ; t=cnt*7 i=t&1023 j=t*3>>2+256&1023 a=t>>9+400&1023 b=t>>9+100&1023 ;obj_pos.0.0=sin.i*sin.a>>12 ;obj_pos.1.0=sin.j*sin.b>>12 obj_pos.0.1=sin.i*sin.a>>12 obj_pos.1.1=sin.j*sin.b>>12 obj_pos.2.1=sin.a*sin.b>>12 ; obj_angle.1.0=obj_angle.1.0-4&1023 obj_angle.0.0=obj_angle.0.0+2&1023 obj_angle.1.1=obj_angle.1.1+16&1023 obj_angle.0.1=obj_angle.0.1+8&1023 obj_angle.1.2=obj_angle.1.2+12&1023 obj_angle.0.2=obj_angle.0.2+1&1023 } color 0,0,0 boxf color 0,255,0 gosub o2w gosub w2v gosub v2s gosub draw_poly ;gosub draw_point ; Status pos 0,0 gettime t,7 if t>10 ), (v.2*cos.x - (v.1*sin.x) >>10 ) ;Y軸 v= v2.0*cos.y + (v2.2*sin.y) >>10, v2.1, (v2.2*cos.y - (v2.0*sin.y) >>10 ) ;Z軸 v2= v.0*cos.z - (v.1*sin.z) >>10, (v.1*cos.z + (v.0*sin.z) >>10 ), v.2 wpoint_dat.0.cnt=v2.0+px , v2.1+py , v2.2+pz loop return *w2v repeat point_dats v=wpoint_dat.0.cnt-v_point.0,(wpoint_dat.1.cnt-v_point.1),(wpoint_dat.2.cnt-v_point.2) x=v_angle.0 y=v_angle.1 z=v_angle.2 ;X軸回転 v2= v.0, (v.1*cos.x + (v.2*sin.x) >>10 ), (v.2*cos.x - (v.1*sin.x) >>10 ) ;Y軸 v= v2.0*cos.y + (v2.2*sin.y) >>10, v2.1, (v2.2*cos.y - (v2.0*sin.y) >>10 ) ;Z軸 v2= v.0*cos.z - (v.1*sin.z) >>10, (v.1*cos.z + (v.0*sin.z) >>10 ), v.2 vpoint_dat.0.cnt=v2.0 , v2.1 , v2.2 loop return *v2s repeat point_dats if vpoint_dat.2.cnt<=0 :continue spoint_dat.0.cnt= vpoint_dat.0.cnt * scr_d/vpoint_dat.2.cnt +midx spoint_dat.1.cnt= -vpoint_dat.1.cnt * scr_d/vpoint_dat.2.cnt +midy ;mes ""+spoint_dat.0.cnt+","+spoint_dat.1.cnt loop return *draw_point repeat point_dats ;title ""+spoint_dat.0.cnt+","+spoint_dat.1.cnt pset spoint_dat.0.cnt,spoint_dat.1.cnt pos spoint_dat.0.cnt,spoint_dat.1.cnt mes "("+vpoint_dat.0.cnt +","+ vpoint_dat.1.cnt +","+ vpoint_dat.2.cnt +")" loop return *draw_poly repeat polys p=cnt repeat 16 c=cnt+1 p2=poly_dat.c.p if p2<0 :break p1=poly_dat.cnt.p if vpoint_dat.2.p1<=0 :continue if vpoint_dat.2.p2<=0 :continue line spoint_dat.0.p2,spoint_dat.1.p2 , spoint_dat.0.p1,spoint_dat.1.p1 loop loop return