CFrames

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

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 baru
local newCFrame = CFrame.new(-2, 2, 4)
-- Menggantikan CFrame saat ini redBlock dengan CFrame baru
redBlock.CFrame = newCFrame

Sebelum
>

Setelah
>

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 baru
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Menggantikan CFrame saat ini redBlock dengan CFrame baru
redBlock.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 berputar
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Menggantikan CFrame saat ini redBlock dengan CFrame baru
redBlock.CFrame = newCFrame

Sebelum
>

Setelah
>

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.RedBlock
local blueCube = Workspace.BlueCube
-- Buat Vector3 untuk posisi awal dan posisi target
local 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)

Sebelum
>

Setelah
>

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.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)

Sebelum
>

Setelah
>

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.RedBlock
local blueCube = Workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)

Sebelum
>

Setelah
>

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.RedBlock
local blueCube = Workspace.BlueCube
local offsetCFrame = CFrame.new(0, 2, 0)
redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)

Sebelum
>

Setelah
>

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.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)

Sebelum
>

Setelah
>

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:

  1. Arahkan permukaan depan belakang yang ditandai dengan lingkaran putih, pada target.
  2. Putar CFrame untuk membuat permukaan atas yang ditandai dengan lingkaran hitam, menunjuk ke target.

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Buat Vector3 untuk posisi target
local 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 target
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)

Sebelum
>

Setelah
>

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.RedBlock
local greenCube = Workspace.GreenCube
local cyanCube = Workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

Sebelum
>

Setelah
>