プチコン用 3Dポリゴン立体視プログラム ver.1.1

 これは私が作ったプチコン用ポリゴン表示プログラムを元にして「平行法」や「交差法」にて立体視を行うプログラムです。
 このプログラムのウリはmkII用としては最速のポリゴン表示によってそこそこ高速なリアルタイム表示が可能、超至近距離で鑑賞した場合には3DSでも体感できない迫力の3Dを体感できる、超至近距離で鑑賞時にも画角連動機能によって普通のソフトでは味わうことができない自然な立体感、複雑な操作を必要とせず、分かりやすく簡単な操作で可能ということです。

 最大300ポリゴン/秒プチコンmkIIでは最速のポリゴン表示ルーチンを使用しているため左右両方の表示が必要な立体視でもそこそこ高速な表示が可能です。24面体×2(合計48ポリゴン)で7fps程度、80ポリゴンで構成されたN64ロゴ×2(合計160ポリゴン)で2fps程度です。

《 画面写真 》

こんな感じのモデルを表示しながらグリグリと動かすことができます。(推奨鑑賞距離10cm)
3DSでも味わうことができない迫力ある3D映像をお楽しみください。

《 注 意 》
 このプログラムでは立体視の効果を十分に見せるため標準設定では「3Dコンテンツ安全ガイドライン」の基準を大きく越えており長時間の鑑賞は避けてください。長時間の鑑賞を行う場合には目から画面までの距離を離し飛び出し量の設定を標準から大きく下げてください。万一、このソフトを使用して気分が悪くなった場合でも当方では責任を持つことはできません。

 まぁ映画やゲームの類ではなくそんなに長時間の鑑賞をすることはないと思うのでそれほど気にしなくても大丈夫だと思います。そして、安全性を重視した一般的な3Dコンテンツよりも迫力ある3Dを鑑賞することができます。

 《 メニュー 》


《 プログラムリスト 》

ACLS:CLEAR:PNLTYPE "OFF":PA=100
V_MAX=999:L_MAX=999:P_MAX=999
DIM VX(V_MAX),VY(V_MAX),VZ(V_MAX)
DIM WX(V_MAX),WY(V_MAX),WZ(V_MAX)
DIM SX(V_MAX),SY(V_MAX)
DIM L1(L_MAX),L2(L_MAX)
DIM P1(P_MAX),P2(P_MAX),P3(P_MAX)
DIM PC(P_MAX),PZ(P_MAX),PN(P_MAX)

GPAGE 1
FOR I=1TO 11
GLINE I*21.3,0,I*21.3,191,13-(I==6)
GLINE 0,I*16,255,I*16,13-(I==6)
NEXT

FOR I=0TO 3
READ C$
SPPAGE 1
CHRSET "SPS",I,C$
SPPAGE 0
CHRSET "SPU",I,C$
NEXT
FOR I=0TO 1
SPPAGE !I
SPSET 0,0,0,0,0,0
SPHOME 0,8,8
SPOFS 0,!I*137-9,!I*96
NEXT

@LIGHTING
BG=0:AM=3
RL=255:GL=255:BL=255
GPAGE 0
FOR I=1TO 15
COLREAD("GRP",I),R0,G0,B0
FOR J=0TO 15
R=R0*(AM+15-J)/(AM+16)*RL/255
G=G0*(AM+15-J)/(AM+16)*GL/255
B=B0*(AM+15-J)/(AM+16)*BL/255
C$=HEX$(R,2)+HEX$(G,2)+HEX$(B,2)
COLSET "GRP",J*16+I,C$
NEXT
NEXT

@INIT
ZM=100
PL=0:RX=0:RY=0:LZ=1
BGMPLAY RND(23)+7
MD$(0)="SOLID24"
MD$(1)="TRIFORCE"
MD$(2)="CAR1"
MD$(3)="NCUBE"
IF MD$(MD)>""THEN RESTORE "@"+MD$(MD)ELSE RESTORE "@"+MD$(0)

READ VT
VT=VT-1
FOR I=0TO VT
READ VX(I),VY(I),VZ(I)
NEXT

READ LN,LC
LN=LN-1
FOR I=0TO LN
READ L1(I),L2(I)
NEXT

READ PG
PG=PG-1
FOR I=0TO PG
READ P1(I),P2(I),P3(I),PC(I)
NEXT

@MAIN
GPAGE 0,N,2-N:N=2-N
TC=TCHST
PB=BT:BT=BUTTON():TR=NOT PB AND BT
IF !BT THEN SPOFS 0,-16,0
IF !TC*!BT THEN@VT
PX=TX:PY=TY:TC=TCHST:TX=TCHX:TY=TCHY
IF TR AND 3THEN PL=!(2-(TR AND 2))
IF TR AND 12THEN PP=!(8-(TR AND 8))
IF TR AND 240THEN MD=0OR LOG(TR)*1.45-4:MEM$=STR$(MD):GOTO @INIT
IF!BT*(TC*TX>223)THEN ZM=ZM+(TY-PY)*TC*PT:IF ZM<50THEN ZM=50ELSE IF ZM>400THEN ZM=400
IF(BT AND 512)*(TC*TX>223)THEN PA=PA+(TY-PY)*TC*PT:IF PA<10THEN PA=10ELSE IF PA>200THEN PA=200
IF !BT*(TX<224)THEN RY=(RY+(PX-TX)*TC*PT+360)%360:RX=(RX+(PY-TY)*TC*PT+360)%360
IF BT AND 256THEN GOSUB @LIGHT

' VERTEX ROUTINE

