>変な形になってしまいました
それを見せてもらった方が
何がおかしいのか指摘しやすいんですが・・・
#include "d3m.hsp"
r=200.0 //半径
h=600.0 //高さ
vmax=32 //円を作る頂点の数
vr=M_PI*2.0/vmax //360度を円の頂点数で割って頂点間の角度を得る
repeat vmax+1 //閉じた円の頂点データがあった方が楽なので+1
vx(cnt)=sin(vr*cnt)*r
vy(cnt)=cos(vr*cnt)*r
loop
ddim x,vmax*4*3 //円柱の座標用配列(1面4頂点で上下側面で3組分必要)
ddim y,vmax*4*3
ddim z,vmax*4*3
//円柱上面
vi=0 //頂点のインデックス
repeat vmax
repeat 2,cnt
x(vi)=vx(cnt) //0,1の次が1,2と前の座標と繋がるようにする
y(vi)=vy(cnt)
z(vi)=h //zが高さなので
vi++
loop
x(vi)=0.0, 0.0 //四角形なので二つの頂点を円の中心にする
y(vi)=0.0, 0.0
z(vi)=h,h
vi+2
loop
//円柱底面
repeat vmax*4
x(vi)=x(cnt) //上面座標をコピー
y(vi)=y(cnt)
z(vi)=0.0 //上面とはz座標のみ違うので
vi++
loop
ui=0 //上面の最初のインデックス
di=vmax*4 //底面の最初のインデックス
//円柱下の面
repeat vmax
//上面外周2頂点の座標をコピー
x(vi)=x(ui), x(ui+1)
y(vi)=y(ui), y(ui+1)
z(vi)=z(ui), z(ui+1)
ui+4
vi+2
//底面外周2頂点の座標をコピー(d3squareが左上、右上、右下、左下なので左右逆に代入)
x(vi)=x(di+1), x(di)
y(vi)=y(di+1), y(di)
z(vi)=z(di+1), z(di)
di+4
vi+2
loop
*mainloop
fps++
redraw 0
color : boxf
; カメラ座標を回転させる
d3setcam cos(0.02 * fps) * 1000, sin(0.02 * fps) * 1000, cos(0.01 * fps) * 2000
gmode 5, , , 128
//上面
color 127, 255, 255
vi=0
repeat vmax
dup d_x,x(vi)
dup d_y,y(vi)
dup d_z,z(vi)
d3square d_x, d_y, d_z
vi+4
loop
//底面
color 192,96, 192
vi=vmax*4
repeat vmax
dup d_x,x(vi)
dup d_y,y(vi)
dup d_z,z(vi)
d3square d_x, d_y, d_z
vi+4
loop
//側面
color 127, 127, 255
vi=vmax*4*2
repeat vmax,vmax*2
dup d_x,x(vi)
dup d_y,y(vi)
dup d_z,z(vi)
d3square d_x, d_y, d_z
vi+4
loop
redraw
await 15
goto *mainloop