Code: Alles auswählen
EnableExplicit
Structure p3D
x.l
y.l
z.l
x2D.l
y2D.l
EndStructure
Global NewList E3D.p3D()
Procedure AddE3DPoint(x,y,z)
AddElement(E3D())
E3D()\x=x
E3D()\y=y
E3D()\z=z
EndProcedure
;/ Wurfel vorn
AddE3DPoint(100, 100,100); oben rechts 0
AddE3DPoint(100,-100,100); unten rechts 1
AddE3DPoint(-100,-100,100); unten links 2
AddE3DPoint(-100,100,100); oben links 3
;/ genau gegenüber
AddE3DPoint(100,100,-100) ; 4
AddE3DPoint(100,-100,-100) ; 5
AddE3DPoint(-100,-100,-100) ; 6
AddE3DPoint(-100,100,-100) ; 7
AddE3DPoint(-150,0,0)
;/ Ground
#Breite=64
AddE3DPoint(-#Breite,-100,-#Breite)
AddE3DPoint( #Breite,-100,-#Breite)
AddE3DPoint( #Breite,-100, #Breite)
AddE3DPoint(-#Breite,-100, #Breite)
;/ Damit Verzerrungen minimiert werden, müssen Flächen
;/ in kleinere Flächen geteilt werden!
Global cos.f, sin.f, temp.f, angle.f=0, ZeitMessung=0, scaleFactor.f=1, PI.f=3.1415926999999; gerundet
Procedure UpDateVerts()
Protected rx, ry, rz
rx=((E3D()\x*cos)-(E3D()\z*sin))
ry=E3D()\y
rz=((E3D()\z*cos)+(E3D()\x*sin))
E3D()\x2D=240-(rx/(1+((rz*scaleFactor)/500)))
E3D()\y2D=160-(ry/(1+((rz*scaleFactor)/500)))
EndProcedure
Procedure Calc()
;/If (angle>PI) ;/ Schlüssel
If (angle<PI)
If angle<(0.5*PI)
temp=((angle*(2/PI))-0.5)
sin=(0.75-((temp*temp)-temp))
cos=(0.75-((temp*temp)+temp))
Else
temp=((((PI-angle)*(2/PI)))-0.5)
sin=(0.75-((temp*temp)-temp))
cos=(-0.75+((temp*temp)+temp))
EndIf
Else ;/ ohne Sonst sieht es ganz schön schlimm aus
If angle<(1.5*PI)
temp=(((angle-PI)*(2/PI))-0.5)
sin=(-0.75+((temp*temp)-temp))
cos=(-0.75+((temp*temp)+temp))
Else
temp=((((2*PI)-angle)*(2/PI))-0.5)
sin=(-0.75+((temp*temp)-temp))
cos=(0.75-((temp*temp)+temp))
EndIf
EndIf
EndProcedure
Procedure V2DLine(E1,E2)
Protected x, y
If E1 < CountList(E3D()) And E2 < CountList(E3D())
SelectElement(E3D(),E1)
x=E3D()\x2D
y=E3D()\y2D
SelectElement(E3D(),E2)
LineXY(x,y,E3D()\x2D,E3D()\y2D,RGB(0,255,0)) ;/ grüne Linie
EndIf
EndProcedure
Procedure Draw2D()
StartDrawing(ImageOutput(0))
Box(0,0,480,360,0)
Plot(240,180,RGB(255,255,255))
ForEach E3D()
Calc()
UpDateVerts()
Circle(E3D()\x2D,E3D()\y2D,4,RGB(255,0,0))
Next
V2DLine(0,1)
V2DLine(1,2)
V2DLine(2,3)
V2DLine(3,0)
V2DLine(0,4)
V2DLine(1,5)
V2DLine(2,6)
V2DLine(3,7)
V2DLine(4,5)
V2DLine(5,6)
V2DLine(6,7)
V2DLine(7,4)
V2DLine(8,2)
V2DLine(8,3)
V2DLine(8,6)
V2DLine(8,7)
StopDrawing()
SetGadgetState(0,ImageID(0))
EndProcedure
Procedure createGadgets()
CreateImage(0,480,360)
ImageGadget(0,10,5,480,360,ImageID(0),#PB_Image_Border)
EndProcedure
Procedure fortlaufend()
If (ElapsedMilliseconds()-ZeitMessung)>(1000/50)
angle+0.05
If (angle<0)
angle+(2*PI)
EndIf
If (angle>(2*PI))
angle-(2*PI)
EndIf
Draw2D()
ZeitMessung=ElapsedMilliseconds()
EndIf
EndProcedure
Procedure CreateSprites()
Protected x,y
CreateSprite(0,128,128,#PB_Sprite_Texture)
CreateSprite(1,128,128,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Box(0,0,SpriteWidth(0),SpriteHeight(0),RGB(255,64,0))
Box(5,5,40,15,RGB(0,64,100))
LineXY(0,0,SpriteWidth(0),SpriteHeight(0),RGB(0,0,255))
LineXY(0,SpriteHeight(0),SpriteWidth(0),0,RGB(0,0,255))
StopDrawing()
StartDrawing(SpriteOutput(1))
Box(0,0,SpriteWidth(0),SpriteHeight(0),RGB(0,64,0))
For y=0 To 10
For x=0 To 10
Box(12*x,12*y,8,8,RGB(0,64+Random(40),100))
Next
Next
StopDrawing()
CreateSprite3D(0,0)
CreateSprite3D(1,1)
EndProcedure
Procedure X2D(E)
SelectElement(E3D(),E)
ProcedureReturn E3D()\x2D
EndProcedure
Procedure Y2D(E)
SelectElement(E3D(),E)
ProcedureReturn E3D()\y2D
EndProcedure
Procedure DrawSprites()
Start3D()
TransformSprite3D(1,X2D(9),Y2D(9),X2D(10),Y2D(10),X2D(11),Y2D(11),X2D(12),Y2D(12))
DisplaySprite3D(1,0,0)
TransformSprite3D(0,X2D(0),Y2D(0),X2D(1),Y2D(1),X2D(5),Y2D(5),X2D(4),Y2D(4))
DisplaySprite3D(0,0,0)
TransformSprite3D(0,X2D(0),Y2D(0),X2D(4),Y2D(4),X2D(7),Y2D(7),X2D(3),Y2D(3))
DisplaySprite3D(0,0,0)
TransformSprite3D(0,X2D(4),Y2D(4),X2D(5),Y2D(5),X2D(6),Y2D(6),X2D(7),Y2D(7))
DisplaySprite3D(0,0,0)
TransformSprite3D(0,X2D(0),Y2D(0),X2D(1),Y2D(1),X2D(2),Y2D(2),X2D(3),Y2D(3))
DisplaySprite3D(0,0,0)
TransformSprite3D(0,X2D(0),Y2D(0),X2D(4),Y2D(4),X2D(5),Y2D(5),X2D(1),Y2D(1))
DisplaySprite3D(0,0,0)
Stop3D()
EndProcedure
If OpenWindow(0,0,0,600,750,"FL 3D - ACHTUNG! Bei Window-Events wird 3D mit Texturen unterbrochen!",#PB_Window_ScreenCentered | #PB_Window_SystemMenu) And CreateGadgetList(WindowID(0))
InitSprite()
OpenWindowedScreen(WindowID(0),10,380,480,360,0,0,0)
InitSprite3D()
CreateSpriteS()
Sprite3DQuality(1)
createGadgets()
Draw2D()
Define Event.l, Quit, GadgetNr
Repeat
Repeat
Event=WaitWindowEvent(20)
If Event=16
Quit=1
ElseIf Event=#PB_Event_Gadget
GadgetNr=EventGadget()
EndIf
;/ fortlaufend
fortlaufend()
Until Event=0
FlipBuffers()
ClearScreen(0)
DrawSprites()
Until Quit
EndIf
Wie muss ich die 3D-Koordinaten richtig in Transformsprite3D einbringen, damit mein Würfel wie ein würfel mit richtig verformten Texturen aussieht?