@VT
GCLS BG
FOR L=-1TO 1STEP 2
PAL=L*PA/2:PA2=40000/PA:ZM2=ZM/PA*100
SX=128+L*64*(1-PP*2)-PAL/PA2*ZM2
SN=SIN(RAD(RY))CS=COS(RAD(RY))
SI=SIN(RAD(RX))CO=COS(RAD(RX))
FOR I=0TO VT
V=CS*VZ(I)-SN*VX(I)
WX(I)=CS*VX(I)+SN*VZ(I)+PAL
WY(I)=CO*VY(I)-SI*V
WZ(I)=SI*VY(I)+CO*V
SX(I)=0OR SX+WX(I)*ZM2/(PA2+WZ(I))
SY(I)=0OR 96-WY(I)*ZM2/(PA2+WZ(I))
NEXT
ON PL GOSUB@WIRE,@POLY
NEXT
FPS=FPS+1IF MAINCNTL-CNT>59THEN LOCATE 0,0?"FPS"FPS,:FPS=0CNT=MAINCNTL
LOCATE 6,0:?"サイズ"ZM,
LOCATE 15,0:?"トビダシ"PA,
LOCATE 26,0:?MID$("コウサ ヘイコウ",PP*4,4)"ホウ"
PT=TC:PB=BT
GOTO @MAIN

@LIGHT
A=SIN(PI()/256*(128-TX))*TC
LY=SIN(PI()/192*(TY-96))*TC
B=SQR(1-LY*LY)
LX=A*B:LZ=SQR(1-A*A)*B
SPPAGE 1
IF TC THEN UX=TX:UY=TY ELSE UX=128:UY=96
SPOFS 0,UX,UY
SPPAGE 0
SPOFS 0,(144-LX*96)*PL-16,LY*96+96
SPSCALE 0,LZ*100+100
RETURN

' WIRE FRAME DRAW
@WIRE
FOR I=0TO LN
GLINE SX(L1(I)),SY(L1(I)),SX(L2(I)),SY(L2(I)),LC
NEXT
RETURN

@POLY
' Z SORT
FOR I=0TO PG
Z(0)=WZ(P1(I))
Z(1)=WZ(P2(I))
Z(2)=WZ(P3(I))
SORT 0,3,Z
PZ(I)=Z(0)+Z(2)*2
PN(I)=I
NEXT
RSORT 0,PG+1,PZ,PN

' POLYGON DRAW
FOR K=0TO PG
B=PN(K)A=P1(B)
X0=WX(A)Y0=WY(A)Z0=WZ(A)
X(0)=SX(A)Y(0)=SY(A)
A=P2(B)
X1=WX(A)Y1=WY(A)Z1=WZ(A)
X(1)=SX(A)Y(1)=SY(A)
A=P3(B)
X2=WX(A)Y2=WY(A)Z2=WZ(A)
X(2)=SX(A)Y(2)=SY(A)
NZ=(X0-X2)*(Y1-Y0)-(Y0-Y2)*(X1-X0)
NX=(Y0-Y2)*(Z1-Z0)-(Z0-Z2)*(Y1-Y0)
NY=(Z0-Z2)*(X1-X0)-(X0-X2)*(Z1-Z0)
NS=SQR(NX/4096*NX+NY/4096*NY+NZ/4096*NZ)*64
VS=SQR(X0/4096*X0+Y0/4096*Y0+(Z0+PA2)/4096*(Z0+PA2))*64ELSE VS=1
IF(NX/NS*X0/VS+NY/NS*Y0/VS)+NZ/NS*(Z0+PA2)/VS>=0THEN NEXT:RETURN
LV=NX/NS*LX+NY/NS*LY+NZ/NS*LZ
IF LV<-0.99THEN LV=-0.99ELSE IF LV>0THEN LV=0
C=PC(B)+(0OR 15.9+LV*16)*16
GOSUB @TRI
NEXT
RETURN

@TRI
SORT 0,3,X,Y:P=X(2)-X(0)
SORT 0,3,Y,X:Q=Y(2)-Y(0)
IF Q>P THEN @T
X=X(0)Y=Y(0)M=Y-Y(2)
Q=(X(0)-X(2))/(M+!M)Z=X
FOR J=0TO 1
M=Y(J)-Y(J+1)
P=(X(J)-X(J+1))/(M+!M)
X=X+(X(1)-X(0))*!M
A=Y(J)B=Y(J+1)-1
FOR I=A TO B
GLINE X,I,Z,I,C
X=X+P:Z=Z+Q
NEXT
NEXT
RETURN
@T
SORT 0,3,X,Y
X=X(0)Y=Y(0)M=X-X(2)
Q=(Y(0)-Y(2))/(M+!M)Z=Y
FOR J=0TO 1
M=X(J)-X(J+1)
P=(Y(J)-Y(J+1))/(M+!M)
Y=Y+(Y(1)-Y(0))*!M
A=X(J)B=X(J+1)-1
FOR I=A TO B
GLINE I,Y,I,Z,C
Y=Y+P:Z=Z+Q
NEXT
NEXT
RETURN

' SUN CHR DATA
DATA 2000000202000002002000000002002200000200000020000000200200020020
DATA 0000002000000200000020002200000000200000000200002000200002002000
DATA 2202002000020002000020000000020000020022002000000200000220000002
DATA 0020202200202000002020000200200020020000000002000000002000000002

' OBJECT DATA

@SOLID24

' VERTEX DATA
DATA 14
DATA 0,50,0,-10,10,-10
DATA 10,10,-10,10,10,10
DATA -10,10,10,-10,-10,-10
DATA 10,-10,-10,10,-10,10
DATA -10,-10,10,-50,0,0
DATA 0,0,-50,50,0,0
DATA 0,0,50,0,-50,0

