Camera

顯示已棄用項目

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

未複製

Camera 對象定義 3D 世界的視圖。在執行中的體驗中,每個客戶有自己的 Camera 對象,該客戶的本地 Workspace 中,可以通過 1> Class.Workspace.CurrentCamera1> 屬性存取。

最重要的鏡頭屬性是:

  • Camera.CFrame 代表攝影機的位置和方向。

  • Camera.CameraType ,這是體驗的攝影機腳本所讀取的,並決定攝影機每個幀率的更新方式。

  • Camera.CameraSubject ,這是閱取體驗攝影機指令碼的機器人,並決定攝影機應該跟追蹤哪一個對象。

  • Camera.FieldOfView 代表可觀測世界的可見程度。

  • Camera.Focus 代表攝影機正在瞄準的點。這很重要,因為某些視覺會變得更詳細,並且更頻繁更新,取決於攝影機離焦點有多近。

參閱 「自訂相機」,了解如何調整並自訂相攝影機的行為。

概要

屬性

方法

屬性

CFrame

平行讀取

此屬性是 CFrame 的 Class.Camera ,定義其位置和方向在 3D 世界中。注意一些變形,例如使用 VR 裝置時頭部的旋轉,並不會反映在此屬性中,因此您應該使用 Class.Camera:GetRenderCFrame()

您可以設置此屬性來移動相機。 然而,預設相機指令碼也會設置,因此您應該:

  • 將相機設置為 Camera.CameraType 以將預設相機指令碼更新為 Enum.CameraType.Scriptable ,因此無需更新相攝影機的 CFrame 。此方法最簡單,並且在大多數情況下推薦。

  • 完全取代預設視頻腳本以替換。這種方法僅適用於不需要任何預設視頻功能的情況。

使用 Camera 構造器將 CFrame.lookAt() 位置在 Camera 中,並將其向向 1>Datatype. Vector3.new(10, 0, 0)1> 。在下


local camera = workspace.CurrentCamera
camera.CameraType = Enum.CameraType.Scriptable
local pos = Vector3.new(0, 10, 0)
local lookAtPos = Vector3.new(10, 0, 0)
workspace.CurrentCamera.CFrame = CFrame.lookAt(pos, lookAtPos)

雖然攝影機可以放置在上方所示的方式,但您可以要求它移動到另一個 CFrame 。為此,您可以:

  • 每個框架使用 RunService:BindToRenderStep()CFrame:Lerp() 方法設置攝影機的位置/方向。

  • 創建並播放 Tween 以動畫攝影機的位置/方向:


    local Players = game:GetService("Players")
    local TweenService = game:GetService("TweenService")
    local camera = workspace.CurrentCamera
    camera.CameraType = Enum.CameraType.Scriptable
    local player = Players.LocalPlayer
    local character = player.Character
    if not character or character.Parent == nil then
    character = player.CharacterAdded:Wait()
    end
    local pos = camera.CFrame * Vector3.new(0, 20, 0)
    local lookAtPos = character.PrimaryPart.Position
    local targetCFrame = CFrame.lookAt(pos, lookAtPos)
    local tween = TweenService:Create(camera, TweenInfo.new(2), {CFrame = targetCFrame})
    tween:Play()

CameraSubject

平行讀取

CameraSubject 接受各種 Instances 。預設視頻腳本對可用設定回應不同:

CameraSubject 無法設為 nil。嘗試這樣做會將它重設為以前值。

要恢復 CameraSubject 至其預設值,將它設置為本地角色的 Humanoid


local Players = game:GetService("Players")
local localPlayer = Players.LocalPlayer
local function resetCameraSubject()
if workspace.CurrentCamera and localPlayer.Character then
local humanoid = localPlayer.Character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
workspace.CurrentCamera.CameraSubject = humanoid
end
end
end

CameraType

平行讀取

