Code: Alles auswählen
InitSprite()
InitSprite3D()
Structure Vertex
X.f
Y.f
Z.f
EndStructure
#ImageSpaceAngle = 8 ; Größe eines Bilders in Grad
#StepSpaceAngle = 10 ; Abstand der Bilder in Grad (Teiler von 140)
#Radius = 20 ; Kugelradius
Enumeration
#Window
#Sprite3D
EndEnumeration
OpenWindow(#Window, 0, 0, 800, 600, "ScreenTitle", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window), 0, 0, 0)
UsePNGImageDecoder()
CreateSprite3D(#Sprite3D, CatchSprite(#PB_Any, ?picture, #PB_Sprite_Texture|#PB_Sprite_AlphaBlending))
AddKeyboardShortcut(#Window, #PB_Shortcut_Right, 6)
AddKeyboardShortcut(#Window, #PB_Shortcut_Left, 4)
AddKeyboardShortcut(#Window, #PB_Shortcut_Up, 8)
AddKeyboardShortcut(#Window, #PB_Shortcut_Down, 2)
Global Distance.f = ScreenHeight()/Tan(Radian(75)*0.5)
Global Camera.Vertex : Camera\Z = 50 ; Kameraabstand
Define ShiftPhi.f, NextShiftPhi.f, ShiftTheta.f, NextShiftTheta.f
Define Sprite3D.i
Procedure DisplayPicture(Sprite3D.i, Phi.f, Theta.f)
Protected PhiA.f, PhiB.f, ThetaA.f, ThetaB.f, Radius.f
Protected Dim Vertex.Vertex(3), Dim Projection.Vertex(3)
; Raumwinkel bestimmen
PhiA = Radian(Phi-#ImageSpaceAngle/2)
PhiB = Radian(Phi+#ImageSpaceAngle/2)
ThetaA = Radian(Theta-#ImageSpaceAngle/2)
ThetaB = Radian(Theta+#ImageSpaceAngle/2)
Radius = #Radius * (1+Exp(-(Pow(Phi,2)+Pow(Theta,2))*0.02)*0.5) ; Vergrößerung des Bilds
; Vertexkoordinaten errechnen
Vertex(0)\X = Radius * Cos(ThetaB) * Sin(PhiA)
Vertex(0)\Y = Radius * Sin(ThetaB)
Vertex(0)\Z = Radius * Cos(ThetaB) * Cos(PhiA)
Vertex(1)\X = Radius * Cos(ThetaB) * Sin(PhiB)
Vertex(1)\Y = Radius * Sin(ThetaB)
Vertex(1)\Z = Radius * Cos(ThetaB) * Cos(PhiB)
Vertex(2)\X = Radius * Cos(ThetaA) * Sin(PhiB)
Vertex(2)\Y = Radius * Sin(ThetaA)
Vertex(2)\Z = Radius * Cos(ThetaA) * Cos(PhiB)
Vertex(3)\X = Radius * Cos(ThetaA) * Sin(PhiA)
Vertex(3)\Y = Radius * Sin(ThetaA)
Vertex(3)\Z = Radius * Cos(ThetaA) * Cos(PhiA)
; Projektion
For N = 0 To 3
Vertex(N)\X - Camera\X : Vertex(N)\Y - Camera\Y : Vertex(N)\Z - Camera\Z
Projection(N)\X = - Vertex(N)\X * Distance / Vertex(N)\Z + ScreenWidth()/2
Projection(N)\Y = Vertex(N)\Y * Distance / Vertex(N)\Z + ScreenHeight()/2
Projection(N)\Z = Vertex(N)\Z
Next
; Darstellung
TransformSprite3D(Sprite3D, Projection(0)\X, Projection(0)\Y, Projection(0)\Z, Projection(1)\X, Projection(1)\Y, Projection(1)\Z, Projection(2)\X, Projection(2)\Y, Projection(2)\Z, Projection(3)\X, Projection(3)\Y, Projection(3)\Z)
DisplaySprite3D(Sprite3D, 0, 0)
EndProcedure
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Menu
Select EventMenu()
Case 4
NextShiftPhi - 1
Case 6
NextShiftPhi + 1
Case 8
NextShiftTheta + 1
Case 2
NextShiftTheta - 1
EndSelect
Case #Null
Break
EndSelect
ForEver
ClearScreen(0)
; Bewegung
If NextShiftPhi <> ShiftPhi
ShiftPhi + (NextShiftPhi-ShiftPhi)/10
EndIf
If NextShiftTheta <> ShiftTheta
ShiftTheta + (NextShiftTheta-ShiftTheta)/10
EndIf
If Start3D()
I = 0
For Theta = -70 To 70 Step #StepSpaceAngle
For Phi = -70 To 70 Step #StepSpaceAngle
If Phi Or Theta
DisplayPicture(#Sprite3D, (NextShiftPhi-ShiftPhi)*#StepSpaceAngle+Phi, (NextShiftTheta-ShiftTheta)*#StepSpaceAngle+Theta)
EndIf
Next
Next
DisplayPicture(#Sprite3D, (NextShiftPhi-ShiftPhi)*#StepSpaceAngle, (NextShiftTheta-ShiftTheta)*#StepSpaceAngle)
Stop3D()
EndIf
FlipBuffers()
ForEver
DataSection
picture:
Data.q $0A1A0A0D474E5089,$524448490D000000,$2000000020000000,$7A7A730000000608,$58457419000000F4
Data.q $72617774666F5374,$2065626F64410065,$6165526567616D49,$00003C65C9717964,$DA78544144490004
Data.q $FE14451C8BCF57C4,$1DC43771D98FF55E,$2106390B2E31443C,$725E2BA31C855EA0,$7E40FF93931414F0
Data.q $5E031CB72048721C,$BD70183C04312E62,$118961E0B0828398,$D9B2164C5D1080C5,$2ABA7BBA6764C91F
Data.q $4CE9D99EC75555EF,$9AAEA98F0DB2CE0F,$8AAAF57DEFABEF7E,$441A2C27CBD8318C,$A7B4A3FDF4BF1D14
Data.q $2940C05AEF5AE7F7,$3F0F99CDF77CCA84,$384E9B1A585ED7E6,$4DF9CD218F67D7F8,$00E2FEF64609A188
Data.q $64D6FC07E2E2E4F8,$E15FCCCB10065A7B,$13567FC440BFD2C6,$2DF476C64019A004,$1C850008353C33C0
Data.q $65222AEBF6B80A1A,$CE9D9091FBE0C393,$0FB789E638C9DA78,$C184FA069F50E394,$90038DFE7C1C8534
Data.q $6E328722F2D8F46C,$7AFE9FFC822D6FDC,$53AFB08A56FD6AB0,$27E46202F59ACEC1,$C75B1D8BF0B429CD
Data.q $323300BE5F4AB8BB,$286A3E0EFC2B393E,$9D967E8EC89A1200,$4D6ABE1CCBBB2B44,$68A204C39FA69FDA
Data.q $71909F901665F4E7,$D99073E38060C77E,$4637CD2AD0A78974,$CD2E8F70CD412F4B,$D552889019394A80
Data.q $98923FA850050C0C,$DB86055E40F2EE59,$AE485058681162AC,$C1C03B92069E1E61,$606790FDAB7C9045
Data.q $1AB7180C9552AAD8,$F32D9B620C7BD536,$CD3C8B1E62FB6DB6,$DD6F41CE0F312311,$82C8FEFE60564E82
Data.q $E1A03431AA1CC42B,$5F6FE2314E1C2B72,$C8FBA061C19B0AFF,$3C1F22C64FA5B49A,$E4D37206FD74808A
Data.q $EF4A07B9D644DE35,$B5D5FBC6100B0659,$FB719030800E4034,$B8C0BE9EE435DCD6,$FDC6D888D38CA865
Data.q $77EC9BA629A99CCB,$D0EB475DAEE8C746,$08A6A0DEA39E9879,$47F494337180D0A9,$7709697E4522BFE6
Data.q $32F6D238F9657C12,$44BC1FE43E9C67B7,$071DFED2475EAC9E,$A5F89FCED284DC8F,$2154A00B3C480CBA
Data.q $FE3E9E00C077D707,$F93EA1071AFC4109,$7ED6D1FB59211D6B,$0CD125363880CB8C,$453DE734E5C9B1DD
Data.q $E793C911E8505D67,$42D05D347D977D4C,$CB4DB0D4064EC103,$C32FCD2A88ACA031,$4E8F31A089FE8E77
Data.q $2DA4D6DBDBB985B2,$C15FC558BCA6327D,$070B6C0EC503256C,$B33AA9B15C8E234D,$FB1FEF03511A1A48
Data.q $ED9CF6E77034C101,$A1A719FC82B1385F,$74A4553FBC0DBEE7,$F89BFEE677B806A4,$B0004A9CD488F663
Data.q $F978A735588B22A2,$74EE805DDDBF7739,$996FE25773B2C16D,$49BF5284ABD46EFD,$7A357BF8349A43ED
Data.q $A32E27D3875725EB,$5D9391EC49EFC3AA,$7F5817BDA82FE24A,$F86CEA00F3D2490A,$29DA4CDB21DCE839
Data.q $7F557296DA04B10B,$F0EB3CE8D2797233,$6466D547B3BD54E4,$9000C611FD6D5677,$FE00743D6C6C6D64
Data.q $0091BF88019071EF,$EB17CAEDF9C9B10A,$45961ABEE6933F13,$153F93D3D07D561D,$AFF13A38BC0D28D3
Data.q $671035579F70649E,$26141F97A9508007,$871003E9C52A1B75,$FB73919C585C2F68,$4DC1C606ECD8DC6E
Data.q $3771509D62E7F377,$36CF313A9F19ABE4,$1ADB1790EFECE13B,$E488032931723FDB,$4048FBBB9D4F667A
Data.q $2F60023058E8D3AE,$02E7F3D7D7B4C86F,$A79BBD748B6E000C,$4549000000005E7C,$0000826042AE444E
EndDataSection
Mit den Pfeiltasten kannst du den Ball bewegen.