CFrames

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Một CFrame, viết tắt cho Khung Tọa Độ, là một kiểu dữ liệu được sử dụng để xoay và định vị các đối tượng 3D. Dù là thuộc tính của một đối tượng hay một đơn vị độc lập, CFrame chứa các tọa độ X, Y, và Z toàn cầu cũng như dữ liệu xoay cho mỗi trục. Ngoài ra, CFrames còn chứa các hàm hữu ích để làm việc với các đối tượng trong không gian 3D.

Định vị một CFrame

Bạn có thể tạo một CFrame trống tại vị trí mặc định của (0, 0, 0) bằng cách sử dụng CFrame.new(). Để định vị một CFrame tại một điểm cụ thể, cung cấp các tọa độ X, Y, và Z như các tham số cho CFrame.new(). Trong ví dụ sau, thuộc tính CFrame của phần redBlock thay đổi thành newCFrame, định vị nó tại (-2, 2, 4).


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Tạo CFrame mới
local newCFrame = CFrame.new(-2, 2, 4)
-- Ghi đè CFrame hiện tại của khối đỏ bằng CFrame mới
redBlock.CFrame = newCFrame
Trước
Sau

Ngoài ra, bạn có thể cung cấp một vị trí Vector3 mới cho CFrame.new() và đạt được cùng một kết quả:


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Tạo CFrame mới
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Ghi đè CFrame hiện tại của khối đỏ bằng CFrame mới
redBlock.CFrame = newCFrame

Xoay một CFrame

Để tạo một CFrame đã xoay, sử dụng hàm tạo CFrame.fromEulerAnglesXYZ(), cung cấp một góc xoay bằng radian cho các trục mong muốn. Các tham số của CFrame.fromEulerAnglesXYZ() là bằng radian, không phải bằng độ; nếu bạn thích bằng độ, sử dụng math.rad() để chuyển đổi độ thành radian. Trong ví dụ sau, phần redBlock xoay 45 độ theo chiều ngược kim đồng hồ trên trục Y của nó.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Tạo CFrame đã xoay mới
local newCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(45), 0)
-- Ghi đè CFrame hiện tại của khối đỏ bằng CFrame mới
redBlock.CFrame = newCFrame
Trước
Sau

Hướng một CFrame về một điểm

Bạn có thể sử dụng CFrame.lookAt() để chỉ hướng bề mặt phía trước của một CFrame tới một điểm cụ thể trong thế giới. Ví dụ sau đây định vị redBlock tại (0, 3, 0) và chỉ hướng bề mặt phía trước của nó, được đánh dấu bằng vòng tròn trắng, về phía phần blueCube.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
redBlock.Position = Vector3.new(0, 3, 0)
-- Chỉ hướng bề mặt phía trước của khối đỏ về phía khối xanh
redBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)
Trước
Sau

Dịch chuyển một CFrame

Để dịch chuyển một đối tượng bởi một số lượng cụ thể studs từ vị trí hiện tại của nó, hãy cộng hoặc trừ một Vector3 vào hoặc từ một CFrame mới tại vị trí của đối tượng. Để có được vị trí Vector3 đã được định dạng đúng của một đối tượng sử dụng với CFrame.new(), như đã thấy ở đây, thuộc tính Position (redBlock.Position) là một shortcut tiện lợi.


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

Bạn có thể sử dụng cùng một kỹ thuật để dịch chuyển một đối tượng từ vị trí của một đối tượng khác. Trong ví dụ sau, một Vector3 cộng vào một CFrame mới được tạo tại vị trí của khối xanh thay vì vị trí của khối đỏ.


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

Định hướng CFrame động

Các hàm tạo CFrame.new()CFrame.fromEulerAnglesXYZ() định vị hoặc xoay một đối tượng tại một định hướng cụ thể trong thế giới, nhưng đôi khi bạn không thể dựa vào một vị trí và góc xoay cố định. Ví dụ:

  • Đặt một kho báu nổi trực tiếp trước một người chơi có thể đứng ở bất cứ nơi nào trong thế giới, hướng về bất cứ hướng nào.
  • Làm một thần đèn xuất hiện ngay trên vai phải của một người chơi.

Trong những trường hợp này, hãy sử dụng các phương thức của CFrame thay vì các hàm tạo của chúng.

Vị trí tương đối

Hàm CFrame:ToWorldSpace() chuyển đổi CFrame của một đối tượng  — tôn trọng định hướng cục bộ của chính nó  — thành một định hướng thế giới mới. Điều này làm cho nó lý tưởng để dịch chuyển một phần tương đối với chính nó hoặc một đối tượng khác, bất kể nó đang được định vị/ xoay như thế nào.

Trong ví dụ sau, phần redBlock dịch chuyển 2 studs tương đối với trục Y của khối xanh (mũi tên xanh chỉ qua nó) và không tương đối với trục Y toàn cầu chỉ thẳng lên.


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)
Trước
Sau

Xoay tương đối

Bạn cũng có thể sử dụng CFrame:ToWorldSpace() để xoay một đối tượng tương đối với chính nó. Trong ví dụ sau, phần redBlock xoay 70 độ theo chiều ngược kim đồng hồ trên trục Y và 20 độ theo chiều kim đồng hồ trên trục Z.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local rotatedCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Trước
Sau

Hướng một bề mặt cụ thể về một điểm

Bạn có thể làm cho mặt trước của một đối tượng hướng về một đối tượng khác bằng cách cung cấp một điểm Vector3 như tham số thứ hai của CFrame.new(). Bạn cũng có thể sử dụng xoay tương đối để làm bất kỳ bề mặt nào của đối tượng hướng về một điểm Vector3. Ví dụ sau đây thực hiện hai thao tác CFrame liên tiếp:

  1. Chỉ hướng bề mặt trước, được đánh dấu bằng vòng tròn trắng, về hướng mục tiêu.
  2. Xoay CFrame để làm cho bề mặt trên , được đánh dấu bằng vòng tròn đen, chỉ về phía mục tiêu.

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Chỉ hướng bề mặt trước của khối đỏ về phía khối xanh
redBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)
-- Xoay CFrame tương đối với chính nó để bề mặt trên (không phải phía trước) chỉ về khối xanh
local rotatedCFrame = CFrame.fromEulerAnglesXYZ(math.rad(-90), 0, 0)
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Trước
Sau

Tìm một điểm giữa các điểm

Bạn có thể sử dụng nội suy tuyến tính, hay lerp, để định vị một CFrame giữa hai điểm. Trong ví dụ sau, phần redBlock định vị giữa các phần greenCubecyanCube. Giá trị 0.7 đặt nó cách xa khối xanh 70% khoảng cách.


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)
Trước
Sau
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.