' LINE DATA
DATA 36,11
DATA 0,1,0,2,0,3,0,4
DATA 1,2,2,3,3,4,4,1
DATA 5,6,6,7,7,8,8,5
DATA 1,5,2,6,3,7,4,8
DATA 9,1,9,4,9,5,9,8
DATA 10,1,10,2,10,5,10,6
DATA 11,2,11,3,11,6,11,7
DATA 12,3,12,4,12,7,12,8
DATA 13,5,13,6,13,7,13,8

' POLYGON DATA
DATA 24
DATA 0,2,1,2,0,3,2,2
DATA 0,4,3,2,0,1,4,2
DATA 9,4,1,4,9,8,4,4
DATA 9,5,8,4,9,1,5,4
DATA 10,1,2,10,10,2,6,10
DATA 10,6,5,10,10,5,1,10
DATA 11,2,3,5,11,6,2,5
DATA 11,7,6,5,11,3,7,5
DATA 12,3,4,12,12,7,3,12
DATA 12,8,7,12,12,4,8,12
DATA 13,5,6,15,13,6,7,15
DATA 13,7,8,15,13,8,5,15

@CUBE

' VERTEX DATA
DATA 8
DATA -32,-32,-32,-32,32,-32
DATA 32,-32,-32,32,32,-32
DATA -32,-32,32,-32,32,32
DATA 32,-32,32,32,32,32

' LINE DATA
DATA 12,15
DATA 0,1,1,3,2,3,2,0,0,4,1,5
DATA 2,6,3,7,4,5,5,7,6,7,6,4

' POLYGON DATA
DATA 12
DATA 0,1,2,15,1,3,2,15
DATA 2,3,6,15,6,3,7,15
DATA 0,6,4,15,0,2,6,15
DATA 0,4,5,15,0,5,1,15
DATA 1,5,7,15,1,7,3,15
DATA 4,6,5,15,5,6,7,15

@TRIFORCE

' VERTEX DATA
DATA 12
DATA 0,60,0,-23.1,20,0
DATA 23.1,20,0,-46.2,-20,0
DATA 0,-20,0,46,-20,0
DATA 0,60,10,-23.1,20,10
DATA 23.1,20,10,-46.2,-20,10
DATA 0,-20,10,46.2,-20,10

' LINE DATA
DATA 24,12
DATA 0,1,1,2,2,0,1,3,3,4,4,1
DATA 2,4,4,5,5,2,6,7,7,8,8,6
DATA 7,9,9,10,10,7,8,10,10,11,11,8
DATA 0,6,1,7,2,8,3,9,4,10,5,11

' POLYGON DATA
DATA 18
DATA 0,2,1,12,1,4,3,12
DATA 2,5,4,12,6,7,8,12
DATA 7,9,10,12,8,10,11,12
DATA 0,11,5,8,11,0,6,8
DATA 0,9,6,8,9,0,3,8
DATA 3,11,9,8,11,3,5,8
DATA 1,8,7,7,8,1,2,7
DATA 1,10,4,7,10,1,7,7
DATA 2,10,8,7,10,2,4,7

@CAR1

' VERTEX DATA
DATA 20
DATA -12,0,32,12,0,32
DATA -12,10,16,12,10,16
DATA -14,14,4,14,14,4
DATA -14,16,-16,14,16,-16
DATA -16,10,-24,16,10,-24
DATA -16,10,-28,16,10,-28
DATA -24,0,-32,24,0,-32
DATA -16,13,-22,16,13,-22
DATA -16,16,-28,16,16,-28
DATA -16,14,-24,16,14,-24

' LINE DATA
DATA 31,2
DATA 0,1,0,2,2,3,3,1
DATA 2,4,4,5,5,3,4,6
DATA 6,7,7,5,6,8,8,9
DATA 9,7,8,10,10,11,11,9
DATA 10,12,13,11,2,8,3,9
DATA 0,12,12,13,13,1,14,15
DATA 14,16,16,17,17,15,18,8
DATA 10,16,19,9,11,17

' POLYGON DATA
DATA 34
DATA 0,1,2,2,1,3,2,2
DATA 2,3,4,6,3,5,4,6
DATA 4,5,6,2,5,7,6,2
DATA 6,9,8,2,9,6,7,2
DATA 8,9,10,2,9,11,10,2
DATA 2,6,8,2,6,2,4,2
DATA 9,5,3,2,5,9,7,2
DATA 0,10,12,2,10,0,2,2
DATA 1,11,3,2,1,13,11,2
DATA 10,13,12,2,13,10,11,2
DATA 0,13,1,1,13,0,12,1
DATA 14,17,16,12,17,14,15,12
DATA 14,17,15,2,17,14,16,2
DATA 18,10,8,12,10,18,16,12
DATA 18,10,16,12,10,18,8,12
DATA 19,11,17,12,11,19,9,12
DATA 19,11,9,12,11,19,17,12

@CAR2

' VERTEX DATA
DATA 25
DATA 0,0,32,6,6,16
DATA -6,6,16,12,0,8
DATA 6,12,8,-6,12,8
DATA -12,0,8,12,0,-28
DATA 6,12,-24,-6,12,-24
DATA -12,0,-28,24,0,-32
DATA 20,0,0,12,0,8
DATA -24,0,-32,-20,0,0
DATA -12,0,8,10,4,-27
DATA -10,4,-27,6,12,-20
DATA 8,16,-26,8,16,-30
DATA -6,12,-20,-8,16,-26
DATA -8,16,-30

