CFrame

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

A CFrame , singkatan dari Koordinasikan Angkatan Gambar , adalah jenis data yang digunakan untuk memutar dan menempatkan objek 3D. Sebagai salah satu property objek atau unit tunggal, CFrame ber

Beberapa contoh aplikasi CFrame dalam game mungkin:

  • Menemukan titik target jauh untuk sebuah proyektil, seperti posisi seorang musuh yang ditargetkan oleh laser seorang pemain.
  • Menggerakkan kamera sehingga fokus pada NPC tertentu saat seorang pemain berinteraksi dengan mereka.
  • Menempatkan indikator status langsung di atas kepala pemain untuk menunjukkan apakah mereka paralyzed, dibina, racun, dll.

Dasar CFrame

Menempatkan CFrame

Anda dapat menciptakan CFrame kosong di posisi default (0, 0, 0) dengan menggunakan


local redBlock = workspace.RedBlock
-- Buat CFrame baru
local newCFrame = CFrame.new(-2, 2, 4)
-- Tulis CFrame merahBlock saat ini dengan CFrame baru
redBlock.CFrame = newCFrame
Sebelum
Setelah

Alternatif, Anda dapat menyediakan posisi Vector3 baru ke CFrame.new() dan mencapai hasil yang sama:


local redBlock = workspace.RedBlock
-- Buat CFrame baru
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Tulis CFrame merahBlock saat ini dengan CFrame baru
redBlock.CFrame = newCFrame

Putar CFrame

Untuk membuat CFrame berputar, gunakan konstruktor CFrame.Angles(), yang memberikan sudut rotasi dalam derajat untuk eksen yang diinginkan. Para argumen untuk Dat


local redBlock = workspace.RedBlock
-- Buat CFrame berputar baru
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Tulis CFrame merahBlock saat ini dengan CFrame baru
redBlock.CFrame = newCFrame
Sebelum
Setelah

Menghadapi Ke Arah Titik

Anda dapat menggunakan CFrame.new() untuk menunjukkan permukaan depan sebuah CFrame di lokasi tertentu di dunia. Dalam contoh berikut, posisi bagian redBlock di (0, 3, 0) dan menunjukkan permukaan depannya, ditandai oleh


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
-- Tempatkan redBlock di 'startPosition' dan soroti permukaan depannya di 'targetPosition'
redBlock.CFrame = CFrame.new(startPosition, targetPosition)
Sebelum
Setelah

Menonaktifkan CFrame

Untuk mengurangi objek dengan jumlah spesifik stud dari posisinya, tambahkan atau kurangi Vector3 ke atau dari CFrame baru di posis


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 menghapus objek dari posisi objek lain. Dalam contoh berikut, Vector3 menambahkan ke CFrame baru yang dibuat di posisi cube biru alih-alih posisi blok.


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Sebelum
Setelah

Orientasi CFrame Dinamis

Pembangun CFrame.new() dan CFrame.Angles() pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun pembangun p

  • Menempatkan harta karun mengambang langsung di depan pemain yang mungkin berdiri di mana saja di dunia, menghadapi arah mana pun.
  • Membuat genie ajaib muncul di atas bahun kanan pemain secara langsung.

Dalam kasus ini, gunakan metode CFrame alih-alih pembangun mereka.

Posisi Relatif

Fungsi CFrame:ToWorldSpace() mengubah objek's CFrame — menghormati orientasi lokalnya sendiri — menjadi orientasi dunia baru. Ini menjadikannya ideal untuk mengurangi bagian relatif terhadap diri sendiri atau objek lain, terlepas dari bagaimana posisinya saat ini / diputar.

Dalam contoh berikut, bagian redBlock memiliki 2 stud relatif terhadap sumbu y (panah hijau menunjuk melalui) dan tidak relatif terhadap sumbu global menunjuk ke atas.


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 terhadap dirinya sendiri. Dalam contoh berikut, bagian redBlock memutar 70 derajat terbalik di sumbu y dan 20 derajat terbalik di sumbu z.


local redBlock = workspace.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Sebelum
Setelah

Menghadapi Permukaan Tertentu ke Titik

Anda dapat membuat bagian depan objek menghadapi objek lain dengan menyediakan poin Vector3 sebagai parameter kedua dari CFrame.new() . Anda juga dapat menggunakan rotasi relatif untuk membuat setiap bagian dari objek menghadapi poin Vector3 .

  1. Point permukaan depan , ditandai oleh lingkaran putih, di target.
  2. Putar CFrame untuk membuat permukaan Datatype.CFrame top, ditandai oleh lingkaran hitam, menunjuk ke arah target.

local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Buat Vector3 untuk posisi target
local targetPosition = blueCube.Position
-- Tunjukkan permukaan depan blok merah 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 permukaannya (bukan 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

Menemukan Titik Antara Titik

Anda dapat menggunakan intervensi lini , atau lerp , untuk menempatkan CFrame di antara dua poin. Dalam contoh berikut, bagian 1> redBlock1> menggeser


local redBlock = workspace.RedBlock
local greenCube = workspace.GreenCube
local cyanCube = workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Sebelum
Setelah