对象空间与世界空间¶
Time:10 分钟
在处理游戏几何时,您可能会遇到术语 **object space(对象空间)**和 world space(世界空间)。在 Roblox 里,您可以在 Vector3 和 CFrame 函数中找到这些术语。这些术语指的是不同类型的坐标系或定义位置的方式。本文将帮助您理解它们在 Roblox 开发中的作用。
世界空间¶
把世界空间想象成橄榄球场上的码线。码线不会移动,它们的作用就像坐标:你可以用它们来找到运动员在球场上的位置。
就像橄榄球场中一样,世界空间在每个 Roblox 游戏中都是相同的:位置 (0, 0, 0) 是游戏的中心。“前”方向始终为负 Z 方向,“右”方向始终为正 X 方向。部件的 Position 属性通常是指部件在世界空间中的位置,也称为部件的绝对位置。
在代码中处理位置数据时,先将位置和方向转换为世界空间是非常有用的。把它作为解决你遇到的任何几何问题的基础吧!
对象空间¶
要理解对象空间,假设你是一名橄榄球运动员,你们队正面对着对手。如果你听到对手喊“向左跑!”,该球员肯定指的是相对于他们球队的对象空间的方向。要知道运动员所指的方向,必须将该方向转换到你们队的对象空间中。换句话说,他们的左边是你的右边。
这就是说,当我们谈到一个方向(“他的左”)的“所有权”时,我们实际上是在说“对他来说,那个方向是左”。从不同的角度来看,或者在不同的对象空间中,他说“左”而你可能会说“右”,然而两者都在谈论以不同方式表达的同一个方向。
位置与方向¶
datatype/Vector3
可用于存储位置数据(3D 点)和方向数据(3D 矢量),它们都使用 X、Y 和 Z 坐标,重要的是要辨识 Vector3 代表的是哪一个方向或轴。通常来说,可以从其来源进行判断:
Vector3.FromNormalId
和Vector3.FromAxis
返回指向给定方向或轴的向量。
部件的 Orientation(朝向)是世界空间中的方向矢量。CFrame:VectorToWorldSpace
和CFrame:VectorToObjectSpace1
都接受和返回 Vector3 的方向向量。减去两个 Vector3,即
A - B
,得到的 Vector3 是 B 向 A 的方向。
转换函数¶
用于将坐标数据从对象空间转换到世界空间的函数在 datatype/CFrame
数据类型中。对于每一个函数,调用时的 CFrame 都应该表示的是所求对象的 CFrame。
*以 “ToObjectSpace” 结尾的函数转换世界空间中定义的数据,并返回对象空间中定义的相同数据。
*反之,以 “ToWorldSpace” 结尾的函数转换对象空间中定义的数据,并返回世界空间中定义的相同数据。
CFrame:ToObjectSpace()
CFrame:ToWorldSpace()
这些函数接受一个 CFrame 然后返回一个 CFrame。
CFrame:PointToObjectSpace()
CFrame:PointToWorldSpace()
这些函数接受一个位置 Vector3 然后返回一个位置 Vector3。
CFrame:VectorToObjectSpace()
CFrame:VectorToWorldSpace()
这些函数接受一个方向 Vector3 然后返回一个方向 Vector3。
示例¶
在这些示例中,我们将继续橄榄球的例子:红队球员和蓝队球员在试图接住一个抛出的橄榄球。我们拥有两个队员各自的 CFrame:
local redPlayerCF = workspace.RedPlayer.HumanoidRootPart.CFrame
local bluePlayerCF = workspace.BluePlayer.HumanoidRootPart.CFrame
local footballCF = workspace.Football.CFrame
要找到橄榄球相对于蓝色运动员的 CFrame:
footballCF:ToObjectSpace(bluePlayerCF)
要确定橄榄球是否在红色运动员前方:
footballCF:ToObjectSpace(redPlayerCF).Z > 0
红色运动员说相对于他,橄榄球移动到了指定 CFrame
newCF
。若想确定橄榄球球相对于蓝色运动员的位置:redPlayerCF:ToWorldSpace(newCF):ToObjectSpace(bluePlayerCF)
***Roblox官方链接:对象空间与世界空间