CFRamler

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

A CFrame , Koordinat Çerçevesi için kısa, 3B nesneleri döndürmek ve konumlandırmak için kullanılan bir veri türüdür.Bir nesne özelliği veya bağımsız bir birim olarak, bir CFrame her eksen için küresel x-, y- ve z-koordinatları ile dönüşüm verilerini de içerir.Ayrıca, CFrames 3B uzaydaki nesnelerle çalışmak için yararlı işlevler içerir.

Bir oyundaki CFrame uygulamaların bazı örnekleri şunlar olabilir:

  • Bir merminin hedef noktasını bulmak, oyuncunun lazer tüfeği tarafından hedef alınan bir düşmanın pozisyonu gibi, bir projile için uzak bir hedef noktası.
  • Kamera, bir oyuncu onlarla etkileşime girdiğinde belirli NPC'lere odaklanması için hareket ettirilir.
  • Bir oyuncunun kafasının üzerine doğrudan bir durum göstergesi yerleştirerek paralize edildiklerini, güçlendirildiklerini, zehirlenmiş olduklarını göstermek

CFRame temelleri

Bir CFrame konumlandır

Varsayılan konumda (0, 0, 0) CFrame.new() kullanarak boş bir CFrame oluşturabilirsiniz.Belirli bir noktada bir CFrame konumlandırmak için, x-, y-, ve z-koordinatlarını CFrame.new() 'e argüman olarak verin.Aşağıdaki örnekte, redBlock bölümünün CFrame özellikleri newCFrame 'a değiştirildi, bunu (-2, 2, 4) konumlandırdı.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Yeni CFrame oluştur
local newCFrame = CFrame.new(-2, 2, 4)
-- KırmızıBlok'un mevcut CFrame'ini yeni CFrame ile yeniden yaz
redBlock.CFrame = newCFrame

Önce
>

Sonra
>

Alternatif olarak, yeni bir pozisyon sağlayabilir ve aynı sonuçulaşabilirsiniz:


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Yeni CFrame oluştur
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- KırmızıBlok'un mevcut CFrame'ini yeni CFrame ile yeniden yaz
redBlock.CFrame = newCFrame

Bir CFrame döndür

Döndürülmüş bir CFrame oluşturmak için, istenen eksenler için radyandaki bir dönme açısı sağlayan CFrame.Angles() yapıcıyı kullanın.CFrame.Angles() nın parametleri radyandadır, derece değil.Dereceleri tercih ederseniz, math.rad() dereceleri radyana dönüştürmek için kullanın.Aşağıdaki örnekte, redBlock kısmı y-ekseninde 45 derece saat yönünde döner.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Yeni döndürülmüş CFrame oluştur
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- KırmızıBlok'un mevcut CFrame'ini yeni CFrame ile yeniden yaz
redBlock.CFrame = newCFrame

Önce
>

Sonra
>

Bir noktaya doğru bir CFrame ile karşılaş

Bir CFrame 'in ön yüzeyini dünyadaki belirli bir noktaya işaret etmek için CFrame.new() kullanabilirsiniz.Aşağıdaki örnekte, redBlock parça konumları (0, 3, 0) üzerinde ve beyaz çember tarafından işaretlenen ön yüzeyini blueCube parçaya işaret ediyor.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Başlangıç pozisyonu ve hedef pozisyonu için bir Vector3 oluştur
local startPosition = Vector3.new(0, 3, 0)
local targetPosition = blueCube.Position
-- Kırmızı bloku 'startPosition' konumuna yerleştirin ve ön yüzeyini 'targetPosition' konumuna işaret edin
redBlock.CFrame = CFrame.new(startPosition, targetPosition)

Önce
>

Sonra
>

Bir CFrame'i telafi et

Bir nesneyi mevcut konumundan belirli bir sayıda vida ile telafi etmek için, nesnenin konumuna yeni bir Vector3 ekleyin veya çıkarın veya mevcut konumdan bir CFrame kaldırın.Burada görüldüğü gibi, bir nesneyi CFrame.new() ile kullanmak için düzgün biçimlendirilmiş bir Vector3 pozisyonu almak, onun Position özelliği ( redBlock.Position ) bir kolay kısayol.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)

Önce
>

Sonra
>

Bir nesneyi başka bir nesnenin konumundan telafi etmek için aynı tekniği kullanabilirsiniz.Aşağıdaki örnekte, bir Vector3 bloğun konumunun yerine yeni bir CFrame oluşturulan mavi kübün pozisyonuna eklenir.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)

Önce
>

Sonra
>

Dinamik CFrame yönlendirmesi

CFrame.new() ve CFrame.Angles() yapıcıları, bir nesneyi dünyanın belirli bir yönünde yeniden konumlandırır veya döndürür, ancak bazen sabit bir dünya konumuna ve dönme açısına güvenemezsiniz.Örneğin:

  • Dünyanın herhangi bir yerinde duran ve herhangi bir yöne bakan bir oyuncunun önüne doğrudan yüzen bir hazine yerleştirmek.
  • Bir sihirli cinin doğrudan oyuncunun sağ omzunun üzerinde görünmesini sağlama.

Bu durumlarda, yapıcıları yerine CFrame yöntemlerini kullanın.

Nispi pozisyon

The CFrame:ToWorldSpace() fonksiyonu bir nesnenin CFrame - kendi yerel yönüne saygı göstererek - yeni bir dünya yönüne dönüştürür.Bu, mevcut konumda veya döndürülmeden bağımsız olarak bir parçayı telafi etmek için ideal kılıyor, ne olursa olsun.

Aşağıdaki örnekte, redBlock bölümü mavi kübenin y-eksenine göre 2 saplama çıkarır ve global y-ekseni doğrudan yukarı işaret eden yeşil ok için değil .


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
local offsetCFrame = CFrame.new(0, 2, 0)
redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)

Önce
>

Sonra
>

Nispi dönüş

Ayrıca CFrame:ToWorldSpace() bir nesneyi kendine göre döndürmek için kullanabilirsiniz.Aşağıdaki örnekte, redBlock kısmı y-ekseninde saat yönünde 70 derece döner ve z-ekseninde saat yönünde 20 derece döner.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)

Önce
>

Sonra
>

Bir noktaya özel bir yüze yüzleş

Bir nesnenin önünü başka bir nesneye yüz yüze getirmek için Vector3 noktasını ikinci parametre olarak CFrame.new() 'a sağlayarak yapabilirsiniz.Ayrıca, nesnenin herhangi bir yüzünü bir Vector3 noktasına yönlendirmek için mutlak dönüşü de kullanabilirsiniz.Aşağıdaki örnek iki sıralı CFrame işlem gerçekleştirir:

  1. Beyaz çember tarafından işaretlenmiş ön yüzey hedefe işaret edin.
  2. Siyah çember tarafından işaretlenen üst yüzeyi döndürmek için CFrame döndürün, hedefe doğru işaret edin.

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Hedef konumu için bir Vector3 oluştur
local targetPosition = blueCube.Position
-- Kırmızı blokun ön yüzeyini 'hedef konum'a yönlendirin
redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)
-- Şimdi kırmızıBlok'un ön yüzeyi (beyaz daire) maviKübe'ye işaret ediyor
-- KırmızıBlok'un CFrame'i kendisine göre döndürün, böylece üst yüzeyi (ön değil) hedefe doğru işaret eder
local rotatedCFrame = CFrame.Angles(math.rad(-90), 0, 0)
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
-- Now the redBlock's top surface (black circle) is pointing towards the blueCube (as seen in After below)

Önce
>

Sonra
>

Noktalar arasında bir nokta bul

lineer interpolasyonu veya lerp kullanarak, iki nokta arasında bir CFrame konumlandırabilirsiniz.Aşağıdaki örnekte, redBlock bölümü greenCube ve cyanCube parçaları arasında yeniden konumlandırılır.Değeri 0.7 ye yerleştirir 70% mesafe ile yeşil küpten uzakta.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local greenCube = Workspace.GreenCube
local cyanCube = Workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

Önce
>

Sonra
>