3D Kugel aus einzelnen Quadraten erstellen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag 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...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag von dige »

@Stargate: WAHNSINN!! :shock: ganz herzlichen Dank!!!

Das muss ich jetzt erstmal verdauen ... könnte die Kugel stundenlang drehen ...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag von Kurzer »

Mann Stargate, Du bist voll der 3D-Crack! Kompliment. :praise:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag von NicTheQuick »

Bei mir sieht das so aus. Ist das wieder so ein Linux-Bug? OpenScreen mit Debugger geht ja gar nicht.

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag 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 :?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: 3D Kugel aus einzelnen Quadraten erstellen

Beitrag 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.
Antworten