emirguny0

Yeni üye
7 Ağu 2025
2
0
1
Arkadaşlar gerçekçi durması için third person karakterin kamerasını kafaya sabitledim vücut vs görünsün diye. kameranın dönüşünü kısıtladım clamp ve normalize axis ile fakat bu sefer karakter istediği gibi hareket ediyor fakat kamera sabit sadece belli açılara hareket ediyor. bu kamerayı dinamik olarak kısıtlamak istiyorum adamın baktığı yerden itibaren kısıtlamak diyelim. yardımcı olursanız sevinirim.
 
Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.
Bu dogru olmakla beraber basit şekilde şöyle düşünebilirsin.

Sonuçta Mouse X ve Y eksenine göre iki boyutlu düzlemde bir yer belirliyor. (X, Y).

Mouse çevrildiği zaman oyun motoru sana float tipinde bir değer döndürüyor... Bu döndürülen değere göre biz de karakterin veya kameranın dönüşünü sağlıyoruz.

Bu işlemler de karakterinde yapılıyor ve AddControllerYawInput veya AddControllerPitchInput cagriliyor Pawn'a ait bir PlayerControllerde.

Diyelim ki sağ sol... 90 dereceden fazla dönmesin istiyorsun!

Mouse X (sağ-sol) değerine göre kameranın veya aktörün world locationu olan yaw (yatay dönüş) değerini değiştiriyorsun.

AddControllerYawInput metodunu çağırmadan önce gelmeden önce şöyle bir check yapabilrisin

// AMyCharacter.h

protected:
FRotator InitialRotation;
float MaxYaw = 90.0f;

....

// AMyCharacter.cpp

// Ilk baslangictaki rotasyonu aliyoruz referans olarak. Artik 0 bizim pawn'i koydugumuz ilk nokta. Yani senin PlayerStart'in ile alakali.
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
InitialRotation = GetActorRotation(); // Karakterin başlangıç yönü nerede olursa olsun ilk olarak aliyorsun.
}

// Bunu mouse gelen fonksiyona bind edebilirsin player componentine eski stil yapiyorum, enhanced input systemle de sonucta buraya gidiyor.
void AMyCharacter::TurnWithClamp(float Value)
{
// İlk kontrol değeri sıfıra yakınsa fonksiyonu hemen döndür.
if (FMath::IsNearlyZero(Value))
{
return;
}

// FindDeltaAngleRadians(rotasyon1, rotasyon2) -> https://dev.epicgames.com/documenta...Runtime/Core/Math/FMath/FindDeltaAngleRadians

// kendi baslangic noktamizdaki yaw degeriyle su anki yaw degerini karsilastiriyoruz.
float CurrentDelta = FMath::FindDeltaAngleDegrees(InitialRotation.Yaw, GetActorRotation().Yaw);

// Eger su anki donus degeri ve gelen mouse degisimin toplami 90 a kucuk veya esitse...
// Abs burada absolute deger yani mutlak deger, mutlaka degeri 90 dan kucuk olmasi lazim cunku -90 derece de olabilir o zaman sonucta 90 derece dondurmucez.
if (FMath::Abs(CurrentDelta + Value) <= MaxYaw)
{
AddControllerYawInput(Value);
}

// Zaten bir donus saglamayip devam etmeyecek otomatik olarak fonksiyon bos donecek burdan.
}

Temel olarak bu mantikla ilerleybilirsin.
 
  • Beğen
Tepkiler: emirguny0
Bu dogru olmakla beraber basit şekilde şöyle düşünebilirsin.

Sonuçta Mouse X ve Y eksenine göre iki boyutlu düzlemde bir yer belirliyor. (X, Y).

Mouse çevrildiği zaman oyun motoru sana float tipinde bir değer döndürüyor... Bu döndürülen değere göre biz de karakterin veya kameranın dönüşünü sağlıyoruz.

Bu işlemler de karakterinde yapılıyor ve AddControllerYawInput veya AddControllerPitchInput cagriliyor Pawn'a ait bir PlayerControllerde.

Diyelim ki sağ sol... 90 dereceden fazla dönmesin istiyorsun!

Mouse X (sağ-sol) değerine göre kameranın veya aktörün world locationu olan yaw (yatay dönüş) değerini değiştiriyorsun.

AddControllerYawInput metodunu çağırmadan önce gelmeden önce şöyle bir check yapabilrisin

// AMyCharacter.h

protected:
FRotator InitialRotation;
float MaxYaw = 90.0f;

....

// AMyCharacter.cpp

// Ilk baslangictaki rotasyonu aliyoruz referans olarak. Artik 0 bizim pawn'i koydugumuz ilk nokta. Yani senin PlayerStart'in ile alakali.
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
InitialRotation = GetActorRotation(); // Karakterin başlangıç yönü nerede olursa olsun ilk olarak aliyorsun.
}

// Bunu mouse gelen fonksiyona bind edebilirsin player componentine eski stil yapiyorum, enhanced input systemle de sonucta buraya gidiyor.
void AMyCharacter::TurnWithClamp(float Value)
{
// İlk kontrol değeri sıfıra yakınsa fonksiyonu hemen döndür.
if (FMath::IsNearlyZero(Value))
{
return;
}

// FindDeltaAngleRadians(rotasyon1, rotasyon2) -> https://dev.epicgames.com/documenta...Runtime/Core/Math/FMath/FindDeltaAngleRadians

// kendi baslangic noktamizdaki yaw degeriyle su anki yaw degerini karsilastiriyoruz.
float CurrentDelta = FMath::FindDeltaAngleDegrees(InitialRotation.Yaw, GetActorRotation().Yaw);

// Eger su anki donus degeri ve gelen mouse degisimin toplami 90 a kucuk veya esitse...
// Abs burada absolute deger yani mutlak deger, mutlaka degeri 90 dan kucuk olmasi lazim cunku -90 derece de olabilir o zaman sonucta 90 derece dondurmucez.
if (FMath::Abs(CurrentDelta + Value) <= MaxYaw)
{
AddControllerYawInput(Value);
}

// Zaten bir donus saglamayip devam etmeyecek otomatik olarak fonksiyon bos donecek burdan.
}

Temel olarak bu mantikla ilerleybilirsin.
Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.
mantığını anladım ilgileriniz için
ikinize de teşekkür ederim.