預設 Roblox 攝影機指令碼具有多個內置行為。設置此屬性會切換在各種 Enum.CameraType 行為之間。請注意,有些攝影機類型需要有效的 Camera.CameraSubject 才能正確運行。

CameraType 設為 Enum.CameraType.Scriptable 時,將不會移動或更新相機。 為了獲得更多關於位置和方向相機手動的信息,請參閱 Camera.CFrame

對於所有 CameraType 設定 除了 Enum.CameraType.Scriptable 外 , 1> Class.Camera.CameraSubject|CameraSubject1> 屬性代表攝影機的 4> Class.Camera.Focus4> 設置的對象。

DiagonalFieldOfView

未複製
平行讀取

設定攝影機在垂直方向(從視窗一個角落到另一個角落)的方向中可以查檢視的度數。請參閱 FieldOfView 以了解更適合的視檢視範圍。

注意,DiagonalFieldOfView 代表隱藏於某些裝置上的 Camera 渲染的視野區域,這區域可能會因為階梯或屏幕切換而關閉。請參閱 Class. Camera.ViewportSize|ViewportSize 以取得更多資訊。

FieldOfView

平行讀取

視野 屬性設定攝影機可以檢視垂直方向的度數。這個屬性是在 1 和 120 度之間調整的,預設為 70 度。非常低或非常高的視野會對玩家造成困惑,因為它們可以讓玩家感到迷惑。

注意,無論是否強制使用單位,垂直和水平視野總是會按照屏幕的方向比例來關係。

建議使用 FieldOfView (FOV) 包括:

  • 減少 FOV 以給人一種放大的感覺,例如使用 binoculars 時。
  • 增加玩家「衝刺」時的視野,讓人覺得沒有控制。

注意,FieldOfView 代表畫面可以由 Camera 渲染到的視野,這可能會因為某些設備的邊緣或屏幕切割而隱藏。請參閱 Class.Camera. ViewportSize|ViewportSize 以取得更多資訊。

FieldOfViewMode

平行讀取

攝影機的視野必須更新,反映 ViewportSize 變更。 FieldOfViewMode 值決定哪個 FOV 值將被保持不變。

舉例來說,當此屬性設為 Enum.FieldOfViewMode.Vertical 時,視窗大小調整時,視野會更新,但視野的垂直大小會保持不變。如果此屬性設為 Enum.FieldOfViewMode.Diagonal ,視野的大小將會變更,以保持垂直 FOV 的一致性。如果此屬性設為 Entity.FieldOfViewMode.Diagonal</

Focus

平行讀取

某些圖形操作,例如更新照明,可能需要時間或計算努力才能完成。 相攝影機的 專注度 屬性告訴引擎哪個區域在 3D 空間中優先考慮。 例如,從對象如 PointLights 的動態照明可能無法在遙遠的距離從專注度。

Roblox 預設的鏡頭指令碼會自動設定 專

專注 對攝影機頭的位置或方向沒有影響;請參閱 Camera.CFrame 了解此內容。

HeadLocked

平行讀取

切換是否要自動跟蹤玩家使用 VR 裝置的頭部動作。當 true (預設) 時,引擎會結合 Camera.CFrame 與玩家頭部的 Enum.UserCFrame 來渲染玩家的視圖,並且考慮到頭部跟蹤的因素。


local UserInputService = game:GetService("UserInputService")
local camera = workspace.CurrentCamera
local headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)
headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScale
-- 這將相當於 Camera:GetRenderCFrame()
local renderCFrame = camera.CFrame * headCFrame

建議您不要禁用此屬性 以下理由:

  • 玩家可能會因為沒有相等的頭部追蹤解決方案而感到不適。
  • 頭鎖定 是真的時,Roblox 引擎會執行延遲最佳化。

也看看

HeadScale

平行讀取

頭部 是使用 VR 時用戶的世界觀點的尺寸。

在 VR 中 1 個單位的尺寸是 0.3 meters / HeadScale,這表示大型 頭盤 值與使用 VR 裝置時,從用戶的視角看來更小,因為 VR 裝置上的 頭盤 值與世界上看起來更小。例如,一個高達 1 米的零件看起來會是 0.6 米的

此屬性由 VRService.AutomaticScaling 自動控制,以將玩家的視角與他們的虛擬人偶大小保持一致。如果您打算控制 頭部 自動大小,或使用自訂角色,切換 VRService.AutomaticScaling 至 2>Class.VRService.Off2>。

此屬性不應與 Humanoid.HeadScale 混淆,其是一個 NumberValueHumanoid 控制其尺寸的父級。

MaxAxisFieldOfView

未複製
平行讀取

MaxAxisFieldOfView 屬性設定相機可以檢視的最長視窗軸上的度數。

當最長軸是垂直軸時,此屬性會與 FieldOfView 屬性相似。這是一般在裝置處於肖像方向時發生的情況。在地形方向中,最長軸會是水平軸;在此情況下,此屬性描述 Camera

NearPlaneZ

唯讀
未複製
平行讀取

NearPlaneZ 屬性描述攝影機的近接飛機在 stud 的距離,在鏡頭的 Camera.CFrame 前。 任何離這個飛機很短距離的地方都不會會在鏡頭前成像建切割視圖,因此在鏡頭和攝

Diagram showing how the NearPlaneZ clips (does not render) 3D content between the plane and the camera.

VRTiltAndRollEnabled

平行讀取

此屬性切換是否要從 Camera.CFrame 屬性應用斜角和滾動。 Class.Camera.CFrame 的玩家正在使用 VR 裝置時切換是否應用斜角和滾動。

為了防止運動 sickness,地平線應該保持平等級。 使用 VR 裝置時,斜角和滾動玩家的視圖可能會導致玩家之間的物理空間和虛擬空間之間的連接斷開。 變更玩家的視覺方向可能會導致玩家失去平衡或體驗頭盪。

因此,建議您將此屬性關閉,除非您檢驗了您的體驗對這些效果的影響。即使啟用傾斜和滾動,您也可能想要確認玩家總是有穩定的參考框,例如車輛內部或地板,可以幫助他們在他們的物理空間上自我地板。

ViewportSize

唯讀
未複製
平行讀取

ViewportSize 返回目前屏幕上的裝置安全區域的尺寸。此區域是一個長方形,包括 Roblox 上方條狀區域,但不包括任何裝置邊框或屏幕切割。 Class.Camera.ViewportSize|ViewportSize 的單位是 Roblox UI 偏移單位,可能與原始顯示像素不同。

Mobile device screen with cutout showing device safe area.

如所述上述,ViewportSize 不等於斷腿或鑽頭區域的尺寸。要獲得所有顯示的尺寸,

最後,請注意,ViewportSize 不是攝影機在渲染時使用的實際視窗尺寸。Camera.FieldOfViewCamera.DiagonalFieldOfView 屬性基於全螢幕區域,不是1>Class.Camera.ViewportSize1>

鏡頭更新

只有 Camera 目前由 Class.Workspace. CurrentCamera 參照的才有其 ViewportSize 更新在每個框架中 during the 1> Class.RunService.PreRender|PreRender

方法

GetPartsObscuringTarget

Instances

此方法返回一個 BaseParts 陰晃在攝影機頭 Camera.CFrameVector3 位置之間的陣列列之隱藏。任何 1> Class.Instance|Instances

castPoints 參數是由 Vector3 位置的陣列提供。 注意陣列的 BaseParts 返回的順序是隨機排列的,並且提供額外的射線投射資料。 如果您需要擊位、材料或表面正常,您應該選擇


local camera = workspace.CurrentCamera
local castPoints = {
Vector3.new(0, 10, 0),
Vector3.new(0, 15, 0)
}
local ignoreList = {}
local partsObscuringTarget = camera:GetPartsObscuringTarget(castPoints, ignoreList)

