Hallo tft!
Hab mich heute ein wenig mit deinem Problem auseinandergesetzt...
Ich weiß so überhaupt nicht, ob du eine derartige Hilfe brauchtest, oder was ganz anderes gesucht hast.
Aufjedenfall hats mir auch gut getan, mal wieder meinen Kopf gebrauchen zu müssen ^^ (und das in den Ferien )
Ich weiß nicht mal wirklich, ob deine Frage auf BB oder nem anderen Programm bezogen war... =/
Aber vielleicht helfen ja meine Funktionen
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] SeedRnd MilliSecs() Graphics3D 1024,768,0,2 SetBuffer BackBuffer()
Camera=CreateCamera() Light=CreateLight() RotateEntity Light,30,60,0 PositionEntity Camera,0,5,-10
Cube=CreateCube() RotateEntity Cube,0,45,0
Timer=CreateTimer(60)
SBZ=NewBZ(0,0,-10,-2,4,10,12,5,0) SBZ2=AddBZ(SBZ,-15,2,8) SBZ2=AddBZ(SBZ2,-25,20,12) SBZ2=AddBZ(SBZ2,5,-5,5) LinkBZ(SBZ2,SBZ)
AddBZMesh(SBZ,Camera)
TestCube=CreateCube() AddBZMesh(SBZ,TestCube) TestCylinder=CreateCylinder() AddBZMesh(SBZ,TestCylinder)
PointEntity Camera,Cube
While Not KeyHit(1) If KeyDown(57) Then If Speed#<0.05 Then Speed#=Speed#+0.001 Else If Speed#>0 Then Speed#=Speed#-0.001 If Speed#<0 Then Speed#=0 EndIf
UpdateBZMesh(TestCube,0.01) PointEntity TestCube,Cube
UpdateBZMesh(TestCylinder,0.0033) CamXO#=EntityX(Camera,1) CamYO#=EntityY(Camera,1) CamZO#=EntityZ(Camera,1) UpdateBZMesh(Camera,Speed#,S) PointEntity Camera,Cube SmoothBZ(SBZ) UpdateLines() If KeyHit(28) Then S=1-S
RenderWorld DX#=CamXO#-EntityX(Camera,1) DY#=CamYO#-EntityY(Camera,1) DZ#=CamZO#-EntityZ(Camera,1) GlobalSpeed#=Sqr(DX#*DX#+DY#*DY#+DZ#*DZ#) Text 50,50,"Mit Leertaste die Kamera beschleunigen" Text 50,65,"Tatsächliche Kamera-Geschwindigkeit: "+GlobalSpeed# Text 50,80,"Tatsächliche Kamera-Geschwindigkeit mit Enter umschalten"
WaitTimer Timer Flip 0 Wend End
Function UpdateBZMesh(Mesh,TD#=0,S=0) Local BZM.BZMesh,B.BZ Local BZX1#,BZY1#,BZZ1# Local BZX2#,BZY2#,BZZ2# Local BZX3#,BZY3#,BZZ3# For BZM.BZMesh=Each BZMesh If BZM\Mesh=Mesh Then B.BZ=Object.BZ(BZM\BZ) If S=1 Then TD#=TD# T#=BZM\T#+0.01 BZX1#=B\X1#*(1.0-T#)+B\X3#*T# BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T# BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T# BZX2#=B\X3#*(1.0-T#)+B\X2#*T# BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T# BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T# BZX3#=BZX1#*(1.0-T#)+BZX2#*T# BZY3#=BZY1#*(1.0-T#)+BZY2#*T# BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T# DX#=BZX3#-EntityX(Mesh,1) DY#=BZY3#-EntityY(Mesh,1) DZ#=BZZ3#-EntityZ(Mesh,1) D#=Sqr(DX#*DX#+DY#*DY#+DZ#*DZ#) TD#=TD#/D# EndIf If S=1 Then TD#=TD#*0.01 BZM\T#=BZM\T#+TD# If BZM\T#>1 Then If B\BZ2=0 Then BZM\T#=1 If B\BZ2<>0 Then BZM\T#=BZM\T#-1:BZM\BZ=B\BZ2 EndIf If BZM\T#<0 Then If B\BZ1=0 Then BZM\T#=0 If B\BZ1<>0 Then BZM\T#=1-BZM\T#:BZM\BZ=B\BZ1 EndIf B.BZ=Object.BZ(BZM\BZ) BZX1#=B\X1#*(1.0-BZM\T#)+B\X3#*BZM\T# BZY1#=B\Y1#*(1.0-BZM\T#)+B\Y3#*BZM\T# BZZ1#=B\Z1#*(1.0-BZM\T#)+B\Z3#*BZM\T# BZX2#=B\X3#*(1.0-BZM\T#)+B\X2#*BZM\T# BZY2#=B\Y3#*(1.0-BZM\T#)+B\Y2#*BZM\T# BZZ2#=B\Z3#*(1.0-BZM\T#)+B\Z2#*BZM\T# BZX3#=BZX1#*(1.0-BZM\T#)+BZX2#*BZM\T# BZY3#=BZY1#*(1.0-BZM\T#)+BZY2#*BZM\T# BZZ3#=BZZ1#*(1.0-BZM\T#)+BZZ2#*BZM\T# PositionEntity BZM\Mesh,BZX3#,BZY3#,BZZ3# EndIf Next End Function
Function AddBZMesh(BZ,Mesh,T#=0) Local B.BZ,BZM.BZMesh Local BZX1#,BZY1#,BZZ1# Local BZX2#,BZY2#,BZZ2# Local BZX3#,BZY3#,BZZ3# B.BZ=Object.BZ(BZ) BZM.BZMesh=New BZMesh BZM\Mesh=Mesh BZM\BZ=BZ BZM\T#=T# BZX1#=B\X1#*(1.0-T#)+B\X3#*T# BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T# BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T# BZX2#=B\X3#*(1.0-T#)+B\X2#*T# BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T# BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T# BZX3#=BZX1#*(1.0-T#)+BZX2#*T# BZY3#=BZY1#*(1.0-T#)+BZY2#*T# BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T# PositionEntity Mesh,BZX3#,BZY3#,BZZ3# End Function
Function NewBZ(X1#=0,Y1#=0,Z1#=0,X2#=0,Y2#=0,Z2#=0,AX#=0,AY#=0,AZ#=0) Local B.BZ,X#,Y#,Z# B.BZ=New BZ B\X1#=X1#:B\Y1#=Y1#:B\Z1#=Z1# B\X2#=X2#:B\Y2#=Y2#:B\Z2#=Z2# X#=(X1#+X2#)/2 Y#=(Y1#+Y2#)/2 Z#=(Z1#+Z2#)/2 B\X3#=X#+AX#:B\Y3#=Y#+AY#:B\Z3#=Z#+AZ# DrawLine(B.BZ) Return Handle(B.BZ) End Function
Function LinkBZ(BZ1,BZ2) Local B1.BZ,B2.BZ,B.BZ Local AX1#,AY1#,AZ1# Local AX2#,AY2#,AZ2# Local X#,Y#,Z# B1.BZ=Object.BZ(BZ1) B2.BZ=Object.BZ(BZ2) AX1#=B1\X2#+(B1\X2#-B1\X3#) AY1#=B1\Y2#+(B1\Y2#-B1\Y3#) AZ1#=B1\Z2#+(B1\Z2#-B1\Z3#) AX2#=B2\X1#+(B2\X1#-B2\X3#) AY2#=B2\Y1#+(B2\Y1#-B2\Y3#) AZ2#=B2\Z1#+(B2\Z1#-B2\Z3#) X#=(AX1#+AX2#)/2 Y#=(AY1#+AY2#)/2 Z#=(AZ1#+AZ2#)/2 BZ=AddBZ(BZ1,X#,Y#,Z#) B1.BZ=Object.BZ(BZ) B.BZ=New BZ B\X1#=X# B\Y1#=Y# B\Z1#=Z# B\X2#=B2\X1# B\Y2#=B2\Y1# B\Z2#=B2\Z1# B\X3#=B1\X2#+(B1\X2#-B1\X3#) B\Y3#=B1\Y2#+(B1\Y2#-B1\Y3#) B\Z3#=B1\Z2#+(B1\Z2#-B1\Z3#) B\BZ1=Handle(B1.BZ) B\BZ2=Handle(B2.BZ) B1\BZ2=Handle(B.BZ) B2\BZ1=Handle(B.BZ) BL.BZL=New BZL BL\BZ1=Handle(B1.BZ) BL\BZ2=Handle(B.BZ) B\BZL=Handle(BL.BZL) DrawLine(B.BZ) End Function
Function AddBZ(BZ,X2#=0,Y2#=0,Z2#=0) Local BZSource.BZ,B.BZ BZSource.BZ=Object.BZ(BZ) B.BZ=New BZ B\X1#=BZSource\X2# B\Y1#=BZSource\Y2# B\Z1#=BZSource\Z2# B\X2#=X2# B\Y2#=Y2# B\Z2#=Z2# B\X3#=BZSource\X2#+(BZSource\X2#-BZSource\X3#) B\Y3#=BZSource\Y2#+(BZSource\Y2#-BZSource\Y3#) B\Z3#=BZSource\Z2#+(BZSource\Z2#-BZSource\Z3#) B\BZ1=BZ BZSource\BZ2=Handle(B.BZ) DrawLine(B.BZ) Return Handle(B.BZ) End Function
Function BZAX#(BZ) Local B.BZ B.BZ=Object.BZ(BZ) Return B\X3# End Function Function BZAY#(BZ) Local B.BZ B.BZ=Object.BZ(BZ) Return B\Y3# End Function Function BZAZ#(BZ) Local B.BZ B.BZ=Object.BZ(BZ) Return B\Z3# End Function
Function PositionBZA(BZ,X#=0,Y#=0,Z#=0) Local B.BZ B.BZ=Object.BZ(BZ) B\X3#=X# B\Y3#=Y# B\Z3#=Z# End Function
Function MoveBZA(BZ,XV#=0,YV#=0,ZV#=0) Local B.BZ,B1.BZ,B2.BZ,BO.BZ B.BZ=Object.BZ(BZ) B\X3#=B\X3#+XV# B\Y3#=B\Y3#+YV# B\Z3#=B\Z3#+ZV# End Function Function FreeBZ(BZ) Local B.BZ,BL.BZL,B1.BZ,BZM.BZMesh B.BZ=Object.BZ(BZ) If B\BZ1<>0 Then B1.BZ=Object.BZ(B\BZ1) B1\BZ2=0 EndIf If B\BZ2<>0 Then B1.BZ=Object.BZ(B\BZ2) B1\BZ1=0 EndIf If B\BZL<>0 Then BL.BZL=Object.BZL(B\BZL) B1.BZ=Object.BZ(BL\BZ1) B1\BZL=0 B1.BZ=Object.BZ(BL\BZ2) B1\BZL=0 Delete BL.BZL EndIf For Index=0 To 49 If B\S[Index]<>0 Then FreeEntity B\S[Index] EndIf Next For BZM.BZMesh=Each BZMesh If BZM\BZ=BZ Then Delete BZM.BZMesh EndIf Next Delete B.BZ End Function
Function SmoothBZ(BZ) Local EoBZ Local B1.BZ,B2.BZ,B.BZ,BO.BZ Local AX1#,AY1#,AZ1# Local AX2#,AY2#,AZ2# Local X#,Y#,Z# B.BZ=Object.BZ(BZ) BO.BZ=B.BZ Repeat If BO\BZ1<>0 Then B2.BZ=Object.BZ(BO\BZ1) If B2\BZL<>0 Then BL.BZL=Object.BZL(B2\BZL) B3.BZ=Object.BZ(BL\BZ1):B4.BZ=Object.BZ(BL\BZ2) If B3\BZ1<>0 And B4\BZ2<>0 Then B1.BZ=Object.BZ(B3\BZ1) AX1#=B1\X2#+(B1\X2#-B1\X3#) AY1#=B1\Y2#+(B1\Y2#-B1\Y3#) AZ1#=B1\Z2#+(B1\Z2#-B1\Z3#) B2.BZ=Object.BZ(B4\BZ2) AX2#=B2\X1#+(B2\X1#-B2\X3#) AY2#=B2\Y1#+(B2\Y1#-B2\Y3#) AZ2#=B2\Z1#+(B2\Z1#-B2\Z3#) X#=(AX1#+AX2#)/2:Y#=(AY1#+AY2#)/2:Z#=(AZ1#+AZ2#)/2 B3\X2#=X#:B3\Y2#=Y#:B3\Z2#=Z# B4\X1#=X#:B4\Y1#=Y#:B4\Z1#=Z# B3\X3#=AX1#:B3\Y3#=AY1#:B3\Z3#=AZ1# B4\X3#=AX2#:B4\Y3#=AY2#:B4\Z3#=AZ2# EndIf EoBZ=True Else EoBZ=True EndIf If EoBZ=False Then B2\X3#=BO\X1#+(BO\X1#-BO\X3#) B2\Y3#=BO\Y1#+(BO\Y1#-BO\Y3#) B2\Z3#=BO\Z1#+(BO\Z1#-BO\Z3#) BO.BZ=B2.BZ EndIf Else If BO\BZ1=0 Then EoBZ=True EndIf Until EoBZ=True BO.BZ=B.BZ EoBZ=False Repeat If BO\BZ2<>0 Then B2.BZ=Object.BZ(BO\BZ2) If B2\BZL<>0 Then BL.BZL=Object.BZL(B2\BZL) B3.BZ=Object.BZ(BL\BZ1):B4.BZ=Object.BZ(BL\BZ2) If B3\BZ1<>0 And B4\BZ2<>0 Then B1.BZ=Object.BZ(B3\BZ1) AX1#=B1\X2#+(B1\X2#-B1\X3#) AY1#=B1\Y2#+(B1\Y2#-B1\Y3#) AZ1#=B1\Z2#+(B1\Z2#-B1\Z3#) B2.BZ=Object.BZ(B4\BZ2) AX2#=B2\X1#+(B2\X1#-B2\X3#) AY2#=B2\Y1#+(B2\Y1#-B2\Y3#) AZ2#=B2\Z1#+(B2\Z1#-B2\Z3#) X#=(AX1#+AX2#)/2:Y#=(AY1#+AY2#)/2:Z#=(AZ1#+AZ2#)/2 B3\X2#=X#:B3\Y2#=Y#:B3\Z2#=Z# B4\X1#=X#:B4\Y1#=Y#:B4\Z1#=Z# B3\X3#=AX1#:B3\Y3#=AY1#:B3\Z3#=AZ1# B4\X3#=AX2#:B4\Y3#=AY2#:B4\Z3#=AZ2# EndIf EoBZ=True Else EoBZ=True EndIf If EoBZ=False Then B2\X3#=BO\X2#+(BO\X2#-BO\X3#) B2\Y3#=BO\Y2#+(BO\Y2#-BO\Y3#) B2\Z3#=BO\Z2#+(BO\Z2#-BO\Z3#) BO.BZ=B2.BZ EndIf Else If BO\BZ1=0 Then EoBZ=True EndIf Until EoBZ=True End Function
Function DrawLine(B.BZ) For Index=0 To 49 T#=Float(Index)/49 BZX1#=B\X1#*(1.0-T#)+B\X3#*T# BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T# BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T# BZX2#=B\X3#*(1.0-T#)+B\X2#*T# BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T# BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T# BZX3#=BZX1#*(1.0-T#)+BZX2#*T# BZY3#=BZY1#*(1.0-T#)+BZY2#*T# BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T# B\S[Index]=CreateSphere(8) ScaleEntity B\S[Index],0.1,0.1,0.1 PositionEntity B\S[Index],BZX3#,BZY3#,BZZ3# EntityColor B\S[Index],255,100,100 Next End Function
Function UpdateLine(B.BZ) Local Index,T# Local BZX1#,BZY1#,BZZ1# Local BZX2#,BZY2#,BZZ2# Local BZX3#,BZY3#,BZZ3# For Index=0 To 49 T#=Float(Index)/49 BZX1#=B\X1#*(1.0-T#)+B\X3#*T# BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T# BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T# BZX2#=B\X3#*(1.0-T#)+B\X2#*T# BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T# BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T# BZX3#=BZX1#*(1.0-T#)+BZX2#*T# BZY3#=BZY1#*(1.0-T#)+BZY2#*T# BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T# PositionEntity B\S[Index],BZX3#,BZY3#,BZZ3# Next End Function
Function UpdateLines() Local Index,T# Local BZX1#,BZY1#,BZZ1# Local BZX2#,BZY2#,BZZ2# Local BZX3#,BZY3#,BZZ3# For B.BZ=Each BZ For Index=0 To 49 T#=Float(Index)/49 BZX1#=B\X1#*(1.0-T#)+B\X3#*T# BZY1#=B\Y1#*(1.0-T#)+B\Y3#*T# BZZ1#=B\Z1#*(1.0-T#)+B\Z3#*T# BZX2#=B\X3#*(1.0-T#)+B\X2#*T# BZY2#=B\Y3#*(1.0-T#)+B\Y2#*T# BZZ2#=B\Z3#*(1.0-T#)+B\Z2#*T# BZX3#=BZX1#*(1.0-T#)+BZX2#*T# BZY3#=BZY1#*(1.0-T#)+BZY2#*T# BZZ3#=BZZ1#*(1.0-T#)+BZZ2#*T# PositionEntity B\S[Index],BZX3#,BZY3#,BZZ3# Next Next End Function
Type BZMesh Field Mesh,BZ,T# End Type Type BZ Field S[49] Field X1#,Y1#,Z1# Field X2#,Y2#,Z2# Field X3#,Y3#,Z3# Field BZ1,BZ2,BZL End Type Type BZL Field BZ1,BZ2 End Type
|