Seite 4 von 4

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 02.02.2013 20:43
von STARGÅTE
dige hat geschrieben:ob es bspw. mit Sprite3D möglich ist die Bilder in Form
Ja ist es.
Mit Hilfe von TransformSprite3D() kannst du ein Sprite3D beliebig verzerren und damit auch dreidimensional darstellen.
Du brauchst also nur die Koordinaten deiner Kugelpunkte:
X = Radius * Sin(Theta) * Cos(Phi)
Y = Radius * Sin(Theta) * Sin(Phi)
Z = Radius * Cos(Theta)
mit Radius, Azimutwinkel Phi und Polarwinkel Theta auf die Bildfläche projizieren
PixelX = X * Distance / Z
PixelY = Y * Distance / Z
mit Kamera Distance und dann diese Koordinaten an TransformSprite3D()
Für den Z-Parameter kannst du den echten Z-Wert einsetzen.

Dein "Quadrat" kann dann die Größe in Grad haben: Phi = 20° und Theta = 20°, dann würden 18 Bilder um den Äquator passen und 9 von Pol zu Pol.

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 02.02.2013 21:05
von dige
Das klingt gut .. hilft mir aber noch nicht weiter, da ich den
Ansatz schon nicht verstehe :-( bzw. mir noch kein Licht aufgeht
wie das Coding aussehen müsste.

Würde mich daher über ein Code Schnipsel freuen...

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 03.02.2013 00:25
von STARGÅTE
Gut, dann kommt hier mal der Codeschnipsel:

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.

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 03.02.2013 11:33
von dige
@Stargate: WAHNSINN!! :shock: ganz herzlichen Dank!!!

Das muss ich jetzt erstmal verdauen ... könnte die Kugel stundenlang drehen ...

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 03.02.2013 13:29
von Kurzer
Mann Stargate, Du bist voll der 3D-Crack! Kompliment. :praise:

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 03.02.2013 14:10
von Josh
Das ist echt hammermäßig. Was mich immer wieder wundert, mit wie wenig Code man solche Effekte erstellen kann.

P.S.: diese code für mich spanisch. überhaupt nix kapieren.

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 03.02.2013 15:01
von NicTheQuick
Bei mir sieht das so aus. Ist das wieder so ein Linux-Bug? OpenScreen mit Debugger geht ja gar nicht.

Bild

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 03.02.2013 15:16
von STARGÅTE
Jo, hab ich mit gerechnet, und wollte auf deine Antwort warten ^^
Bei Linux (bzw. OpenGL) bitte Vertex 3 mit 4 bei TransformSprite3D() (also Projection(2) mit Projection(3)) tauschen.
Obwohl es doch irgendwie komischer aussieht als ich dachte :?

Re: 3D Kugel aus einzelnen Quadraten erstellen

Verfasst: 03.02.2013 15:29
von NicTheQuick
Hab ich jetzt getan, aber es sieht jetzt trotzdem nicht besser aus, zwar anders, aber nicht besser. ;)

Außerdem passiert beim Drücken der Cursortasten überhaupt gar nichts. Anscheinend geht das mit den ShortCuts unter Linux auch nicht so richtig... /:->

Aber wegen dem Screen-Problem hab ich jetzt mal einen Bug-Report mit deinem Code im engl. Forum gepostet.