void UTangoARCamera::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) { if (UTangoDevice::Get().GetCurrentConfig().AreaDescription.UUID.Len() > 0) { FrameOfReference = FTangoCoordinateFramePair(ETangoCoordinateFrameType::AREA_DESCRIPTION, ETangoCoordinateFrameType::CAMERA_COLOR); } else { FrameOfReference = FTangoCoordinateFramePair(ETangoCoordinateFrameType::START_OF_SERVICE, ETangoCoordinateFrameType::CAMERA_COLOR); } if (ARScreen == nullptr && TangoARHelpers::DataIsReady()) { ARScreen = NewObject<UTangoARScreenComponent>(this, TEXT("TangoCameraARScreen")); if (ARScreen) { ARScreen->RegisterComponent(); ARScreen->AttachToComponent(this, FAttachmentTransformRules::KeepWorldTransform, NAME_None); FVector2D LowerLeft, UpperRight, NearFar; TangoARHelpers::GetNearPlane(LowerLeft, UpperRight, NearFar); FVector2D UVShift = TangoARHelpers::GetARUVShift(); NearFar.Y *= 0.99f; FVector LL = FVector(NearFar.Y, LowerLeft.X*(NearFar.Y / NearFar.X), LowerLeft.Y*(NearFar.Y / NearFar.X)); FVector UR = FVector(NearFar.Y, UpperRight.X*(NearFar.Y / NearFar.X), UpperRight.Y*(NearFar.Y / NearFar.X)); ARScreen->SetRelativeLocation((LL + UR)*0.5f); ARScreen->SetRelativeRotation(FQuat::Identity); ARScreen->SetRelativeScale3D(FVector(1, FMath::Abs(UR.Y - LL.Y) / (100.0f*(1.0f - 2.0f*UVShift.X)), FMath::Abs(LL.Z - UR.Z) / (100.0f*(1.0f - 2.0f*UVShift.Y)))); } else { UE_LOG(ProjectTangoPlugin, Error, TEXT("UTangoARCamera::TickComponent: Could not instantiate TangoARScreen for TangoARCamera. There will be no camera passthrough.")); } } Super::TickComponent(DeltaTime, TickType, ThisTickFunction); if (UTangoDevice::Get().getTangoDeviceMotionPointer()) { FTangoPoseData LatestPose = UTangoDevice::Get().getTangoDeviceMotionPointer()->GetPoseAtTime(FrameOfReference, 0); //Only move the component if the pose status is valid. if (LatestPose.StatusCode == ETangoPoseStatus::VALID) { SetRelativeLocation(LatestPose.Position); SetRelativeRotation(FRotator(LatestPose.QuatRotation)); } } else { UE_LOG(ProjectTangoPlugin, Warning, TEXT("UTangoARCamera::TickComponent: Could not update transfrom because Tango Service is not connect or has motion tracking disabled!")); } if (!ViewExtension.IsValid() && GEngine) { TSharedPtr< FTangoViewExtension, ESPMode::ThreadSafe > NewViewExtension(new FTangoViewExtension(Cast<ITangoARInterface>(this))); ViewExtension = NewViewExtension; GEngine->ViewExtensions.Add(ViewExtension); } }
void UTangoMotionComponent::LateUpdate() { if (UTangoDevice::Get().getTangoDeviceMotionPointer()) { //Only move the component if the pose status is valid. FTangoPoseData LatestPose = UTangoDevice::Get().getTangoDeviceMotionPointer()->GetPoseAtTime(MotionComponentFrameOfReference, ARImage == nullptr ? 0 : ARImage->GetLatestImageTimeStamp()); if (LatestPose.StatusCode == ETangoPoseStatus::VALID) { SetRelativeLocation(LatestPose.Position); SetRelativeRotation(FRotator(LatestPose.QuatRotation)); } } else { UE_LOG(ProjectTangoPlugin, Warning, TEXT("UTangoMotionComponent::LateUpdate: Could not update transfrom because Tango Service is not connect or has motion tracking disabled!")); } }
void UDebugSkelMeshComponent::ConsumeRootMotion(const FVector& FloorMin, const FVector& FloorMax) { //Extract root motion regardless of where we use it so that we don't hit //problems with it building up in the instance FRootMotionMovementParams ExtractedRootMotion; if (UAnimInstance* AnimInst = GetAnimInstance()) { ExtractedRootMotion = AnimInst->ConsumeExtractedRootMotion(1.f); } if (bPreviewRootMotion) { if (ExtractedRootMotion.bHasRootMotion) { AddLocalTransform(ExtractedRootMotion.RootMotionTransform); //Handle moving component so that it stays within the editor floor FTransform CurrentTransform = GetRelativeTransform(); FVector Trans = CurrentTransform.GetTranslation(); Trans.X = WrapInRange(Trans.X, FloorMin.X, FloorMax.X); Trans.Y = WrapInRange(Trans.Y, FloorMin.Y, FloorMax.Y); CurrentTransform.SetTranslation(Trans); SetRelativeTransform(CurrentTransform); } } else { if (TurnTableMode == EPersonaTurnTableMode::Stopped) { SetWorldTransform(FTransform()); } else { SetRelativeLocation(FVector::ZeroVector); } } }
void ARobotCharacter::ConfigureMeshAndAnimation() { // Configure the skeletal mesh and animation blueprints static auto SkeletalMeshName = TEXT("SkeletalMesh'/Game/Characters/Mannequin/Mesh/SK_Mannequin.SK_Mannequin'"); static auto SkeletalMeshFinder = ConstructorHelpers::FObjectFinder<USkeletalMesh>(SkeletalMeshName); if (SkeletalMeshFinder.Succeeded()) { auto MeshComponent = GetMesh(); MeshComponent->SetSkeletalMesh(SkeletalMeshFinder.Object); MeshComponent->SetRelativeLocation(FVector(0.f, 0.f, -95.f)); MeshComponent->SetRelativeRotation(FRotator(0.f, 270.f, 0.f)); ConfigureMeshCollision(); } static auto AnimBlueprintName = TEXT("AnimBlueprint'/Game/Characters/Mannequin/Animations/ThirdPerson_AnimBP.ThirdPerson_AnimBP_C'"); static auto AnimBlueprintFinder = ConstructorHelpers::FObjectFinder<UAnimBlueprintGeneratedClass>(AnimBlueprintName); if (AnimBlueprintFinder.Succeeded()) { GetMesh()->SetAnimInstanceClass(AnimBlueprintFinder.Object); } }