' LINE DATA
DATA 38,6
DATA 0,3,0,6,3,1,1,2
DATA 0,1,0,2,1,4,2,5
DATA 2,6,3,4,4,5,5,6
DATA 3,7,4,8,5,9,6,10
DATA 7,11,11,12,12,13,10,14
DATA 14,15,15,16,11,13,14,16
DATA 18,14,14,10,17,11,11,7
DATA 10,9,9,8,8,7,10,7
DATA 19,20,20,21,21,8,22,23
DATA 23,24,24,9

' POLYGON DATA
DATA 36
DATA 0,1,2,4,0,3,1,4
DATA 0,2,6,4,1,3,4,6
DATA 1,4,5,6,1,5,2,6
DATA 5,6,2,6,17,4,3,4
DATA 17,8,4,4,8,9,4,4
DATA 9,5,4,4,9,18,5,4
DATA 18,6,5,4,11,13,12,4
DATA 11,17,13,15,18,14,16,15
DATA 14,15,16,4,18,10,14,4
DATA 17,11,7,4,9,8,10,4
DATA 8,7,10,4,20,21,19,15
DATA 21,8,19,15,19,21,20,15
DATA 19,8,21,15,24,23,9,15
DATA 23,22,9,15,9,23,24,15
DATA 9,22,23,15,0,6,3,1
DATA 3,6,7,1,6,10,7,1
DATA 13,11,12,1,13,7,11,1
DATA 16,15,14,1,16,14,10,1

@QOQOQO

' VERTEX DATA
DATA 70
DATA -32,24,-20,32,24,-20
DATA -32,-24,-20,32,-24,-20
DATA -32,24,20,32,24,20
DATA -32,-24,20,32,-24,20
DATA -16,44,-20,-24,24,-20
DATA -8,24,-20,-16,24,-12
DATA 16,44,-20,8,24,-20
DATA 24,24,-20,16,24,-12
DATA -16,36,-21,-20,27,-21
DATA -12,27,-21,16,36,-21
DATA 12,27,-21,20,27,-21
DATA 0,-12,20,8,-24,20
DATA -8,-24,20,-30,-10,40
DATA -28,16,-21,-8,16,-21
DATA -28,12,-21,-8,12,-21
DATA 8,16,-21,28,16,-21
DATA 8,12,-21,28,12,-21
DATA -28,8,-21,-8,8,-21
DATA -28,5,-21,-8,5,-21
DATA -25,0,-21,-11,0,-21
DATA -25,-2,-21,-11,-2,-21
DATA -25,5,-21,-20,5,-21
DATA -15,5,-21,-11,5,-21
DATA -20,0,-21,-15,0,-21
DATA 8,8,-21,28,8,-21
DATA 8,5,-21,28,5,-21
DATA 11,0,-21,25,0,-21
DATA 11,-2,-21,25,-2,-21
DATA 11,5,-21,15,5,-21
DATA 20,5,-21,25,5,-21
DATA 15,0,-21,20,0,-21
DATA -15,-14,-21,15,-14,-21
DATA -15,-17,-21,15,-17,-21
DATA 0,-4,-20,-6,-10,-20
DATA 6,-10,-20,0,-10,-25

' LINE DATA
DATA 81,15
DATA 0,1,9,8,8,10,10,13
DATA 13,12,12,14,1,3,3,2
DATA 2,0,0,4,1,5,2,6
DATA 3,7,4,5,6,7,4,6
DATA 5,7,9,11,11,10,8,11
DATA 13,15,15,14,12,15,22,23
DATA 22,24,22,25,23,25,24,25
DATA 16,17,16,18,19,20,19,21
DATA 26,27,27,29,29,28,28,26
DATA 30,31,31,33,33,32,32,30
DATA 34,35,35,37,37,39,34,36
DATA 36,38,42,45,38,39,39,41
DATA 41,40,40,38,38,42,39,45
DATA 43,46,44,47,48,49,49,51
DATA 51,53,48,50,50,52,52,53
DATA 53,55,55,54,54,52,56,59
DATA 59,53,53,52,52,56,57,60
DATA 58,61,62,63,63,65,65,64
DATA 64,62,66,67,67,68,68,66
DATA 66,69,67,69,68,69,17,18
DATA 20,21

' POLYGON DATA
DATA 48
DATA 0,1,3,15,0,3,2,15
DATA 1,5,3,15,5,7,3,15
DATA 0,5,1,15,5,0,4,15
DATA 4,6,5,15,6,7,5,15
DATA 0,2,4,15,2,6,4,15
DATA 6,2,7,15,2,3,7,15
DATA 8,10,9,15,12,14,13,15
DATA 9,11,8,15,8,11,10,15
DATA 13,15,12,15,12,15,14,15
DATA 22,25,23,15,22,24,25,15
DATA 23,25,24,15,26,27,28,14
DATA 27,29,28,14,30,31,32,14
DATA 31,33,32,14,34,35,36,14
DATA 35,37,36,14,36,42,38,14
DATA 45,37,39,14,38,39,40,14
DATA 39,41,40,14,43,44,46,14
DATA 44,47,46,14,48,49,50,14
DATA 49,51,50,14,52,53,54,14
DATA 53,55,54,14,50,56,52,14
DATA 59,51,53,14,57,58,60,14
DATA 58,61,60,14,62,63,64,14
DATA 63,65,64,14,16,18,17,2
DATA 19,21,20,2,66,69,67,2
DATA 66,68,69,2,69,68,67,2

@NCUBE

