一个 CFrame ,通常指 协调框架 ,是用于旋转和位置 3D 对象的数据类型。作为对象属性或独立单元,一个 CFrame 包含全球 x,y 和 z 坐标,还有旋转数据对于每个轴。
游戏中的某些示例 CFrame 应用程序可能包括:
- 寻找一个遥远的目标点,例如玩家的激光冲击波瞄准的敌人的位置。
- 移动相机以便让其专注于特定 NPC,当玩家与他们交互时。
- 将状态指示放置在玩家头上,直接显示他们是否瘫痪、强化、中毒等。
CFrame 基础
正确位置 CFrame
您可以使用 CFrame 在默认位置(0, 0, 0)的位置创建一个空的 Datatype.CFrame</
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() 构建器,提供一个旋转角度在 radian 为所需的轴。 参数 CFrame.Angles()
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-- 创建一个 Vector3 用于开始位置和目标位置local 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 添加到一个蓝色方块的位置而不是一个方砖块的位置。
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 变形为一个尊重其自身本地方向的新世界方向。这使它成为了在将零件相对于自己或其他对象的任何位置或方向时都理想的抵消方案。
在下面的例子中,redBlock 零件的 Offset 相对于蓝色方块 (绿色箭头指向它) 和 not 相对于全球 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 度时钟wise。
local redBlock = workspace.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
正在面向特定表面向一个点
您可以使对象的前部另一个对象,通过提供 Vector3 点作为第二个参数提供 CFrame.new() 。您也可以使用相对旋转来使任何面向 Vector3 的对象。以下示例使用了两个相继的 2> Datatype.CFrame2>
- 指向 前 表面,由白色圆圈标记,在目标上。
- 旋转CFrame 以使 最上方 表面,由黑色圆圈标记,指向目标。
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- 为目标位置创建一个 Vector3local targetPosition = blueCube.Position-- 将 redBlock 的前表面指向 'targetPosition'redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- 现在,红色方块的前表面(白色圆圈)正指向蓝立方-- 将 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> greenCube1> 和 4> cyan
local redBlock = workspace.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)