Khung 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 , ngắn cho Khung phối hợp , là một loại dữ liệu được sử dụng để xoay và định vị các đối tượng 3D.Là một thuộc tính đối tượng hoặc một đơn vị độc lập, một CFrame chứa các điểm x-, y- và z-toàn cầu cũng như dữ liệu quay cho mỗi trục.Ngoài ra, CFrames chứa các chức năng hữu ích để làm việc với các đối tượng trong không gian 3D.

Một số ví dụ về CFrame ứng dụng trong một trò chơi có thể là:

  • Tìm một điểm mục tiêu xa cho một viên đạn, giống như vị trí của một kẻ thù bị mục tiêu bởi laser của người chơi.
  • Di chuyển máy ảnh để tập trung vào NPC cụ thể như một người chơi tương tác với chúng.
  • Đặt một chỉ số trạng thái ngay trên đầu của một người chơi để hiển thị xem họ có bị tê liệt, tăng cường, bị đầu độc, etc.

Cơ bản CFrame

Vị trí một CFrame

Bạn có thể tạo một vị trí trống CFrame tại vị trí mặc định của (0, 0, 0) bằng cách sử dụng CFrame.new() .Để đặt một CFrame ở một điểm cụ thể, cung cấp x-, y-, và z-phối trí làm tham số cho CFrame.new() .Trong ví dụ sau, phần redBlock của phần CFrame thay đổi thuộc tính thành newCFrame , di chuyển lạ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 đè lại CFrame hiện tại của redBlock 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í mới Vector3 cho CFrame.new() và đạt được kết quả tương tự:


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 đè lại CFrame hiện tại của redBlock bằng CFrame mới
redBlock.CFrame = newCFrame

Xoay một CFrame

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


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

Trước
>

Sau
>

Đối mặt với một CFrame đối với một điểm

Bạn có thể sử dụng CFrame.new() để chỉ ra bề mặt trước của một CFrame tại một điểm cụ thể trên thế giới.Trong ví dụ tiếp theo, redBlock vị trí phần tại (0, 3, 0) và chỉ ra bề mặt trước của nó, được đánh dấu bằng vòng tròn trắng, tại phần blueCube.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Tạo một Vector3 cho cả vị trí bắt đầu và vị trí mục tiêu
local startPosition = Vector3.new(0, 3, 0)
local targetPosition = blueCube.Position
-- Đặt khối màu đỏ tại 'startPosition' và chỉ rằng bề mặt trước của nó tại 'targetPosition'
redBlock.CFrame = CFrame.new(startPosition, targetPosition)

Trước
>

Sau
>

Bồi thường một CFrame

Để bù trừ một đối tượng bằng một số đinh tán nhất định từ vị trí hiện tại của nó, thêm hoặc trừ bỏ một Vector3 đến hoặc từ một CFrame mới tại vị trí của đối tượng.Để có được một vị trí được định dạng đúng cách của một đối tượng để sử dụng với , như thấy ở đây, tính năng của nó ( ) là một lối tắt thuận tiện.


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 để bù trừ một đối tượng từ vị trí của đối tượng khác.Trong ví dụ sau, một Vector3 thêm vào một CFrame mới được tạo tại vị trí khối màu xanh lam 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
>

Hướng CFrame năng động

Các công trình CFrame.new()CFrame.Angles() xây dựng lại vị trí hoặc xoay một đối tượng tại một hướng cụ thể trong thế giới, nhưng đôi khi bạn không thể dựa vào vị trí cố định và góc xoay thế giới.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 trên thế giới, hướng về bất kỳ hướng nào.
  • Làm cho một genie ma thuật xuất hiện ngay trên vai phải của người chơi.

Trong những trường hợp này, sử dụng các phương pháp CFrame thay vì các constructor của chúng.

Vị trí tương đối

Chức năng CFrame:ToWorldSpace() biến đổi một đối tượng thành CFrame - tôn trọng hướng mặc định của riêng nó - thành một hướng mới thế giới .Điều này làm cho nó trở nên lý tưởng để bù trừ một phần so với chính nó hoặc một đối tượng khác, bất kể nó hiện đang được đặt/xoay như thế nào.

Trong ví dụ sau, phần redBlock bị trừ 2 đinh tán so với trục y của khối xanh dương (mũi tên xanh chỉ qua nó) và không so 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
>

Vòng xoay tương đối

Bạn cũng có thể sử dụng CFrame:ToWorldSpace() để xoay một đối tượng so với chính nó.Trong ví dụ sau, phần redBlock quay 70 độ theo chiều 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.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)

Trước
>

Sau
>

Đối mặt với một bề mặt cụ thể theo hướng một điểm

Bạn có thể làm cho mặt trước của một đối tượng đối mặt với 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 tương quan xoay để làm cho bất kỳ khuôn mặt của đối tượng hướng tới một điểm Vector3 .Ví dụ sau đây thực hiện hai lần liên tiếp CFrame hoạt động:

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

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Tạo một Vector3 cho vị trí mục tiêu
local targetPosition = blueCube.Position
-- Chỉ vị trí bề mặt trước của redBlock tại 'targetPosition'
redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)
-- Bây giờ bề mặt trước của redBlock (vòng tròn trắng) đang chỉ về blueCube
-- Xoay CFrame của redBlock so với chính nó để mặt trên cùng (không phải mặt trước) hướng về mục tiêu
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)

Trước
>

Sau
>

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

Bạn có thể sử dụng phép lượng tuyến tính , hoặc lerp , để đặt một CFrame giữa hai điểm.Trong ví dụ sau, phần redBlock thay đổi vị trí giữa các phần greenCubecyanCube.Giá trị của 0.7 đặt nó 70% khoảng cách từ khối xanh lá cây


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
>