' VERTEX DATA
DATA 48
DATA -32,32,-12,-32,32,-32
DATA -12,32,-32,-12,32,-12
DATA 12,32,-12,12,32,-32
DATA 32,32,-32,32,32,-12
DATA -32,32,32,-32,32,12
DATA -12,32,12,-12,32,32
DATA 12,32,32,12,32,12
DATA 32,32,12,32,32,32
DATA -32,-32,-32,-32,-32,-12
DATA -12,-32,-12,-12,-32,-32
DATA 12,-32,-32,12,-32,-12
DATA 32,-32,-12,32,-32,-32
DATA -32,-32,12,-32,-32,32
DATA -12,-32,32,-12,-32,12
DATA 12,-32,12,12,-32,32
DATA 32,-32,32,32,-32,12
DATA 12,0,-32,12,0,-12
DATA 32,0,12,12,0,12
DATA -12,0,32,-12,0,12
DATA -32,0,-12,-12,0,-12
DATA -12,0,-32,-12,0,-12
DATA -32,0,12,-12,0,12
DATA 12,0,32,12,0,12
DATA 32,0,-12,12,0,-12

' LINE DATA
DATA 68,11
DATA 0,1,1,2,2,3,3,0
DATA 4,5,5,6,6,7,7,4
DATA 8,9,9,10,10,11,11,8
DATA 12,13,13,14,14,15,15,12
DATA 16,17,17,18,18,19,19,16
DATA 20,21,21,22,22,23,23,20
DATA 24,25,25,26,26,27,27,24
DATA 28,29,29,30,30,31,31,28
DATA 2,32,32,33,33,3,32,5
DATA 7,34,34,35,35,4,34,14
DATA 12,36,36,37,37,13,36,11
DATA 9,38,38,39,39,10,38,0
DATA 20,40,40,41,41,21,40,19
DATA 17,42,42,43,43,18,42,24
DATA 26,44,44,45,45,27,44,29
DATA 31,46,46,47,47,28,46,22
DATA 1,16,6,23,8,25,15,30

' POLYGON DATA
DATA 80
DATA 0,2,1,12,0,3,2,12
DATA 4,6,5,12,4,7,6,12
DATA 8,10,9,12,8,11,10,12
DATA 12,14,13,12,12,15,14,12
DATA 16,18,17,12,16,19,18,12
DATA 20,22,21,12,20,23,22,12
DATA 24,26,25,12,24,27,26,12
DATA 28,30,29,12,28,31,30,12
DATA 3,32,2,2,3,33,32,2
DATA 35,7,4,11,35,34,7,11
DATA 36,13,37,2,36,12,13,2
DATA 9,39,38,11,9,10,39,11
DATA 40,21,41,4,40,20,21,4
DATA 17,43,42,2,17,18,43,2
DATA 27,44,26,4,27,45,44,4
DATA 47,31,28,2,47,46,31,2
DATA 1,19,16,11,1,2,19,11
DATA 2,20,40,11,2,32,20,11
DATA 5,23,20,11,5,6,23,11
DATA 6,22,23,4,6,7,22,4
DATA 7,31,46,4,7,34,31,4
DATA 14,30,31,4,14,15,30,4
DATA 15,29,30,11,15,12,29,11
DATA 12,26,44,11,12,36,26,11
DATA 11,25,26,11,11,8,25,11
DATA 8,24,25,4,8,9,24,4
DATA 9,17,42,4,9,38,17,4
DATA 0,16,17,4,0,1,16,4
DATA 46,21,22,11,46,33,21,11
DATA 33,39,21,11,33,3,39,11
DATA 3,38,39,11,3,0,38,11
DATA 44,28,29,4,44,35,28,4
DATA 35,33,28,4,35,4,33,4
DATA 4,32,33,4,4,5,32,4
DATA 42,27,24,11,42,37,27,11
DATA 37,35,27,11,37,13,35,11
DATA 13,34,35,11,13,14,34,11
DATA 40,18,19,4,40,39,18,4
DATA 39,37,18,4,39,10,37,4
DATA 10,36,37,4,10,11,36,4

@ANDORGENESIS

' VERTEX DATA
DATA 98
DATA 0,0,-20,-30,72,0
DATA 30,72,0,72,30,0
DATA 72,-30,0,30,-72,0
DATA -30,-72,0,-72,-30,0
DATA -72,30,0,-12,29,-15
DATA 12,29,-15,29,12,-15
DATA 29,-12,-15,12,-29,-15
DATA -12,-29,-15,-29,-12,-15
DATA -29,12,-15,-15,72,0
DATA 15,72,0,72,15,0
DATA 72,-15,0,15,-72,0
DATA -15,-72,0,-72,-15,0
DATA -72,15,0,-6,29,-15
DATA 6,29,-15,29,6,-15
DATA 29,-6,-15,6,-29,-15
DATA -6,-29,-15,-29,-6,-15
DATA -29,6,-15,-15,26,-15
DATA 15,26,-15,26,15,-15
DATA 26,-15,-15,15,-26,-15
DATA -15,-26,-15,-26,-15,-15
DATA -26,15,-15,40,51,-3
DATA 51,40,-3,51,-40,-3
DATA 40,-51,-3,-40,-51,-3
DATA -51,-40,-3,-51,40,-3
DATA -40,51,-3,20,29,-14
DATA 27,36,-11,36,27,-11
DATA 29,20,-14,29,-20,-14
DATA 36,-27,-11,27,-36,-11
DATA 20,-29,-14,-20,-29,-14
DATA -27,-36,-11,-36,-27,-11
DATA -29,-20,-14,-29,20,-14
DATA -36,27,-11,-27,36,-11
DATA -20,29,-14,-4,33,-10
DATA 4,33,-10,33,4,-10
DATA 33,-4,-10,4,-33,-10
DATA -4,-33,-10,-33,-4,-10
DATA -33,4,-10,-15,26,-10
DATA 15,26,-10,26,15,-10
DATA 26,-15,-10,15,-26,-10
DATA -15,-26,-10,-26,-15,-10
DATA -26,15,-10,-5,12,-16
DATA 5,12,-16,12,5,-16
DATA 12,-5,-16,5,-12,-16
DATA -5,-12,-16,-12,-5,-16
DATA -12,5,-16,-30,72,10
DATA 30,72,10,72,30,10
DATA 72,-30,10,30,-72,10
DATA -30,-72,10,-72,-30,10
DATA -72,30,10,0,0,10

' LINE DATA
DATA 128,10
DATA 1,2,2,3,3,4,4,5
DATA 5,6,6,7,7,8,8,1
DATA 9,10,10,11,11,12,12,13
DATA 13,14,14,15,15,16,16,9
DATA 1,33,2,34,3,35,4,36
DATA 5,37,6,38,7,39,8,40
DATA 17,25,18,26,19,27,20,28
DATA 21,29,22,30,23,31,24,32
DATA 34,41,41,42,42,35,36,43
DATA 43,44,44,37,38,45,45,46
DATA 46,39,40,47,47,48,48,33
DATA 49,50,50,51,51,52,52,49
DATA 53,54,54,55,55,56,56,53
DATA 57,58,58,59,59,60,60,57
DATA 61,62,62,63,63,64,64,61
DATA 17,65,65,66,66,18,25,65
DATA 26,66,19,67,67,68,68,20
DATA 27,67,28,68,21,69,69,70
DATA 70,22,29,69,30,70,23,71
DATA 71,72,72,24,31,71,32,72
DATA 1,73,48,73,33,73,2,74
DATA 41,74,34,74,3,75,42,75
DATA 35,75,4,76,43,76,36,76
DATA 5,77,44,77,37,77,6,78
DATA 45,78,38,78,7,79,46,79
DATA 39,79,8,80,47,80,40,80
DATA 81,82,82,83,83,84,84,85
DATA 85,86,86,87,87,88,88,81
DATA 89,90,90,91,91,92,92,93
DATA 93,94,94,95,95,96,96,89
DATA 1,89,2,90,3,91,4,92
DATA 5,93,6,94,7,95,8,96

' POLYGON DATA
DATA 152
DATA 9,10,81,13,10,82,81,13
DATA 10,11,82,13,11,83,82,13
DATA 11,12,83,13,12,84,83,13
DATA 12,13,84,13,13,85,84,13
DATA 13,14,85,13,14,86,85,13
DATA 14,15,86,13,15,87,86,13
DATA 15,16,87,13,16,88,87,13
DATA 16,9,88,13,9,81,88,13
DATA 1,17,9,13,17,25,9,13
DATA 17,18,65,13,18,66,65,13
DATA 18,2,26,13,2,10,26,13
DATA 2,3,74,13,3,75,74,13
DATA 3,19,11,13,19,27,11,13
DATA 19,20,67,13,20,68,67,13
DATA 20,4,28,13,4,12,28,13
DATA 4,5,76,13,5,77,76,13
DATA 5,21,13,13,21,29,13,13
DATA 21,22,69,13,22,70,69,13
DATA 22,6,30,13,6,14,30,13
DATA 6,7,78,13,7,79,78,13
DATA 7,23,15,13,23,31,15,13
DATA 23,24,71,13,24,72,71,13
DATA 24,8,32,13,8,16,32,13
DATA 8,1,80,13,1,73,80,13
DATA 1,89,2,13,89,90,2,13
DATA 2,90,3,13,90,91,3,13
DATA 3,91,4,13,91,92,4,13
DATA 4,92,5,13,92,93,5,13
DATA 5,93,6,13,93,94,6,13
DATA 6,94,7,13,94,95,7,13
DATA 7,95,8,13,95,96,8,13
DATA 8,96,1,13,96,89,1,13
DATA 34,41,49,13,41,50,49,13
DATA 41,42,50,13,42,51,50,13
DATA 42,35,51,13,35,52,51,13
DATA 49,52,34,13,52,35,34,13
DATA 36,43,53,13,43,54,53,13
DATA 43,44,54,13,44,55,54,13
DATA 44,37,55,13,37,56,55,13
DATA 53,56,36,13,56,37,36,13
DATA 38,45,57,13,45,58,57,13
DATA 45,46,58,13,46,59,58,13
DATA 46,39,59,13,39,60,59,13
DATA 57,60,38,13,60,39,38,13
DATA 40,47,61,13,47,62,61,13
DATA 47,48,62,13,48,63,62,13
DATA 48,33,63,13,33,64,63,13
DATA 61,64,40,13,64,33,40,13
DATA 17,65,25,13,65,66,25,13
DATA 66,26,25,13,18,26,66,13
DATA 19,67,27,13,67,68,27,13
DATA 68,28,27,13,20,28,68,13
DATA 21,69,29,13,69,70,29,13
DATA 70,39,29,13,22,30,70,13
DATA 23,71,31,13,71,72,31,13
DATA 72,32,31,13,24,32,72,13
DATA 2,74,34,13,2,34,10,13
DATA 3,35,75,13,3,11,35,13
DATA 4,76,36,13,4,36,12,13
DATA 5,37,77,13,5,13,37,13
DATA 6,78,38,13,6,38,14,13
DATA 7,39,79,13,7,15,39,13
DATA 8,80,40,13,8,40,16,13
DATA 1,33,73,13,1,9,32,13
DATA 50,51,49,2,51,52,49,2
DATA 54,55,53,2,55,56,53,2
DATA 58,59,57,2,59,60,57,2
DATA 62,63,61,2,63,64,61,2
DATA 81,82,0,2,82,83,0,2
DATA 83,84,0,2,84,85,0,2
DATA 85,86,0,2,86,87,0,2
DATA 87,88,0,2,88,81,0,2
DATA 89,97,90,1,90,97,91,1
DATA 91,97,92,1,92,97,93,1
DATA 93,97,94,1,94,97,95,1
DATA 95,97,96,1,96,97,89,1
QRコード(ファイル名:OCHAP3DPS)