如果 Terrain 隱藏了一個 cast 點, BaseParts 隱藏了 cast 點在隱藏 Terrain 和隱藏 1> Class.BasePart|BaseParts1> 之間。

參數

castPoints: Array

一個 Vector3 位置的 cast 點。

ignoreList: Instances

一個含有 Instances 的陣列,應該被忽略,並且與它們的後代。


返回

Instances

一個隱藏在 BaseParts 中的陣列,使攝影機頭的 Camera.CFramecastPoints 之間的視線隱藏。

範例程式碼

X-Ray Function

local Workspace = game:GetService("Workspace")
local camera = Workspace.CurrentCamera
local function XRay(castPoints, ignoreList)
ignoreList = ignoreList or {}
local parts = camera:GetPartsObscuringTarget(castPoints, ignoreList)
for _, part in parts do
part.LocalTransparencyModifier = 0.75
for _, child in pairs(part:GetChildren()) do
if child:IsA("Decal") or child:IsA("Texture") then
child.LocalTransparencyModifier = 0.75
end
end
end
end
XRay({ Vector3.new() })

GetRenderCFrame

此功能會將 CFrame 的實際 Camera 返回,包括 VR 的影響 (VR 頭部變形對 Camera.CFrame 屬性不適用,因此最佳練習是使用 2>Class.Camera

例如,使用 VR 時,Camera 會在 CFrame 中渲染:


local UserInputService = game:GetService("UserInputService")
local camera = workspace.CurrentCamera
local headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)
headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScale
renderCFrame = camera.CFrame * headCFrame

攝影機的渲染 CFrame 只會在 Camera.HeadLocked 屬性是真的時變更。


返回

Datatype.CFrameCamera 正在渲染。

GetRoll

此函數將在 radian 中返回,Camera 使用 Camera:SetRoll() 對應的滾動。滾動是由 Z 軸周圍的旋轉定義。

此函數只會返回使用 Camera:SetRoll() 函數的滾動。滾動手動應用到攝影機的 Camera.CFrame 不會被計數。要獲得 Camera 的實際滾動,包括滾動手動應用,您可以使用以下示例:


local function getActualRoll()
local camera = workspace.CurrentCamera
local trueUp = Vector3.new(0, 1, 0)
local cameraUp = camera:GetRenderCFrame().upVector
return math.acos(trueUp:Dot(cameraUp))
end

返回

目前的滾動應用由 Camera:SetRoll() ,以範圍計。

範例程式碼

Camera:GetRoll

local currentRoll = math.deg(workspace.CurrentCamera:GetRoll()) -- Gets the current roll of the camera in degrees.
if currentRoll ~= 20 then
workspace.CurrentCamera:SetRoll(math.rad(20)) -- If the camera isn't at 20 degrees roll, the roll is set to 20 degrees.
end

ScreenPointToRay

平行寫入

此功能在屏幕上的 2D 位置創建單位 Ray (定義於像素),負責計算 GUI 的插入。 Ray 的起源來自於絕對深度 (以 studs 的深度來表示) 從 Vector3 上的 2D 位置遠處

這個函數承認圖形用戶界面的插入,因此對於GUI元素(例如從上方條狀)的Offset應被計算。這意味著指定的螢幕位置將在左上角開始。對於其他相同的功偏移值,不需要計算GUI Offset(例如從上方條狀)。請使用 Camera:ViewportPointToRay()

作為 Ray 創建的單位射線,它只是一個長度為 2 的單位。要創建更長的射線,您可以執行以追蹤中操作:


local camera = workspace.CurrentCamera
local length = 500
local unitRay = camera:ScreenPointToRay(100, 100)
local extendedRay = Ray.new(unitRay.Origin, unitRay.Direction * length)

此功能僅適用於目前的工作區攝影機。其他攝影機,例如您創建的 ViewportFrame ,具有初始視窗尺寸為 (1, 1) ,並且只有在您設置為 Workspace.CurrentCamera 後才會更新。視窗尺寸

參數

X軸上的位置,以像素計,屏幕點,在該位置原始化Ray。此位置代表GUI插件。

位置在 Y 軸,以像素計的螢幕點,Ray 的起始位置。這個位置代表 GUI 的入置。

depth: number

深度從 Camera ,以 Ray 的深度,從此來償還 Datatype.Ray 的起始位置。

預設值:0

返回

單位 Ray ,起源於等效的 Vector3 世界位置的給屏幕坐標在深度 Camera 之外。這個射線是在 1> Class.Camera1> 的方向。

SetRoll

void

此功能已過時且不再被視為最佳實踐。

此功能設定 Camera 的目前滾動,以範圍計算,滾動後 Camera.CFrame 和代表相攝影機 Z 軸的旋轉。

舉例來說,下列將會倒轉 Camera :


workspace.CurrentCamera:SetRoll(math.pi) -- math.pi radians = 180 degrees

SetRoll 對使用 Camera.CFrame 屬性的任何滾動沒有效果。 使用 SetRoll 滾動的樣子不會反射在 Camera.CFrame 屬性,但會反射在 CFrame 返回的 1>Class.Camera:GetRenderCFrame1> 中。

此功能只有在 Camera.CameraType 設為 'Scriptable' ,無論是否使用預設視頻腳本。如果與任何 Camera.CameraType 一起使用,輸出中會提示警告。

使用此功能適用的任何滾動將在 Camera.CameraType 從 「Scriptable」 變更時失去。

要使用此功能取得滾動集合,請使用 Camera:GetRoll()

此功能已過時,建議您使用 Camera 中的 Camera.CFrame 屬性來應用滾動。例如:


local currentCFrame = workspace.CurrentCamera.CFrame
local rollCFrame = CFrame.Angles(0, 0, roll)
workspace.CurrentCamera.CFrame = currentCFrame * rollCFrame

參數

rollAngle: number

角度(以範數),應該適用於 Camera


返回

void

ViewportPointToRay

平行寫入

此功能在設備安全視窗位置中的 2D 位置創建單位 Ray 從定義在像素的深度 (以 stud 計) 外的世界位置的 2D 位置。 此功能的射線來自 Vector3 等級的 2D 位置在指定的深度 (以 stud 計) 外的 Camera

如下所示,(0, 0) 與 Roblox 上方條狀鍵盤的左上角相對應。這表示輸入 2D 位置不帳算鍵盤上的 Ennum.ScreenInsets|CoreUISafeInsets ,但它帳算任何 Ennum.ScreenInsets|DeviceSafeInsets

Diagram showing the origin of the device safe area viewport coordinate system.

