Bir CFrame, Koordinat Çerçevesi kısaltmasıdır ve 3D nesneleri döndürmek ve konumlandırmak için kullanılan bir veri türüdür. Hem bir nesne özelliği hem de bağımsız bir birim olarak, CFrame, her eksen için küresel X, Y ve Z koordinatlarının yanı sıra dönüş verisi içerir. Ayrıca, CFrames, 3D alandaki nesnelerle çalışmak için yararlı işlevler içerir.
Bir CFrame Pozisyonlamak
Varsayılan (0, 0, 0) konumunda boş bir CFrame oluşturmak için CFrame.new() kullanabilirsiniz. Belirli bir noktada bir CFrame konumlandırmak için, CFrame.new()'ye X, Y ve Z koordinatlarını argüman olarak sağlayın. Aşağıdaki örnekte, redBlock parçasının CFrame özelliği newCFrame olarak değişir ve (-2, 2, 4) konumuna yeniden yerleştirilir.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Yeni CFrame oluşturlocal newCFrame = CFrame.new(-2, 2, 4)-- Kırmızı bloğun mevcut CFrame'ini yeni CFrame ile değiştirredBlock.CFrame = newCFrame


Alternatif olarak, CFrame.new()'ye yeni bir Vector3 konumu sağlayarak aynı sonuca ulaşabilirsiniz:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Yeni CFrame oluşturlocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Kırmızı bloğun mevcut CFrame'ini yeni CFrame ile değiştirredBlock.CFrame = newCFrame
Bir CFrame Döndürmek
Dönmüş bir CFrame oluşturmak için, istenen eksenler için radyan cinsinden bir dönüş açısı sağlayarak CFrame.fromEulerAnglesXYZ() kurucusunu kullanın. CFrame.fromEulerAnglesXYZ()'ye verilen parametreler radyan cinsindendir, derece cinsinden isterseniz, math.rad() fonksiyonunu kullanarak dereceleri radyana dönüştürebilirsiniz. Aşağıdaki örnekte, redBlock parçası Y ekseninde 45 derece saat yönünün tersine döner.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Yeni döndürülen CFrame oluşturlocal newCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(45), 0)-- Kırmızı bloğun mevcut CFrame'ini yeni CFrame ile değiştirredBlock.CFrame = newCFrame


Bir CFrame'i Bir Noktaya Doğru Yüzlemek
Bir CFrame'in ön yüzünü dünyadaki belirli bir noktaya doğru yönlendirmek için CFrame.lookAt() kullanabilirsiniz. Aşağıdaki örnek, redBlock'ı (0, 3, 0) konumuna yerleştirir ve ön yüzünü, beyaz daire ile işaretlenmiş olan blueCube parçasına doğru döndürür.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.Position = Vector3.new(0, 3, 0)-- Kırmızı bloğun ön yüzünü mavi küreye yönlendirredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)


Bir CFrame'i Kaydırmak
Bir nesneyi mevcut konumundan belirli bir miktar kaydırmak için, Vector3'ü nesnenin pozisyonuna ekleyerek veya çıkararak yeni bir CFrame oluşturun. CFrame.new()'yi kullanmak için bir nesnenin düzgün formatlanmış Vector3 konumunu elde etmek için, burada görüldüğü gibi, Position özelliği (redBlock.Position) pratik bir kısayoldur.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


Diğer bir nesnenin pozisyonundan bir nesneyi kaydırmak için aynı tekniği kullanabilirsiniz. Aşağıdaki örnekte, bir Vector3, blueCube'ın konumunda oluşturulan yeni bir CFrame'e eklenir, yani blok yerine.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


Dinamik CFrame yönlendirmesi
CFrame.new() ve CFrame.fromEulerAnglesXYZ() kurucuları, dünyada belirli bir yönlendirmeyle bir nesneyi yeniden konumlandırır veya döndürür, ancak bazen sabit bir dünya konumu ve dönüş açısına güvenemezsiniz. Örneğin:
- Bir oyuncunun dünyada nereye durduğuna ve hangi yöne baktığına bağlı olmadan, doğrudan önünde bir yüzer hazine yerleştirmek.
- Bir sihirli cinin, bir oyuncunun sağ omzunun hemen üzerine görünmesini sağlamak.
Bu durumlarda, kurucular yerine CFrame yöntemlerini kullanın.
Göreceli konum
CFrame:ToWorldSpace() fonksiyonu, bir nesnenin CFrame'ini — kendi yerel yönlendirmesini dikkate alarak — yeni bir dünya yönlendirmesine dönüştürür. Bu, bir bölümü kendisine veya başka bir nesneye göre kaydırmak için idealdir; mevcut konum/yönlendirmesi ne olursa olsun.
Aşağıdaki örnekte, redBlock parçası, mavi kürenin Y eksenine göre 2 stud kayar (içinden geçen yeşil ok) ve global Y eksenine göre yukarı yönlü kaymaz.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


Göreceli dönüş
Aynı şekilde, bir nesneyi kendisine göre döndürmek için CFrame:ToWorldSpace() kullanabilirsiniz. Aşağıdaki örnekte, redBlock parçası, Y ekseninde saat yönünün tersine 70 derece ve Z ekseninde saat yönünde 20 derece döner.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal rotatedCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


Belirli bir yüzeyi bir noktaya yönlendirmek
Bir nesnenin ön tarafını başka bir nesneye dönmesini sağlamak için, CFrame.new()'nin ikinci parametresi olarak bir Vector3 noktası verebilirsiniz. Herhangi bir yüzeyin yönlendirilmesi için göreceli dönüş de kullanabilirsiniz. Aşağıdaki örnek, iki ardışık CFrame işlemi gerçekleştirir:
- Ön yüzeyini, beyaz daire ile işaretlenen hedefe yönlendirin.
- CFrame'yi döndürün, böylece üst yüzey, siyah daire ile işaretlenen, hedefe doğru yönlendirilir.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Kırmızı bloğun ön yüzünü mavi küreye yönlendirredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)-- CFrame'i kendisine göre döndürün, böylece üst yüzey (ön değil) mavi küreye doğru baksınlocal rotatedCFrame = CFrame.fromEulerAnglesXYZ(math.rad(-90), 0, 0)redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


Noktalar arasında bir noktayı bulmak
İki nokta arasında bir CFrame konumlandırmak için doğrusal enterpolasyon veya lerp kullanabilirsiniz. Aşağıdaki örnekte, redBlock parçası greenCube ve cyanCube parçaları arasında yeniden konumlandırılır. 0.7 değeri, onu yeşil küreye uzaklığın %70'ine yerleştirir.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