※第3回プチコン大喜利用に投稿したプログラムは一部バグがあったためこのサイトでの初出が正しいver.1.1になります。

《 使用方法 》


表示するモデルはあらかじめ4つ用意されていてそれはABXYボタンに割り振られています。

Aボタン
24面体
Bボタン
トライフォースのようなもの
Xボタン
レッドイーグル
 (私がプチコンmkIIで作った3Dレースゲームの自車)
Yボタン
N64ロゴ

自分でデータを作ってAPPENDしてやればそれを表示することも可能です。@INITMD$()の中身を変えてやれば設定完了)

 十字ボタンの上下でワイヤーフレーム表示とポリゴン表示の切り替え、左右で交差法と平行法の切り替えができます。タッチで自由にモデルを回転させることができます。
 下画面右端はマウスホイールの感覚でモデルのズーム(拡大、縮小)が出来ます。デフォでは100のサイズですが最小50、最大400まで調整できます。モデルによっては拡大しすぎると左右の映像が重なるため最大倍率ではなく適量に調整をしてください。(100に設定するとモデルデータのサイズと表示サイズが同じになり例えば座標から考えた一辺の64の立方体は画面上で64ドットのサイズになる)

 Rボタンを押しながらマウスホイール操作すると飛び出し量の調整ができます。デフォでは100ですが最小10、最大200まで調整できます。デフォの100でもやや大きめの飛び出し量となっているため最大の200ではうまく立体視するのが難しいレベルの量になります。デフォの100は目から画面までの距離が10cmくらいを想定していてそれよりも遠くから見る時は小さな値、それより近くから見る時は大きな値に設定すると自然な感じになります。(飛び出し量を100から下げることはあっても上げることはほとんどないと思います)
 飛び出し量を変えると画角(遠近感)も変化させています。これは飛び出し量を大きくした場合には画面に近づいて見ることで左右の像が上手く融合できるのですが、その場合は広角で表示した方が自然な遠近感が得られるからです。

 Lボタン+タッチで光源の場所を動かすことができます。固定したい場所でLボタンを離せばその場所で固定されます。縦横の線は15°間隔で引かれています。光源は平行光源なので光源は画面中心を基準にしたその向きの無限遠にあります。
 光源は@LIGHTINGの内容を書き換えることで変更ができます。光源の色はRGBの各値を指定、変数AMの値を変えることで環境光の強さが変わります。AM=0で環境光がゼロ、AM=16で環境光はメイン光の1/2になる)


