Skip to content
Snippets Groups Projects
Commit 11c13dac authored by Qurabi's avatar Qurabi
Browse files

Ein paar Änderungen nach dem Feedback von Jonathan durchgeführt.

Dieser Commit funktioniert, aber die Methode MultiLineTraces muss geändert werden und das Problem, eine schmale Rampe hochzugehen muss ncoh gelöst werden.
parent e9d66463
No related branches found
No related tags found
No related merge requests found
...@@ -279,10 +279,9 @@ void AVirtualRealityPawn::Tick(float DeltaSeconds) ...@@ -279,10 +279,9 @@ void AVirtualRealityPawn::Tick(float DeltaSeconds)
DeltaTime = DeltaSeconds; DeltaTime = DeltaSeconds;
SetCapsuleColliderCharacterSizeVR(); SetCapsuleColliderCharacterSizeVR();
if (IsColliderOnGround()) { MoveByGravityOrStepUp(DeltaSeconds);
VRClimbStepUp(DeltaSeconds); CheckForPhysWalkingCollision();
PhysWalkingMode();
}
// if an actor is grabbed and a behavior is defined move move him accordingly // if an actor is grabbed and a behavior is defined move move him accordingly
if (GrabbedActor != nullptr) if (GrabbedActor != nullptr)
{ {
...@@ -420,13 +419,14 @@ void AVirtualRealityPawn::SetCapsuleColliderCharacterSizeVR() ...@@ -420,13 +419,14 @@ void AVirtualRealityPawn::SetCapsuleColliderCharacterSizeVR()
{ {
float ColliderHeight = CharachterSize - MaxStepHeight; float ColliderHeight = CharachterSize - MaxStepHeight;
float ColliderHalfHeight = ColliderHeight / 2.0f; float ColliderHalfHeight = ColliderHeight / 2.0f;
if (ColliderHalfHeight < 40.0f) float ColliderRadius = 40.0f;
{//Collider is an Sphere if (ColliderHalfHeight <= ColliderRadius)
{//Make the collider to a Sphere
CapsuleColliderComponent->SetCapsuleSize(ColliderHalfHeight, ColliderHalfHeight); CapsuleColliderComponent->SetCapsuleSize(ColliderHalfHeight, ColliderHalfHeight);
} }
else else
{ {//Make the collider to a Capsule
CapsuleColliderComponent->SetCapsuleSize(40.0f, ColliderHalfHeight); CapsuleColliderComponent->SetCapsuleSize(ColliderRadius, ColliderHalfHeight);
} }
CapsuleColliderComponent->SetWorldLocation(CameraComponent->GetComponentLocation()); CapsuleColliderComponent->SetWorldLocation(CameraComponent->GetComponentLocation());
...@@ -440,11 +440,11 @@ void AVirtualRealityPawn::SetCapsuleColliderCharacterSizeVR() ...@@ -440,11 +440,11 @@ void AVirtualRealityPawn::SetCapsuleColliderCharacterSizeVR()
} }
} }
void AVirtualRealityPawn::PhysWalkingMode() void AVirtualRealityPawn::CheckForPhysWalkingCollision()
{ {
FVector CurrentCameraPosition = CameraComponent->GetComponentLocation(); FVector CurrentCameraPosition = CameraComponent->GetComponentLocation();
FVector Direction = CurrentCameraPosition - LastCameraPosition; FVector Direction = CurrentCameraPosition - LastCameraPosition;
Direction.Z = 0.0f; Direction.Z = 0.0f;//walking
FHitResult FHitResultPhys; FHitResult FHitResultPhys;
CapsuleColliderComponent->AddWorldOffset(Direction, true, &FHitResultPhys); CapsuleColliderComponent->AddWorldOffset(Direction, true, &FHitResultPhys);
...@@ -456,7 +456,7 @@ void AVirtualRealityPawn::PhysWalkingMode() ...@@ -456,7 +456,7 @@ void AVirtualRealityPawn::PhysWalkingMode()
void AVirtualRealityPawn::VRWalkingMode(float Value, FVector Direction) void AVirtualRealityPawn::VRWalkingMode(float Value, FVector Direction)
{ {
Direction.Z = 0.0f;//Not falling/flying Direction.Z = 0.0f;//walking
FVector End = (Direction * GetFloatingPawnMovement()->GetMaxSpeed()); FVector End = (Direction * GetFloatingPawnMovement()->GetMaxSpeed());
FHitResult FHitResultVR; FHitResult FHitResultVR;
CapsuleColliderComponent->AddWorldOffset(End* DeltaTime*Value, true, &FHitResultVR); CapsuleColliderComponent->AddWorldOffset(End* DeltaTime*Value, true, &FHitResultVR);
...@@ -477,20 +477,20 @@ bool AVirtualRealityPawn::IsColliderOnGround() ...@@ -477,20 +477,20 @@ bool AVirtualRealityPawn::IsColliderOnGround()
return false; return false;
} }
void AVirtualRealityPawn::VRClimbStepUp(float DeltaSeconds) void AVirtualRealityPawn::MoveByGravityOrStepUp(float DeltaSeconds)
{ {
FVector StartLineTraceUnderCollider = CapsuleColliderComponent->GetComponentLocation(); FVector StartLineTraceUnderCollider = CapsuleColliderComponent->GetComponentLocation();
StartLineTraceUnderCollider.Z -= CapsuleColliderComponent->GetScaledCapsuleHalfHeight(); StartLineTraceUnderCollider.Z -= CapsuleColliderComponent->GetScaledCapsuleHalfHeight();
FHitResult HitDetailsMultiLineTrace = CreateMultiLineTrace(FVector(0, 0, -1), StartLineTraceUnderCollider, CapsuleColliderComponent->GetScaledCapsuleRadius() / 2.0f, false); FHitResult HitDetailsMultiLineTrace = CreateMultiLineTrace(FVector(0, 0, -1), StartLineTraceUnderCollider, CapsuleColliderComponent->GetScaledCapsuleRadius() / 2.0f, false);
float DiffernceDistance = abs(MaxStepHeight - HitDetailsMultiLineTrace.Distance); float DiffernceDistance = abs(MaxStepHeight - HitDetailsMultiLineTrace.Distance);
static float SumUpSteppingSpeed = 0.0f; static float UpSteppingAcceleration = 0.0f;
//Going up //Going up
if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance < MaxStepHeight)) if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance < MaxStepHeight))
{ {
SumUpSteppingSpeed += UpSteppingSpeed * DeltaSeconds; UpSteppingAcceleration += UpSteppingSpeed * DeltaSeconds;
if (SumUpSteppingSpeed*DeltaSeconds < DiffernceDistance) if (UpSteppingAcceleration*DeltaSeconds < DiffernceDistance)
{ {
RootComponent->AddLocalOffset(FVector(0.f, 0.f, +SumUpSteppingSpeed * DeltaSeconds)); RootComponent->AddLocalOffset(FVector(0.f, 0.f, +UpSteppingAcceleration * DeltaSeconds));
} }
else else
{ {
...@@ -500,10 +500,10 @@ void AVirtualRealityPawn::VRClimbStepUp(float DeltaSeconds) ...@@ -500,10 +500,10 @@ void AVirtualRealityPawn::VRClimbStepUp(float DeltaSeconds)
//Falling, Gravity, Going down //Falling, Gravity, Going down
else if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance > MaxStepHeight) || HitDetailsMultiLineTrace.Actor == nullptr && HitDetailsMultiLineTrace.Distance != -1.0f) else if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance > MaxStepHeight) || HitDetailsMultiLineTrace.Actor == nullptr && HitDetailsMultiLineTrace.Distance != -1.0f)
{ {
GravitySpeed -= 1000.0f*DeltaSeconds; GravityAcceleration -= 981.0f*DeltaSeconds;
if (GravitySpeed*DeltaSeconds > -DiffernceDistance) if (GravityAcceleration*DeltaSeconds > -DiffernceDistance)
{ {
RootComponent->AddLocalOffset(FVector(0.f, 0.f, GravitySpeed*DeltaSeconds)); RootComponent->AddLocalOffset(FVector(0.f, 0.f, GravityAcceleration*DeltaSeconds));
} }
else else
{ {
...@@ -513,8 +513,8 @@ void AVirtualRealityPawn::VRClimbStepUp(float DeltaSeconds) ...@@ -513,8 +513,8 @@ void AVirtualRealityPawn::VRClimbStepUp(float DeltaSeconds)
//Going on the ground //Going on the ground
else else
{ {
GravitySpeed = 0.0f; GravityAcceleration = 0.0f;
SumUpSteppingSpeed = 0.0f; UpSteppingAcceleration = 0.0f;
} }
} }
...@@ -577,16 +577,16 @@ FHitResult AVirtualRealityPawn::CreateLineTrace(FVector Direction, const FVector ...@@ -577,16 +577,16 @@ FHitResult AVirtualRealityPawn::CreateLineTrace(FVector Direction, const FVector
return HitDetails; return HitDetails;
} }
FHitResult AVirtualRealityPawn::CreateMultiLineTrace(FVector Direction, const FVector Start, float distance, bool Visibility) FHitResult AVirtualRealityPawn::CreateMultiLineTrace(FVector Direction, const FVector Start, float Radius, bool Visibility)
{ {
FHitResult HitDetailsMultiLineTrace; FHitResult HitDetailsMultiLineTrace;
HitDetailsMultiLineTrace.Distance = -1.0f;//(Distance=-1) not existing, but to know if this Objekt not Initialized(when all Traces not compatible) HitDetailsMultiLineTrace.Distance = -1.0f;//(Distance=-1) not existing, but to know if this Objekt not Initialized(when all Traces not compatible)
FHitResult HitDetailsFromLineTraceCenter = CreateLineTrace(Direction, Start, Visibility); FHitResult HitDetailsFromLineTraceCenter = CreateLineTrace(Direction, Start, Visibility);
FHitResult HitDetailsFromLineTraceLeft = CreateLineTrace(Direction, Start + FVector(0, -distance, 0), Visibility); FHitResult HitDetailsFromLineTraceLeft = CreateLineTrace(Direction, Start + FVector(0, -Radius, 0), Visibility);
FHitResult HitDetailsFromLineTraceRight = CreateLineTrace(Direction, Start + FVector(0, distance, 0), Visibility); FHitResult HitDetailsFromLineTraceRight = CreateLineTrace(Direction, Start + FVector(0, Radius, 0), Visibility);
FHitResult HitDetailsFromLineTraceFront = CreateLineTrace(Direction, Start + FVector(distance, 0, 0), Visibility); FHitResult HitDetailsFromLineTraceFront = CreateLineTrace(Direction, Start + FVector(Radius, 0, 0), Visibility);
FHitResult HitDetailsFromLineTraceBehind = CreateLineTrace(Direction, Start + FVector(-distance, 0, 0), Visibility); FHitResult HitDetailsFromLineTraceBehind = CreateLineTrace(Direction, Start + FVector(-Radius, 0, 0), Visibility);
bool BlockingHitAndSameActor = (HitDetailsFromLineTraceCenter.bBlockingHit) bool BlockingHitAndSameActor = (HitDetailsFromLineTraceCenter.bBlockingHit)
&& (HitDetailsFromLineTraceCenter.Actor == HitDetailsFromLineTraceLeft.Actor&& HitDetailsFromLineTraceLeft.Actor == HitDetailsFromLineTraceRight.Actor && (HitDetailsFromLineTraceCenter.Actor == HitDetailsFromLineTraceLeft.Actor&& HitDetailsFromLineTraceLeft.Actor == HitDetailsFromLineTraceRight.Actor
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include "DisplayClusterPawn.h" #include "DisplayClusterPawn.h"
#include "DisplayClusterSceneComponent.h" #include "DisplayClusterSceneComponent.h"
#include "Components/CapsuleComponent.h" #include "Components/CapsuleComponent.h"
#include "Components/StaticMeshComponent.h"
#include "GameFramework/FloatingPawnMovement.h" #include "GameFramework/FloatingPawnMovement.h"
#include "GameFramework/PawnMovementComponent.h" #include "GameFramework/PawnMovementComponent.h"
#include "GameFramework/RotatingMovementComponent.h" #include "GameFramework/RotatingMovementComponent.h"
...@@ -78,8 +77,6 @@ private: ...@@ -78,8 +77,6 @@ private:
FOnClusterEventListener ClusterEventListenerDelegate; FOnClusterEventListener ClusterEventListenerDelegate;
UFUNCTION() void HandleClusterEvent(const FDisplayClusterClusterEvent& Event); UFUNCTION() void HandleClusterEvent(const FDisplayClusterClusterEvent& Event);
protected: protected:
DECLARE_DELEGATE_OneParam(FFireDelegate, bool);
DECLARE_DELEGATE_TwoParams(FActionDelegate, bool, int32);
virtual void BeginPlay() override; virtual void BeginPlay() override;
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
...@@ -131,16 +128,16 @@ protected: ...@@ -131,16 +128,16 @@ protected:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) UCapsuleComponent* CapsuleColliderComponent = nullptr; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) UCapsuleComponent* CapsuleColliderComponent = nullptr;
private: private:
float DeltaTime = 0.0f; float DeltaTime = 0.0f;
float GravitySpeed = 0.0f; UPROPERTY() float GravityAcceleration = 0.0f;
UPROPERTY() float UpSteppingSpeed = 110.0f; UPROPERTY() float UpSteppingSpeed = 110.0f;
FVector LastCameraPosition; FVector LastCameraPosition;
FHitResult CreateLineTrace(FVector Direction, const FVector Start, bool Visibility); FHitResult CreateLineTrace(FVector Direction, const FVector Start, bool Visibility);
FHitResult CreateMultiLineTrace(FVector Direction, const FVector Start, float distance, bool Visibility); FHitResult CreateMultiLineTrace(FVector Direction, const FVector Start, float Radius, bool Visibility);
void SetCapsuleColliderCharacterSizeVR(); void SetCapsuleColliderCharacterSizeVR();
void PhysWalkingMode(); void CheckForPhysWalkingCollision();
void VRWalkingMode(float Value, FVector Direction); void VRWalkingMode(float Value, FVector Direction);
void VRClimbStepUp(float DeltaSeconds); void MoveByGravityOrStepUp(float DeltaSeconds);
bool IsColliderOnGround(); bool IsColliderOnGround();
void InitRoomMountedComponentReferences(); void InitRoomMountedComponentReferences();
}; };
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment