A CFrame , pendek untuk Frame Koordinat , adalah jenis data yang digunakan untuk memutar dan menempatkan objek 3D.Sebagai properti objek atau unit berdiri sendiri, CFrame berisi koordinat global x-, y-, dan z- serta data rotasi untuk setiap sumbu.Selain itu, CFrames berisi fungsi berguna untuk bekerja dengan objek di ruang 3D.
Beberapa contoh aplikasi CFrame dalam permainan mungkin adalah:
- Menemukan titik target jauh untuk sebuah proyektil, seperti posisi musuh yang ditargetkan oleh laser pemain.
- Memindahkan kamera sehingga fokus pada NPC tertentu sebagai pemain berinteraksi dengan mereka.
- Menempatkan indikator status langsung di atas kepala pemain untuk menunjukkan apakah mereka paralit, ditingkatkan, diracuni, dll
Dasar-dasar CFrame
Posisikan CFrame
Anda dapat membuat kosong CFrame di posisi default (0, 0, 0) dengan menggunakan CFrame.new() .Untuk menempatkan CFrame pada titik tertentu, berikan x-, y-, dan z-koordinat sebagai argumen untuk CFrame.new() .Dalam contoh berikut, bagian redBlock dari bagian CFrame mengubah properti menjadi newCFrame , memindahkannya ke (-2, 2, 4).
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Buat CFrame barulocal newCFrame = CFrame.new(-2, 2, 4)-- Menggantikan CFrame saat ini redBlock dengan CFrame baruredBlock.CFrame = newCFrame


Alternatifnya, Anda dapat memberikan posisi baru Vector3 ke CFrame.new() dan mencapai hasil yang sama:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Buat CFrame barulocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Menggantikan CFrame saat ini redBlock dengan CFrame baruredBlock.CFrame = newCFrame
Putar CFrame
Untuk membuat rotasi CFrame , gunakan konstruktor CFrame.Angles() , yang memberikan sudut rotasi dalam radian untuk sumbu yang diinginkan.Parameter untuk CFrame.Angles() adalah dalam radian, bukan derajat.Jika Anda lebih suka derajat, gunakan math.rad() untuk mengkonversi derajat ke radian.Dalam contoh berikut, bagian redBlock berputar 45 derajat searah kanan di sumbu y-nya.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Buat CFrame baru berputarlocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Menggantikan CFrame saat ini redBlock dengan CFrame baruredBlock.CFrame = newCFrame


Menghadap CFrame ke arah titik
Anda dapat menggunakan CFrame.new() untuk menunjukkan permukaan depan dari CFrame di titik tertentu di dunia.Dalam contoh berikut, redBlock posisi bagian di (0, 3, 0) dan menunjukkan permukaan depan, ditandai dengan lingkaran putih, di bagian blueCube.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Buat Vector3 untuk posisi awal dan posisi targetlocal startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- Letakkan blok merah di 'startPosition' dan arahkan permukaan depannya ke 'targetPosition'redBlock.CFrame = CFrame.new(startPosition, targetPosition)


Setel Ulang CFrame
Untuk menghapuskan objek dengan jumlah stud tertentu dari posisinya saat ini, tambahkan atau kurangi Vector3 ke atau dari posisi baru CFrame di posisi objek.Untuk mendapatkan posisi yang dibentuk dengan benar dari objek untuk digunakan dengan , seperti yang terlihat di sini, propertinya adalah pintasan yang nyaman.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


Anda dapat menggunakan teknik yang sama untuk mengimbangkan objek dari posisi objek lain.Dalam contoh berikut, Vector3 menambahkan ke posisi baru CFrame yang dibuat di posisi kubus biru bukan di posisi blok.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


Orientasi CFrame dinamis
Konstruktor CFrame.new() dan CFrame.Angles() memposisikan ulang atau memutar objek di orientasi tertentu di dunia, tetapi terkadang Anda tidak dapat mengandalkan posisi dan sudut rotasi dunia tetap.Sebagai contoh:
- Menempatkan harta mengambang langsung di depan pemain yang mungkin berdiri di mana saja di dunia, menghadap ke arah mana pun.
- Membuat genie ajaib muncul langsung di atas bahu kanan pemain.
Dalam kasus ini, gunakan metode CFrame alih-alih konstruktor mereka.
Posisi relativ
Fungsi CFrame:ToWorldSpace() mengubah objek menjadi CFrame - menghormati orientasi lokalnya sendiri - ke orientasi baru dunia .Ini membuatnya ideal untuk menghapuskan bagian relatif terhadap dirinya sendiri atau objek lain, terlepas dari bagaimana posisinya saat ini diarahkan/berputar.
Dalam contoh berikut, bagian redBlock membatalkan 2 kancing relatif terhadap sumbu y dari kubus biru (panah hijau yang menunjuk melaluinya) dan tidak relatif terhadap sumbu y global y yang menunjuk langsung ke atas.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


Rotasi relatif
Anda juga dapat menggunakan CFrame:ToWorldSpace() untuk memutar objek relatif ke dirinya sendiri.Dalam contoh berikut, bagian redBlock berputar 70 derajat searah jarum jam di sumbu y dan 20 derajat searah jam di sumbu z.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


Menghadap permukaan tertentu menuju titik
Anda dapat membuat bagian depan objek menghadap objek lain dengan menyediakan poin Vector3 sebagai parameter kedua dari CFrame.new().Anda juga dapat menggunakan rotasi relatif untuk membuat wajah objek menunjuk ke titik Vector3 .Contoh berikut melakukan dua operasi berurutan CFrame:
- Arahkan permukaan depan belakang yang ditandai dengan lingkaran putih, pada target.
- Putar CFrame untuk membuat permukaan atas yang ditandai dengan lingkaran hitam, menunjuk ke target.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Buat Vector3 untuk posisi targetlocal targetPosition = blueCube.Position-- Arahkan permukaan depan redBlock ke 'targetPosition'redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- Sekarang permukaan depan redBlock (lingkaran putih) menunjuk ke arah blueCube-- Putar CFrame merahBlock relatif terhadap dirinya sendiri sehingga permukaan atasnya (tidak depan) menunjuk ke targetlocal 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)


Temukan titik di antara titik
Anda dapat menggunakan interpolasi linier , atau lerp , untuk menempatkan CFrame di antara dua titik.Dalam contoh berikut, bagian redBlock memindahkan kembali antara greenCube dan cyanCube bagian.Nilai dari 0.7 menempatkannya 70% dari jarak dari kubus hijau.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

