Camera System - osy9611/ProjectPT GitHub Wiki

๋ผ์ด๋ผ์˜ ์นด๋ฉ”๋ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ถ„์„์„ ํ•œ ํ›„ ProjectPT์— ์ ์šฉ์„ ํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” SpringArm์œผ๋กœ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ–ˆ์œผ๋‚˜ ๋‹ค์–‘ํ•œ ์นด๋ฉ”๋ผ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ถ์–ด์„œ ๋ถ„์„์„ ์ง„ํ–‰ํ–ˆ์Œ

๊ฒฐ๊ณผ๋ฌผ

Fov

SpringArm

  • ๊ธฐ๋ณธ์ ์ธ ์นด๋ฉ”๋ผ๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋”ฐ๋ผ๊ฐ€๊ฑฐ๋‚˜ ์žฅ์• ๋ฌผ ์ถฉ๋Œ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ
  • ์ฃผ์š” ์žฅ์ 
    • ์นด๋ฉ”๋ผ์™€ ํ™˜๊ฒฝ ๊ฐ„์˜ ์ถฉ๋Œ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•จ
    • ์บ๋ฆญํ„ฐ ์œ„์น˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌํ˜„ ๊ถค๋„ ๊ตฌํ˜„์ด ํŽธํ•จ

LyraCamera System

๋ผ์ด๋ผ๋Š” Spring Arm์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž์ฒด์ ์ธ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•จ

  • Spring Arm์˜ ํ•œ๊ณ„์ 
    • ํŠน์ • ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์ƒํ™ฉ์—์„œ๋Š” ์„ธ๋ถ€์ ์ธ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•จ ex) 1์ธ์นญ/ 3์ธ์นญ ํ˜ผํ•ฉ ๊ฒŒ์ž„์—์„œ๋Š” ๋™์ ์œผ๋กœ ์นด๋ฉ”๋ผ๋ฅผ ์ „ํ™˜ํ•ด์•ผํ• ๋•Œ
    • ๋‹ค์–‘ํ•œ ๊ฒŒ์ž„ ๋ชจ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด SpringArm์„ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ SpringArm์„ ์—ฌ๋Ÿฌ๊ฐœ ์„ค์น˜ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•ด์•ผํ•˜๋Š”๋ฐ ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ• ๋•Œ ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ์ด๋‹ค.
  • ์ „์ฒด์ ์ธ ๋กœ์ง
    • CameraMode
      • ์นด๋ฉ”๋ผ์˜ ๋™์ž‘์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์นด๋ฉ”๋ผ ๋ทฐ, ๋ธ”๋žœ๋”ฉ ๋ฐ ํƒ€๊ฒŸ ์—‘ํ„ฐ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ค๋ฃธ
      • UpdateCameraMode
        • ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์นด๋ฉ”๋ผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.(UpdateView, UpdateBlending ๋งค์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•จ)
      • UpdateView
        • ์นด๋ฉ”๋ผ์˜ ์œ„์น˜, ํšŒ์ „ ๋ฐ FOV๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
      • UpdateBlending
        • ์นด๋ฉ”๋ผ ์ „ํ™˜ ์‹œ ๋ธ”๋žœ๋”ฉ ํšจ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • CameraModeStack
      • ์นด๋ฉ”๋ผ ๋ชจ๋“œ๋ฅผ ์Šคํƒ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐ ๋ชจ๋“œ์˜ ๋ธ”๋žœ๋”ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹น
      • PushCameraMode
        • ์ƒˆ๋กœ์šด ์นด๋ฉ”๋ผ ๋ชจ๋“œ๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
        • BlendWeight๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์นด๋ฉ”๋ผ ๋ชจ๋“œ ๊ฐ„ ๋ธ”๋žœ๋”ฉ์„ ์„ค์ •
      • EvaluateStack
        • ์Šคํƒ์— ์žˆ๋Š” ๋ชจ๋“  ์นด๋ฉ”๋ผ ๋ชจ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋ธ”๋žœ๋”ฉ์„ ํ†ตํ•ด ์ตœ์ข… ๋ทฐ๋ฅผ ๊ณ„์‚ฐ
      • UpdateStack
        • ์Šคํƒ์˜ ๋ชจ๋“  ์นด๋ฉ”๋ผ ๋ชจ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ
        • BlendWeight๊ฐ€ 1.0์ด ๋˜๋ฉด ์Šคํƒ์—์„œ ์ œ๊ฑฐ
    • CameraComponent
      • ๊ณ„์‚ฐ๋œ ์ตœ์ข… CameraView๋ฅผ ์ ์šฉ

ProjectPT์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ–ˆ๋‚˜

  • ProjectPT๋Š” ๋‹ค์–‘ํ•œ ์นด๋ฉ”๋ผ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” LyraCamera ์‹œ์Šคํ…œ์„ ์ ์šฉํ–ˆ๋‹ค.

  • ThirdPerson

    • Blueprint๋ฅผ ์ƒ์„ฑํ•ด์„œ CameraMode๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ฐ๊ฐ์˜ ์นด๋ฉ”๋ผ ์„ค์ •์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.

    • ๋ฒฝ์— ๋ถ™์–ด์žˆ์œผ๋ฉด ์นด๋ฉ”๋ผ Offset์„ ์กฐ์ •ํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€

      void UPTCameraMode_ThirdPerson::UpdatePreventPentration(float DeltaTime)
      {
      	FVector PivotLocation = GetPivotLocation();
      	FVector DesiredCameraPosition = View.Location;
      	FVector Direction = DesiredCameraPosition - PivotLocation;
      	FHitResult HitResult;
      	FCollisionQueryParams QueryParams;
      	QueryParams.AddIgnoredActor(GetTargetActor());
      
      	float DistBlockedPct = 1.0f;
      	bool bHit = GetWorld()->SweepSingleByChannel(
      		HitResult,
      		PivotLocation,
      		DesiredCameraPosition,
      		FQuat::Identity,
      		ECC_Camera,
      		FCollisionShape::MakeSphere(CameraCollisionRadius),
      		QueryParams
      	);
      
      	if (bHit)
      	{
      		FVector AdjustedLocation = HitResult.Location - Direction.GetSafeNormal();
      		View.Location = AdjustedLocation;
      	}
      }
  • HeroComponent์—์„œ CameraMode๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„์ง„ํ–‰

    • HeroComponent์—๋Š” ๊ธฐ๋ณธ CameraMode์™€ GAS์— ์‚ฌ์šฉ๋˜๋Š” CameraMode๋ฅผ ์ €์žฅํ•ด ์นด๋ฉ”๋ผ ๋ชจ๋“œ๋ฅผ ๋“ฑ๋ก

    • ์ฃผ์š”์ฝ”๋“œ

      TSubclassOf<UPTCameraMode> UPTHeroComponent::DetermineCameraMode() const
      {
      	if (AbilityCameraMode)
      		return AbilityCameraMode;
      
      	const APawn* Pawn = GetPawn<APawn>();
      
      	if (!Pawn)
      		return nullptr;
      
      	if (UPTPawnExtensionComponent* PawnExtComp = UPTPawnExtensionComponent::FindPawnExtensionComponent(Pawn))
      	{
      		if (const UPTPawnData* PawnData = PawnExtComp->GetPawnData<UPTPawnData>())
      		{
      			return PawnData->DefaultCameraMode;
      		}
      	}
      
      	return TSubclassOf<UPTCameraMode>();
      }
    • GA_FireZoom์—์„œ๋Š” ์–ด๋นŒ๋ฆฌํ‹ฐ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ๋ชจ๋“œ๋ฅผ ์ „ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •ํ•จ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