Datatype.CFrame,簡稱 坐標框 ,是一種用於旋轉 3D 對象的資料類型。作為一個對象屬性或獨立單元,CFrame 包含全球 x,y,和 z 坐標,並且包含每個軸
遊戲中的 CFrame 應用程式可能包括:
- 尋找一個位於遠處的目標點,例如玩家的雷射噴射器瞄準的敵人。
- 將相機移動,讓它專注在特定 NPC 上,當玩家與他們交互。
- 放置狀態指示器直接在玩家頭上,以顯示他們是否癱瘓、強化、中毒等。
CFrame 基本知識
正確定位 CFrame
您可以使用 CFrame 在預設位置(0, 0, 0)創建空 CFrame.new()
local redBlock = workspace.RedBlock-- 創建新 CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- 用新的 CFrame 覆蓋 redBlock 的當前 CFrameredBlock.CFrame = newCFrame
或者,您可以提供一個新的 Vector3 位置給 CFrame.new() 並且達到同樣的結果:
local redBlock = workspace.RedBlock-- 創建新 CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- 用新的 CFrame 覆蓋 redBlock 的當前 CFrameredBlock.CFrame = newCFrame
旋轉 CFrame
要在旋轉 CFrame 中使用旋轉角度,請使用 CFrame.Angles() 構造器,提供旋轉角度以範圍提供所需的軸。 參數 Datatype
local redBlock = workspace.RedBlock-- 創建新旋轉 CFramelocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- 用新的 CFrame 覆蓋 redBlock 的當前 CFrameredBlock.CFrame = newCFrame
正面向一個點
您可以使用 CFrame.new() 指向世界上的特定位置 CFrame 的前表面。在下一個例子中, redBlock 零件位置在(0,3,0),並且指向標有白色圓圈的 1> blueCube1> 零件。
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- 為開始位置和目標位置創建一個 Vector3local startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- 將紅色方塊放在 '開始位置' 並將其前表面指向 '目標位置'redBlock.CFrame = CFrame.new(startPosition, targetPosition)
設定 CFrame
要在對物件的位置上的特定數量的螺柱從其當前位置來償償對象,請將 Vector3 添加或減去新的 CFrame
local redBlock = workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
您可以使用相同的技術來從另一個對象的位置來偏移一個對物件。在下面的例子中,一個 Vector3 添加到了一個新的 CFrame 在藍色方磚塊的位置而不是位置。
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
動態 CFrame 定向
Datatype.CFrame.new()和Datatype.CFrame.Angles() 構建器會在世界中的特定方向內重新位置或旋轉對象,但您無法總是依賴固定世界位置和旋轉角度。例如:
- 將一個漂浮的寶藏放置在玩家面前,他們可能站在世界的任何地方,面向任何方向。
- 在玩家右肩上直接出現魔法精靈。
在這些情況下,請使用 CFrame 方法而不是它們的建造器。
相對位置
Datatype.CFrame:ToWorldSpace() 函數會將一個對物件的 CFrame 變成新的 世界 導向。這使得它成為了在對自己或其他對象的相對位置或方向上帶來新的 1>世界1> 導向。這使得它非常適合用於將某個零件相對於自己或其他對物件來說明其
在下面的例子中,redBlock 零件的 Offset 是 2 個相對於藍色方塊 (箭頭指向) 和 不 相對於全球 Y 軸指向直上。
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
相對旋轉
您也可以使用 CFrame:ToWorldSpace() 來旋轉對象相對於自己。在下一個示例中, redBlock 零件在 y 軸上 70 度反時鐘,在 z 軸上 20 度。
local redBlock = workspace.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
正面向一個點的特定表面
您可以使對象的前部面對另一個對象,提供 Vector3 點作為第二個參數,並使用相對旋轉使任何面向 CFrame.new() 的對象點向一個 Vector3 點。以下示例執行兩個連續的 1> Datatype.CFrame
- 指向 前 表面,由白色圓圈標記,在目標上。
- 旋轉 CFrame 以使 上方 表面,由黑色圓圈標記,指向目標。
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- 為目標位置建立Vector3local targetPosition = blueCube.Position-- 指向紅色方塊的前表面在 'targetPosition'redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- 現在 redBlock 的前表面 (白色圓圈) 指向藍立方-- 將 redBlock 的 CFrame 旋轉到自己的位置,以便其頂面 (不是前面) 指向目標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)
在點之間尋找點
您可以使用 線性 interpolation 或 lerp 來將 CFrame 放置在兩個點之間。在下一個示例中, 1> redBlock1> 部分在 4> greenC
local redBlock = workspace.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)