Seite 2 von 2

Re: Fragen zum 3D Beispiel FPSFirstPerson.pb

Verfasst: 01.08.2013 20:37
von Makke
Hi,

habe es auf relative Bewegung umgestellt, hat aber leider keinen Erfolg gebracht, ausser, wenn ich dann mit eingeschalteter Physic-Engine den Spieler (die sichtbare Figur) nicht bewege, fliegt er nach oben ohne das er einen Physikalischen Körper zugewiesen bekommen hat. Sehr komisch das ganze.

Zur Hitbox:

Ich habe das Mesh ja selber animiert und umgewandelt, also habe ich den Bones (Knochen) vernünftige Namen gegeben z.B. Body_Hip, Finger_Fore_left, Leg_Knee_Right usw. die Position dieser Knochen kann man mit EntityBoneX(Entity, BoneName) abfragen. an die entsprechenden Bones (Kopf, Arme, Körper, Ober- und Unterschenkel) habe ich dann einfach per Purebasic erstellte Meshes (Cubes bzw. Sphere beim Kopf) angehängt und aktualisiere die nach der Spielerfigurbewegung.

Hier mal wie die Erstellung der Hitbox in meinem Code aussieht:

Code: Alles auswählen

Procedure.i Player_CreateHitboxPart(hEntity.i, hParentEntity.i, sBone.s, hMesh.i, iPhysicBody.i, *offset.fVector3, hMaterial.i=0, scaleX.f=1.0, scaleY.f=1.0, scaleZ.f=1.0, rotate.b=#True)
  Shared      Player
  Shared      DebugWorld
  Protected.f scale = Player\entityScaleFactor
  Protected.f rota  = Player\entityRotationCorrector
  Protected.i result, materialID
  
  If hMaterial = 0
    materialID = #PB_Material_None
  Else
    materialID = MaterialID(hMaterial)
  EndIf
  
  result = CreateEntity(hEntity, MeshID(hMesh), materialID)
  If hEntity = #PB_Any
    hEntity = result
  EndIf
  EntityRenderMode(hEntity, #PB_Entity_NoShadows)
  scaleX * scale : scaleY * scale : scaleZ * scale
  ScaleEntity(hEntity, scaleX, scaleY, scaleZ, #PB_Absolute)
  MoveEntity(hEntity, EntityBoneX(hParentEntity, sBone, *offset\x, *offset\y, *offset\z), EntityBoneY(hParentEntity, sBone, *offset\x, *offset\y, *offset\z), EntityBoneZ(hParentEntity, sBone, *offset\x, *offset\y, *offset\z), #PB_Absolute)
  If rotate
    RotateEntity(hEntity, 180+EntityBonePitch(hParentEntity, sBone), 180+EntityBoneYaw(hParentEntity, sBone), 180+EntityBoneRoll(hParentEntity, sBone), #PB_Absolute)
    Debug EntityBonePitch(hParentEntity, sBone)
    Debug EntityBoneYaw(hParentEntity, sBone)
    Debug EntityBoneRoll(hParentEntity, sBone)
  EndIf
  EntityPhysicBody(hEntity, iPhysicBody, 1, 0, 0)
  If DebugWorld = 0
    HideEntity(hEntity, #True)
  EndIf
  
  ProcedureReturn result
    
EndProcedure

Procedure Player_CreateHitbox()
  Shared Player
  Protected.i tempTexture, tempMaterial, tempMesh, tempMesh2
  
  tempTexture = CreateTexture(#PB_Any, 1, 1)
  StartDrawing(TextureOutput(tempTexture))
  Plot(0, 0, RGB(255,0,255))
  StopDrawing()
  tempMaterial = CreateMaterial(#PB_Any, TextureID(tempTexture))
  tempMesh = CreateCube(#PB_Any, 20)
  tempMesh2 = CreateSphere(#PB_Any, 10)
  
  With Player\Hitbox
    
    \boneBody   = "body17"
    \OffsetBody\x = 0
    \OffsetBody\y = 0
    \OffsetBody\z = 4
    \entityBody = Player_CreateHitboxPart(#PB_Any, Player\entity, \boneBody, tempMesh, #PB_Entity_BoxBody, \OffsetBody, tempMaterial, 1.6, 3.2, 1.4, #False)
        
    \boneHead   = "head1"
    \OffsetHead\x = 0
    \OffsetHead\y = 4
    \OffsetHead\z = -2
    \entityHead = Player_CreateHitboxPart(#PB_Any, Player\entity, \boneHead, tempMesh2, #PB_Entity_SphereBody, \OffsetHead, tempMaterial, 1.0, 1.4, 1.2, #False)
   .
   .
   .
Das einzige was überhaupt nicht funktionieren will ist die korrekte Rotation, die Funktionen EntityBoneYaw() usw. geben alle irgendwie immer das gleiche aus (39.19...usw.).

Ich hoffe die Vorgehensweise ist jetzt einigermaßen klar. Ansosnten frag :)

Re: Fragen zum 3D Beispiel FPSFirstPerson.pb

Verfasst: 02.08.2013 08:32
von Chimorin
Könnte man nicht auch die Beine, Arme, Kopf und Körper gesondert als Mesh benutzen?
Ich werde mal das probieren, aber danke fürs Teilen, sieht gut aus :)

EDIT: Hast du das MoveEntity() in einem Thread? Wenn ja, gibt's da Probleme. Nach oben wegfliegen heißt ja, dass immer wieder Weg in Y-Richtung zur derzeitigen Höhe hinzuaddiert wird, ist dies in deinem Fall so?

Re: Fragen zum 3D Beispiel FPSFirstPerson.pb

Verfasst: 02.08.2013 13:31
von Makke
Hi,

nein, mit Threads arbeite ich nicht.

Evtl. schreibe ich das ganze nochmal um (ähnlich dem FPS Beispiel) und schaue wie es sich dann verhält. Problem wird einfach sein, das ich ziemlich viele Abfragen drin habe (Player_OnGround(), Player_CollideForward() usw.), ich denke das wird sich alles beissen, aber mal schauen.

Das FPS Beispiel zeigt ja das es geht, evtl. liegt der Fehler in der (meiner) Programmierung oder man muss auf irgendwas achten bei der Levelerstellung. Trotzdem danke für Deine Tips.

Re: Fragen zum 3D Beispiel FPSFirstPerson.pb

Verfasst: 08.09.2013 09:51
von Schobaer
Moin Bananenefreak,
habe das gleiche Problem und noch nicht wirklich eine Lösung gefunden. Die Bewegung ist kein Problem: Camera bewegen und das Entity halt dahin wo die Camera ist. Nur geht die Camera durch die Wände. Habe Physik aktiviert, das Entity hüpft (fällt runter auf den Boden und mit ihm die Camera), alles gut. Und dann bewege ich die Camera munter durch den Boden und die Wände wo vorher noch die Physik gegriffen hat. Was muss man tun?

Re: Fragen zum 3D Beispiel FPSFirstPerson.pb

Verfasst: 08.09.2013 12:14
von Chimorin
@Schobaer:
Mach doch einen eigenen Thread auf und poste gleich einen lauffähigen Codeschnipsel.

Re: Fragen zum 3D Beispiel FPSFirstPerson.pb

Verfasst: 17.09.2013 16:44
von Makke
Hallo,

das ist jetzt nur ein Tip, ich glaube aber, das Begrenzungen die nur aus Planes bestehen (also ohne Tiefe) die Physikengine an ihre Grenzen bringt, wohingegen Cubes gut funktionieren. In einer 3rd-Person Ansicht kann man das ganz gut sehen, dass die Spielerfigur teilweise in ein Plane eintaucht.

Wenn gewünscht kann ich dazu mal einen Beispielcode posten, allerdings benötigt man dann eine "Level"-Datei aus Planes und aus Cubes um den Unterschied zu sehen.