对象空间与世界空间

Time:10 分钟

在处理游戏几何时,您可能会遇到术语 **object space(对象空间)**和 world space(世界空间)。在 Roblox 里,您可以在 Vector3 和 CFrame 函数中找到这些术语。这些术语指的是不同类型的坐标系或定义位置的方式。本文将帮助您理解它们在 Roblox 开发中的作用。

世界空间

一个 Roblox 角色站在足球场上

把世界空间想象成橄榄球场上的码线。码线不会移动,它们的作用就像坐标:你可以用它们来找到运动员在球场上的位置。

就像橄榄球场中一样,世界空间在每个 Roblox 游戏中都是相同的:位置 (0, 0, 0) 是游戏的中心。“前”方向始终为负 Z 方向,“右”方向始终为正 X 方向。部件的 Position 属性通常是指部件在世界空间中的位置,也称为部件的绝对位置。

在代码中处理位置数据时,先将位置和方向转换为世界空间是非常有用的。把它作为解决你遇到的任何几何问题的基础吧!

对象空间

两个足球运动员面对面。后方蓝色的有一个向右的箭头,标签为“His Left”(他的左方),前方红色的有一个向右的箭头,标签为“Your Right”(你的右方)

要理解对象空间,假设你是一名橄榄球运动员,你们队正面对着对手。如果你听到对手喊“向左跑!”,该球员肯定指的是相对于他们球队的对象空间的方向。要知道运动员所指的方向,必须将该方向转换到你们队的对象空间中。换句话说,他们的左边是你的右边。

这就是说,当我们谈到一个方向(“他的左”)的“所有权”时,我们实际上是在说“对他来说,那个方向是左”。从不同的角度来看,或者在不同的对象空间中,他说“左”而你可能会说“右”,然而两者都在谈论以不同方式表达的同一个方向。

位置与方向

datatype/Vector3 可用于存储位置数据(3D 点)和方向数据(3D 矢量),它们都使用 X、Y 和 Z 坐标,重要的是要辨识 Vector3 代表的是哪一个方向或轴。通常来说,可以从其来源进行判断:

  • Vector3.FromNormalIdVector3.FromAxis 返回指向给定方向或轴的向量。
    部件的 Orientation(朝向)是世界空间中的方向矢量。

  • CFrame:VectorToWorldSpaceCFrame: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官方链接:对象空间与世界空间