Kleines Tool für Collision Sphere to Box und Pickmode .
Vielen von euch gehen die AnimMeshes bestimmt auch auf die Nerven .
Dieses kleine Programm lädt ein AnimMesh , also was ne Hirachie hat
und setzt dafür die CollisionsBox/Radius Parameter und man kann
diese dann speichern und wieder laden im Spiel .
Fürn Dateidialog hatte ich keine Lust , also die 3ds Namen muß man
selber angeben .
Bei komplexen Objekten wie z.B. Häuser oder auch nur Bäume
nimmt es eine Menge Arbeit ab !
Das Prog. erklärt sich von selbst ...
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] .Top
Graphics3D 800,600,16,2 SetBuffer BackBuffer() AppTitle "Collisions Box Editor , M.Rauch"
Global cam=CreateCamera() CameraClsColor cam,128,128,128 CameraRange cam,1,100000 PositionEntity cam,0,168,-1500 TurnEntity cam,10,0,0
Global eColliTest=CreateSphere(16) ScaleMesh eColliTest,0.5,0.5,0.5 ScaleMesh eColliTest,50,50,50 EntityAlpha eColliTest,1 EntityColor eColliTest,0,255,0 EntityFX eColliTest,1 EntityType eColliTest,1 EntityRadius eColliTest,25
Type ColliType Field Entity Field Name$ Field EType Field Pickmode Field BoxX# Field BoxY# Field BoxZ# Field BoxW# Field BoxH# Field BoxD# Field Radius# Field x,y End Type Global Colli.ColliType
Global eSphere=CreateSphere(16) ScaleMesh eSphere,0.5,0.5,0.5 EntityAlpha eSphere,0.5 EntityColor eSphere,255,255,0 EntityFX eSphere,1
Global eCube=CreateCube() ScaleMesh eCube,0.5,0.5,0.5 PositionMesh eCube,MeshWidth(eCube)/2.0,MeshWidth(eCube)/2.0,MeshDepth(eCube)/2.0 EntityAlpha eCube,0.5 EntityColor eCube,255,255,0 EntityFX eCube,1
.Meshes
fi$="Obj\Inventar\Inventar1"
ex$="3ds" e=LoadAnimMesh(fi$+"."+ex$) NameEntity e,"Root" EntityColli e
Collisions 1,2,3,2
.MainLoop
While Not KeyHit(1)
Local xColli.ColliType
Local GoX# Local GoY# Local GoZ#
If xColli=Null Then HideEntity eSphere HideEntity eCube Else ShowEntity eSphere ShowEntity eCube PositionEntity eSphere,EntityX(xColli\Entity,True),EntityY(xColli\Entity,True),EntityZ(xColli\Entity,True) PositionEntity eCube,EntityX(xColli\Entity,True),EntityY(xColli\Entity,True),EntityZ(xColli\Entity,True) RotateEntity eCube,EntityPitch(xColli\Entity,True),EntityYaw(xColli\Entity,True),EntityRoll(xColli\Entity,True) MoveEntity eCube,xColli\BoxX,xColli\BoxY,xColli\BoxZ
ScaleEntity eSphere,xColli\Radius*2.0,xColli\Radius*2.0,xColli\Radius*2.0 ScaleEntity eCube,xColli\BoxW,xColli\BoxH,xColli\BoxD,True EndIf
If MouseHit(1) Then pe=CameraPick(cam,mx,my) If pe Then PositionEntity eColliTest,EntityX(Cam),EntityY(Cam),EntityZ(Cam) PointEntity eColliTest,pe,0 ResetEntity eColliTest GoX=PickedX() GoY=PickedY() GoZ=PickedZ() EndIf xColli=ColliFind(pe) EndIf
If EntityX(eColliTest)<>GoX Then MoveEntity eColliTest,-(EntityX(eColliTest)-GoX)/50.0,0,0 If EntityY(eColliTest)<>GoY Then MoveEntity eColliTest,0,-(EntityY(eColliTest)-GoY)/50.0,0 If EntityZ(eColliTest)<>GoZ Then MoveEntity eColliTest,0,0,-(EntityZ(eColliTest)-GoZ)/50.0
UpdateWorld RenderWorld
mx=MouseX() my=MouseY()
If KeyDown(200) Then MoveEntity Cam,0,2,0 EndIf
If KeyDown(208) Then MoveEntity Cam,0,-2,0 EndIf
If KeyDown(203) Then MoveEntity Cam,-2,0,0 EndIf
If KeyDown(205) Then MoveEntity Cam,2,0,0 EndIf
If KeyHit(201) Then If xColli=Null Then xColli.ColliType=First ColliType Else xColli =Before xColli EndIf EndIf
If KeyHit(209) Then If xColli=Null Then xColli.ColliType=Last ColliType Else xColli =After xColli EndIf EndIf
If KeyHit(199) Then xColli.ColliType=First ColliType EndIf
If KeyHit(207) Then xColli.ColliType=Last ColliType EndIf
If KeyHit(60) Then ColliSave(fi$) EndIf
If xColli<>Null Then Text 0,0,xColli\Name Text 0,20,PickModeName(xColli\Pickmode) If EntityClass(xColli\Entity)="Mesh" Then Text 0,40,"Surfaces "+CountSurfaces(xColli\Entity) Text 0,60,"Vertices "+CountAllVertices(xColli\Entity) EndIf Text 0,80,"F2 = '"+fi$+".cbb' Datei speichern" Text 0,100,"Box XxYxZ "+xColli\BoxX+" x "+xColli\BoxY+" x "+xColli\BoxZ Text 0,120,"Box WxHxD "+xColli\BoxW+" x "+xColli\BoxH+" x "+xColli\BoxD EndIf
Text 0,GraphicsHeight()-20,"Benutze Pos1,Ende,Bild hoch/runter,Cursor Tasten,L Maus Taste,Esc=Ende" Delay 10
Flip Wend End
Function EntityColli(e)
If e=0 Then Return
Colli.ColliType=New ColliType Colli\Entity=e If EntityClass(e)="Mesh" And CountAllVertices(e)>0 Then EntityAlpha e,0.5 If CountAllVertices(e)<=4 Then Colli\Pickmode=2 Else Colli\Pickmode=3 EndIf Colli\EType=2 SetBox(Colli) Colli\Radius=Sqr(MeshWidth(e)*MeshWidth(e)+MeshHeight(e)*MeshHeight(e)+MeshDepth(e)*MeshDepth(e)) Colli\Radius=Colli\Radius/2.0 Else Colli\Pickmode=0 Colli\EType=0 Colli\BoxX=EntityX(e)-0.5 Colli\BoxY=EntityY(e)-0.5 Colli\BoxZ=EntityZ(e)-0.5 Colli\BoxW=1 Colli\BoxH=1 Colli\BoxD=1 Colli\Radius=1 EndIf
EntityPickMode e,Colli\Pickmode EntityType e,Colli\EType EntityBox e,Colli\BoxX,Colli\BoxY,Colli\BoxZ,Colli\BoxW,Colli\BoxH,Colli\BoxD EntityRadius e,Colli\Radius
Colli\Name=EntityName(e)
Local i,c For i=1 To CountChildren(e) c=GetChild(e,i) EntityColli(c) Next
End Function
Function PickModeName$(pm)
Select pm Case 0 :Return "kein" Case 1 :Return "Kugel" Case 2 :Return "Poly" Case 3 :Return "Box" End Select
End Function
Function ColliFind.ColliType(e)
For Colli.ColliType =Each ColliType If e=Colli\Entity Then Return Colli Next
End Function
Function CountAllVertices(Entity)
If Entity=0 Then Return 0
Local i,s,c=0 If CountSurfaces(Entity)>0 Then For i=1 To CountSurfaces(Entity) s=GetSurface(Entity,i) c=c+CountVertices(s) Next EndIf
Return c
End Function
Function SetBox(Colli.ColliType)
Local Entity=Colli\Entity
If Entity=0 Then Return 0
Local mx1#= 3.4*10^38,my1#= 3.4*10^38,mz1#= 3.4*10^38 Local mx2#=-3.4*10^38,my2#=-3.4*10^38,mz2#=-3.4*10^38 Local i,vi,s Local check=False
If CountSurfaces(Entity)>0 Then For i=1 To CountSurfaces(Entity) s=GetSurface(Entity,i) If CountVertices(s)=>1 Then For vi = 0 To CountVertices(s)-1 TFormVector VertexX(s,vi),VertexY(s,vi),VertexZ(s,vi),Entity,Entity vx=TFormedX() vy=TFormedY() vz=TFormedZ() If VX<mx1 Then mx1=VX If VY<my1 Then my1=VY If VZ<mz1 Then mz1=VZ If VX>mx2 Then mx2=VX If VY>my2 Then my2=VY If VZ>mz2 Then mz2=VZ check=True Next EndIf Next EndIf
If check=False Then Return 0
Local mw#,mh#,md#,xp#,yp#,zp#
mw# = Abs(mx2-mx1) mh# = Abs(my2-my1) md# = Abs(mz2-mz1)
Colli\BoxW=mw Colli\BoxH=mh Colli\BoxD=md If Colli\BoxW<1.0 Then Colli\BoxW=1.0 If Colli\BoxH<1.0 Then Colli\BoxH=1.0 If Colli\BoxD<1.0 Then Colli\BoxD=1.0 Colli\BoxX=mx1 Colli\BoxY=my1 Colli\BoxZ=mz1
Return 1 End Function
Function ColliSave(fi$)
Local f$=fi$ + ".cbb" Local fh
Local c=0 For Colli.ColliType =Each ColliType c=c+1 Next
fh=WriteFile(f$) If fh Then WriteLine fh,"BlitzBasic3D Collisions Parameter" WriteLine fh,"V1.0" WriteInt fh,c
For Colli.ColliType =Each ColliType WriteString fh,Colli\Name$ WriteInt fh,Colli\EType WriteInt fh,Colli\Pickmode WriteFloat fh,Colli\BoxX# WriteFloat fh,Colli\BoxY# WriteFloat fh,Colli\BoxZ# WriteFloat fh,Colli\BoxW# WriteFloat fh,Colli\BoxH# WriteFloat fh,Colli\BoxD# WriteFloat fh,Colli\Radius# Next
CloseFile fh EndIf
End Function
.IncludesCBB
Function ColliLoad(Entity,File$)
If Entity=0 Then DebugLog "ERR ColliLoad Entity=0 !?" Return 0 EndIf
If Len(File$)=0 Then DebugLog "ERR ColliLoad File$='' !?" Return 0 EndIf
NameEntity Entity,"Root"
Local fh,c,i Local e Local eName$ Local eType Local ePickMode Local eBoxX# Local eBoxY# Local eBoxZ# Local eBoxW# Local eBoxH# Local eBoxD# Local eRadius#
fh=ReadFile(File) If fh Then DebugLog "ColliLoad read file "+File$ Local h$=ReadLine(fh) Local v$=ReadLine(fh) DebugLog h$+" "+v$
If v$="V1.0" Then c=ReadInt(fh) For i=1 To c eName$ =ReadString(fh) eType =ReadInt(fh) ePickMode=ReadInt(fh) eBoxX =ReadFloat(fh) eBoxY =ReadFloat(fh) eBoxZ =ReadFloat(fh) eBoxW =ReadFloat(fh) eBoxH =ReadFloat(fh) eBoxD =ReadFloat(fh) eRadius =ReadFloat(fh)
e=EntityFindByName(Entity,eName$) If e Then EntityPickMode e,ePickMode EntityType e,eType EntityBox e,eBoxX,eBoxY,eBoxZ,eBoxW,eBoxH,eBoxD EntityRadius e,eRadius Else DebugLog "ERR ColliLoad Entity '"+eName$+"' konnte nicht zugeordnet werden !? EndIf Next Else DebugLog "ERR ColliLoad this function are load only V1.0 .cbb files , you try to load version " +v$ EndIf
CloseFile fh
DebugLog "OK" Return 1 Else DebugLog "ERR ColliLoad can't load file "+File$ EndIf
Return 0
End Function
Function EntityFindByName(e,Name$)
Local ex=0
If e=0 Then Return 0
If EntityName(e)=Name$ Then Return e
Local c,i For i=1 To CountChildren(e) c=GetChild(e,i) ex=EntityFindByName(c,Name$) If ex Then Exit Next
Return ex
End Function
|