《 このプログラムにおける立体視の解説 》

 立体視の一般的な原理はプチコン講座の「立体視の原理」を参照してください。プチコン3号で立体視が可能になる立体的なモデルの作り方についても書いています。
 「交差法」や「平行法」による立体視ができない人のための練習用の立体写真と立体視のコツはこちらの画像に書いています。
 交差法と平行法はどちらが良いかというと一長一短です。交差法はかなり慣れが必要で目に負担がかかりますが、平行法は目と目の間を薄い板で仕切ることで誰でも簡単に可能で交差法よりは目の負担は小さいです。ただし、交差法は理論上は大きなサイズの画像でも可能ですが、平行法は両眼を外側に向けることができないため両眼の間隔よりも小さな画像しかできません。DSiや3DSの小さな画面ならばどちらも問題なく可能です。(ちなみに私は30cm以上の遠距離だと交差法が得意で10cm以下の至近距離だと平行法の方が得意)


 ワイヤーフレームやポリゴンによる3Dモデルで立体視を行うための原理についても初心者に分かるように簡単に書いておきます。
 3Dモデルにおいては座標がすべて3次元座標で管理されています。通常はカメラは1つでそのカメラでどのように映るかで計算していくわけですが、立体視を行う場合にはそのカメラが2つになります。3DSは立体写真が取れますが、レンズが2つ付いていますよね。それと同じことを行えば良いのです。
 私が作ったポリゴン表示プログラムではカメラがZ軸上にある(座標0,0,Zになる)1つだけなのですが、立体視に対応させるためにはX軸方向に左右等距離離した場所に2つカメラを置きます。これは左右の視差(parallax)からPALという変数で表すとカメラのある座標は(PAL,0,Z)(-PAL,0,Z)になります。つまり、2台のカメラの間の距離はPAL×2となるわけです。このプログラムでは拡大率100の時は座標とピクセル数が一致するため飛び出し量が100に設定時の2つのカメラの距離は100ドット分(LLではないDSiだと約2.5cmとなります。飛び出し量を200に設定すると2つのカメラ間の距離はDSiで約5cm、DSiLLで約6cmになります。



 3Dモデルを回転後の3次元座標における各頂点のX座標に変数PALの値を加算(減算)するだけで左右のカメラから見た映像を表示することが可能になります。(ただし、このプログラムでは後述のように距離によって変わる画角を補正しているため単純に変数PALの値を加減算しているだけではない)

 さて、問題はカメラの位置はどのくらいに設定するのが適切かということです。実は飛び出し量を正確に求めることは可能でそのためには視差角輻輳角を求める必要があります。輻輳角を求めるには両眼間隔、画面までの距離、画面上での実サイズのすべてのパラメータが必要です。
 画面上での実サイズは表示するモデルの大きさによって異なるだけではなくDSiとDSiLLで同じものを表示しても異なるし、3DSでドットバイドット表示した場合も異なります。画面までの距離は3DSでの視差バリアを使った立体視の場合は30〜40cmくらいを想定していますが、交差法や平行法による立体視ではこの縛りがないため自由な距離から鑑賞が可能です。両眼間隔は人によって個人差がある(大人と子供でも異なる)だけではなく寄り目になるかどうかで異なって来ます。
 つまり、不確定要素が多すぎていくら正確な値が求めることが可能といってもそれを実際に求めるのは無理があるわけです。

 そこでこのプログラムではモデルケースを想定して作っています。デフォ設定だとDSiで10cmの距離から見たときに自然な立体視が可能になるようになっています。(ノーマルの3DSでもドットバイドットではなく全画面表示だとDSiとほぼ同じドットピッチなので問題ない)
 LLで実行時には飛び出し量はデフォ値よりやや小さくすると自然な感じになると思いますが、私はLLを持ってないためチェックできていません。(ドットピッチが変わる関係で画角連動は正しくできてないけどよほど至近距離でない限り誤差の範囲なのでそれほど問題はないはず)

 飛び出し量を大きくする場合には通常は2つのカメラ間の距離を変えるだけなのですが、このプログラムでは画角も変化させています。それは飛び出し量を変えるために単純に2つのカメラ間の距離だけを変えた場合には目の位置が画面のすぐ近くにある場合には不自然になるためです。そこで飛び出し量と目から画面までの想定距離を連動させることでその想定距離にある場合に見えるであろうモデルの画角になるように計算しています。こうすることで目の位置を画面のすぐ近くにした場合でも自然な奥行き感(その物体がその距離に存在しているような感覚)を得ることが可能になります。
 本来は別々のパラメータであるため独立して設定できる方が便利だけど立体視をしながら2つのパラメータを制御するのは煩雑な操作になってしまうし「目からの距離」というのが分かりにくいパラメータであるため「飛び出し量」という1つのパラメータで制御する方が楽です。そして、設定できる「画角」と「飛び出し量(=2つのカメラ間の距離)」のパラメータを2つに分けると表示するモデルのサイズが同じなのに目から画面までの距離を離し飛び出し量を小さく設定して大きなパースのついて広角に設定するというありえない設定ができてしまうのでそれを防ぐ役割もあります。(表示するモデルサイズが同じ場合は画角を変えることは画面までの距離を変えることを意味するためそれらが独立操作できると矛盾を生じさせてしまう)


 ごちゃごちゃ書きましたが、このプログラムでは簡単操作で自然かつ迫力のある立体視が楽しめるというだけの話です。上記のことを実現しているソフトは恐らくPC用ソフトでも存在しておらずこのプチコンmkII用の「3Dポリゴン立体視プログラム」だけではなかと思われます。(普通はそんな至近距離から立体視を行うことは想定してないため距離によって画角を変動させるなんてことはしないため)
 なお、モデルデータの作り方やポリゴンやワイヤーフレームの仕組みについては「プチコン用ポリゴン表示プログラム」のデータの作り方プログラムの仕組みを参照してください。ちなみに私はすべて脳内でモデリングしているためモデリングソフトは作っていません。

《 実行動画 》




《 最後に 》

 このプログラム(ver.1.1)は以前作った「3Dポリゴン立体視プログラム」で抱えていた問題点を改善したものです。基本的に表示アルゴリズムは同等で冒頭に書いているようにプチコンmkIIでは最速の表示となっています。それでも160ポリゴンのN64ロゴ(2つ)では2fps程度しか出ません。
 プチコン3号で同等のものを作ればNew3DSで動作時には7000〜8000ポリゴン/秒の速度が出ると予想されるためN64ロゴ×2でも60fps近い速度が出ると思います。裸眼立体視が可能な3DSでは「立体視」だけではつまらないし、プチコン3号でも「交差法」や「平行法」による表示だとアレなので今のところこのプログラムをプチコン3号に移植する予定はありません。
 「交差法」や「平行法」ではなく3DSのハードウェアの機能を使った裸眼立体視でポリゴン表示を行うためにはプチコンのGRP面は面単位でしかZ設定ができないためスプライトを使う必要がありかなり工夫が必要になります。そのため速度面の優位性はあまり無くなってしまうし複雑なモデルを表示することはできなくなるので一長一短と言えるかもしれません。

 このプログラムの醍醐味は3DS向けの3Dコンテンツでは味わうことができない超至近距離における立体視です。目の前数cmの距離まで立体視が可能な人ならば24面体をグリグリ回すだけでもすごい迫力を得ることができ尖端恐怖症の人だと思わずビビってしまうレベルだと思います。(24面体を表示する場合は光源はデフォ設定ではなく斜め方向からにするのがベター)
 まぁ数cmの距離まで立体視が可能な人はド近眼の人に限られますが、やはりこの迫力を味わうにはせめてモデルケースである10cmくらいまで立体視が可能な人でないと伝わらないことでしょう。


RETURN(プチコンソフトコーナーに戻る) / RETURN *MAIN(トップページに戻る)


inserted by FC2 system