注意,UI 實例使用不同的坐標系統 (GuiObject.AbsolutePosition 使用 CoreUISafeInsets 視窗坐標系統,而此功能使用 DeviceSafeInsets 視窗坐標系統。如果您想指定核心 UI 坐標,請使用

也注意,此功能只適用於 Class.Workspace. CurrentCamera 相攝影機。其他相機,例如您創建的 ViewportFrame ,有一個初始視區大小為 (1, 1) 並且只有在您設

此功能可以與 ViewportSize 屬性結合,以從屏幕中央創建一個射線,例如:


local Workspace = game:GetService("Workspace")
local camera = Workspace.CurrentCamera
local viewportPoint = camera.ViewportSize / 2
local unitRay = camera:ViewportPointToRay(viewportPoint.X, viewportPoint.Y, 0)

作為 Ray 創建的單位射線,它只是一個長度為 2 的單位。要創建更長的射線,您可以執行以追蹤中操作:


local Workspace = game:GetService("Workspace")
local camera = Workspace.CurrentCamera
local length = 500
local unitRay = camera:ScreenPointToRay(100, 100)
local extendedRay = Ray.new(unitRay.Origin, unitRay.Direction * length)

參數

X軸的位置,以像素計量,Ray 的起始點,在裝置安全區域的坐標。

位置在 Y 軸的位置,以像素的形式,視窗點,在裝置的安全區域的坐標。

depth: number

深度從 Camera ,以 Ray 的深度,從此來償還 Datatype.Ray 的起始位置。

預設值:0

返回

單位 Ray ,起源於同等的 Vector3 世界位置的指定視窗坐標在指定深度離開 Camera 。這個射線是在 1> Class.Camera1> 的方向上旋轉的。

WorldToScreenPoint

平行寫入

此功能返回Vector3 的屏幕位置和深度,以及worldPoint 和此點是否位於屏幕的邊界。

此功能考慮到目前的圖形用戶界面,例如上方欄位所佔用的空間,意味著返回的 2D 位置與 GUI 位置相同,可以用於放置 GUI 元素。對於無視圖形用戶界面的其他相同的功能,請參閱 Camera:WorldToViewportPoint()


local camera = workspace.CurrentCamera
local worldPoint = Vector3.new(0, 10, 0)
local vector, onScreen = camera:WorldToScreenPoint(worldPoint)
local screenPoint = Vector2.new(vector.X, vector.Y)
local depth = vector.Z

注意此功能不會執行任何射線投射,且指示屏幕內是否包含 worldPoint 將無論是否隱藏在 trueBaseParts 中,都會以 2>true2> 無論點是否被 5>Class.BasePart|BaseParts5> 或 8>Class.Terrain8> 遮蔽。

參數

worldPoint: Vector3

Datatype.Vector3 世界位置。


返回

包含以下順序的套件:

  • A Vector3 其 X 和 Y 部分代表屏幕左上角的 worldPoint 的偏移,以像素表示。Vector3 的 Z 部分代表屏幕的深度 (以 stud 表示)。

  • worldPoint 是否位於屏幕內的屏幕區域內。

WorldToViewportPoint

平行寫入

此功能返回Vector3 的屏幕位置和深度,以及worldPoint 和此點是否位於屏幕的邊界。

此函數不考慮目前的GUI插入,例如占用空間的上方條狀,因此返回的 2D 位置將從視角左上角的Top Bar取得。 若您使用 ScreenGui.IgnoreGuiInset,此位置不適合放置GUI元素。

對於其他相同的功能,請參閱 Camera:WorldToScreenPoint()


local camera = workspace.CurrentCamera
local worldPoint = Vector3.new(0, 10, 0)
local vector, onScreen = camera:WorldToViewportPoint(worldPoint)
local viewportPoint = Vector2.new(vector.X, vector.Y)
local depth = vector.Z

注意此功能不會執行任何射線投射,且指示屏幕內是否包含 worldPoint 將無論是否隱藏在 trueBaseParts 中,都會以 2>true2> 無論點是否被 5>Class.BasePart|BaseParts5> 或 8>Class.Terrain8> 遮蔽。

參數

worldPoint: Vector3

Datatype.Vector3 世界位置。


返回

包含以下順序的套件:

  • A Vector3 的 X 和 Y 零件代表視窗左上角的 worldPoint 從檢視角器頂角落代表 在像素的深度。 Datatype.Vector3 的 Z 零件代表檢視器頂角落的深度。

  • worldPoint 是否位於屏幕內的屏幕區域內。

ZoomToExtents

void

參數

boundingBoxCFrame: CFrame
boundingBoxSize: Vector3

返回

void

活動

InterpolationFinished

此事件發生,當 Camera 已完成使用 Camera:Interpolate() 函數的 interpolation 完成。

若再次呼叫 Camera:Interpolate(),則不會發生此事件。

您建議使用 TweenService 來動畫 Camera ,而不是使用它,因為它更可靠,並提供更多選項來幫助減輕樣式。