Camera 對象定義 3D 世界的視圖。在執行中的體驗中,每個客戶有自己的 Camera 對象,該客戶的本地 Workspace 中,可以通過 1> Class.Workspace.CurrentCamera1> 屬性存取。
最重要的鏡頭屬性是:
Camera.CFrame 代表攝影機的位置和方向。
Camera.CameraType ,這是體驗的攝影機腳本所讀取的,並決定攝影機每個幀率的更新方式。
Camera.CameraSubject ,這是閱取體驗攝影機指令碼的機器人,並決定攝影機應該跟追蹤哪一個對象。
Camera.FieldOfView 代表可觀測世界的可見程度。
Camera.Focus 代表攝影機正在瞄準的點。這很重要,因為某些視覺會變得更詳細,並且更頻繁更新,取決於攝影機離焦點有多近。
參閱 「自訂相機」,了解如何調整並自訂相攝影機的行為。
概要
屬性
Class.Camera 的 Camera,定義其位置和方向在 3D 世界中。
指定 Enum.CameraType 以便攝影機腳本閱取。
設置攝影機的斜角檢視野角度。
設定攝影機的垂直視野角。
決定 Camera 的視野值,在視窗尺寸變更時不變。
設定 Roblox 圖形系統優先考慮的 3D 區域。
切換是否使用 VR 裝置自動追蹤玩家的頭部運動。
設定使用 VR 時用戶的世界觀點的大小。
設定攝影機視野的角度沿最長視窗軸。
描述攝影機附近的平裁剪的 Z 負偏偏移值。
切換是否要在玩家使用 VR 裝置時從 Camera.CFrame 屬性應用傾斜和滾動。
Roblox 客戶端上的裝置安全區的尺寸。
方法
返回 BaseParts 陰晃在鏡頭 Camera.CFrame 和投射點之間的攝影機線之間的行線,以隱藏視線。
返回 radians 當前滾動,或在 Class.Camera 使用 Class.Camera:SetRoll() 的滾動。
設定攝影機頭 Z 軸上的目前旋轉。
從視窗位置(以像素計)創建單位Ray,在Camera的指定深度(以像素計)。不考慮CoreUISafeInsets的套裝。
返回屏幕位置和深度一個 Vector3 worldPoint 和是否在屏幕範圍內。計算屏幕內容。
返回屏幕位置和深度一個 Vector3 worldPoint 和是否在屏幕範圍內。不包括在設定屏幕的 GUI 中。
活動
發射時間 Camera 已完成使用 Camera:Interpolate() 的 Class.Camera:Interpolate 。
屬性
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.CurrentCameracamera.CameraType = Enum.CameraType.Scriptablelocal 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.CurrentCameracamera.CameraType = Enum.CameraType.Scriptablelocal player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal pos = camera.CFrame * Vector3.new(0, 20, 0)local lookAtPos = character.PrimaryPart.Positionlocal targetCFrame = CFrame.lookAt(pos, lookAtPos)local tween = TweenService:Create(camera, TweenInfo.new(2), {CFrame = targetCFrame})tween:Play()
CameraSubject
CameraSubject 接受各種 Instances 。預設視頻腳本對可用設定回應不同:
預設情況下,攝影機腳本跟隨本地角色的 Humanoid ,考慮人形的當前狀態和 Humanoid.CameraOffset。
設為 BasePart 時,相機指令跟隨其位置,並且在 VehicleSeats 的情況下會有垂直 Offset。
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.CurrentCameralocal headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScale-- 這將相當於 Camera:GetRenderCFrame()local renderCFrame = camera.CFrame * headCFrame
建議您不要禁用此屬性 為 以下理由:
- 玩家可能會因為沒有相等的頭部追蹤解決方案而感到不適。
- 當 頭鎖定 是真的時,Roblox 引擎會執行延遲最佳化。
也看看
- VRService:GetUserCFrame() 可以用來獲得頭部的 CFrame 。
- VRService:RecenterUserHeadCFrame() 用於將頭重新定位到 VR 裝置的當前位置和方向。
- Class.Camera:GetRenderCFrame() 函數,可以將 Camera.CFrame 與使用者頭部的 CFrame 結合。
HeadScale
頭部 是使用 VR 時用戶的世界觀點的尺寸。
在 VR 中 1 個單位的尺寸是 0.3 meters / HeadScale,這表示大型 頭盤 值與使用 VR 裝置時,從用戶的視角看來更小,因為 VR 裝置上的 頭盤 值與世界上看起來更小。例如,一個高達 1 米的零件看起來會是 0.6 米的
此屬性由 VRService.AutomaticScaling 自動控制,以將玩家的視角與他們的虛擬人偶大小保持一致。如果您打算控制 頭部 自動大小,或使用自訂角色,切換 VRService.AutomaticScaling 至 2>Class.VRService.Off2>。
此屬性不應與 Humanoid.HeadScale 混淆,其是一個 NumberValue 與 Humanoid 控制其尺寸的父級。
MaxAxisFieldOfView
MaxAxisFieldOfView 屬性設定相機可以檢視的最長視窗軸上的度數。
當最長軸是垂直軸時,此屬性會與 FieldOfView 屬性相似。這是一般在裝置處於肖像方向時發生的情況。在地形方向中,最長軸會是水平軸;在此情況下,此屬性描述 Camera。
NearPlaneZ
NearPlaneZ 屬性描述攝影機的近接飛機在 stud 的距離,在鏡頭的 Camera.CFrame 前。 任何離這個飛機很短距離的地方都不會會在鏡頭前成像建切割視圖,因此在鏡頭和攝
VRTiltAndRollEnabled
此屬性切換是否要從 Camera.CFrame 屬性應用斜角和滾動。 Class.Camera.CFrame 的玩家正在使用 VR 裝置時切換是否應用斜角和滾動。
為了防止運動 sickness,地平線應該保持平等級。 使用 VR 裝置時,斜角和滾動玩家的視圖可能會導致玩家之間的物理空間和虛擬空間之間的連接斷開。 變更玩家的視覺方向可能會導致玩家失去平衡或體驗頭盪。
因此,建議您將此屬性關閉,除非您檢驗了您的體驗對這些效果的影響。即使啟用傾斜和滾動,您也可能想要確認玩家總是有穩定的參考框,例如車輛內部或地板,可以幫助他們在他們的物理空間上自我地板。
ViewportSize
ViewportSize 返回目前屏幕上的裝置安全區域的尺寸。此區域是一個長方形,包括 Roblox 上方條狀區域,但不包括任何裝置邊框或屏幕切割。 Class.Camera.ViewportSize|ViewportSize 的單位是 Roblox UI 偏移單位,可能與原始顯示像素不同。
如所述上述,ViewportSize 不等於斷腿或鑽頭區域的尺寸。要獲得所有顯示的尺寸,
最後,請注意,ViewportSize 不是攝影機在渲染時使用的實際視窗尺寸。Camera.FieldOfView 和 Camera.DiagonalFieldOfView 屬性基於全螢幕區域,不是1>Class.Camera.ViewportSize1>
鏡頭更新
只有 Camera 目前由 Class.Workspace. CurrentCamera 參照的才有其 ViewportSize 更新在每個框架中 during the 1> Class.RunService.PreRender|PreRender
方法
GetPartsObscuringTarget
此方法返回一個 BaseParts 陰晃在攝影機頭 Camera.CFrame 和 Vector3 位置之間的陣列列之隱藏。任何 1> Class.Instance|Instances
castPoints 參數是由 Vector3 位置的陣列提供。 注意陣列的 BaseParts 返回的順序是隨機排列的,並且提供額外的射線投射資料。 如果您需要擊位、材料或表面正常,您應該選擇
local camera = workspace.CurrentCameralocal 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> 之間。
參數
返回
一個隱藏在 BaseParts 中的陣列,使攝影機頭的 Camera.CFrame 和 castPoints 之間的視線隱藏。
範例程式碼
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.CurrentCameralocal headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScalerenderCFrame = camera.CFrame * headCFrame
攝影機的渲染 CFrame 只會在 Camera.HeadLocked 屬性是真的時變更。
返回
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() ,以範圍計。
範例程式碼
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.CurrentCameralocal length = 500local unitRay = camera:ScreenPointToRay(100, 100)local extendedRay = Ray.new(unitRay.Origin, unitRay.Direction * length)
此功能僅適用於目前的工作區攝影機。其他攝影機,例如您創建的 ViewportFrame ,具有初始視窗尺寸為 (1, 1) ,並且只有在您設置為 Workspace.CurrentCamera 後才會更新。視窗尺寸
參數
返回
SetRoll
此功能已過時且不再被視為最佳實踐。
此功能設定 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.CFramelocal rollCFrame = CFrame.Angles(0, 0, roll)workspace.CurrentCamera.CFrame = currentCFrame * rollCFrame
參數
返回
ViewportPointToRay
此功能在設備安全視窗位置中的 2D 位置創建單位 Ray 從定義在像素的深度 (以 stud 計) 外的世界位置的 2D 位置。 此功能的射線來自 Vector3 等級的 2D 位置在指定的深度 (以 stud 計) 外的 Camera 。
如下所示,(0, 0) 與 Roblox 上方條狀鍵盤的左上角相對應。這表示輸入 2D 位置不帳算鍵盤上的 Ennum.ScreenInsets|CoreUISafeInsets ,但它帳算任何 Ennum.ScreenInsets|DeviceSafeInsets
注意,UI 實例使用不同的坐標系統 (GuiObject.AbsolutePosition 使用 CoreUISafeInsets 視窗坐標系統,而此功能使用 DeviceSafeInsets 視窗坐標系統。如果您想指定核心 UI 坐標,請使用
也注意,此功能只適用於 Class.Workspace. CurrentCamera 相攝影機。其他相機,例如您創建的 ViewportFrame ,有一個初始視區大小為 (1, 1) 並且只有在您設
此功能可以與 ViewportSize 屬性結合,以從屏幕中央創建一個射線,例如:
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal viewportPoint = camera.ViewportSize / 2local unitRay = camera:ViewportPointToRay(viewportPoint.X, viewportPoint.Y, 0)
作為 Ray 創建的單位射線,它只是一個長度為 2 的單位。要創建更長的射線,您可以執行以追蹤中操作:
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal length = 500local unitRay = camera:ScreenPointToRay(100, 100)local extendedRay = Ray.new(unitRay.Origin, unitRay.Direction * length)
參數
位置在 Y 軸的位置,以像素的形式,視窗點,在裝置的安全區域的坐標。
返回
WorldToScreenPoint
此功能返回Vector3 的屏幕位置和深度,以及worldPoint 和此點是否位於屏幕的邊界。
此功能考慮到目前的圖形用戶界面,例如上方欄位所佔用的空間,意味著返回的 2D 位置與 GUI 位置相同,可以用於放置 GUI 元素。對於無視圖形用戶界面的其他相同的功能,請參閱 Camera:WorldToViewportPoint()。
local camera = workspace.CurrentCameralocal 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 將無論是否隱藏在 true 或 BaseParts 中,都會以 2>true2> 無論點是否被 5>Class.BasePart|BaseParts5> 或 8>Class.Terrain8> 遮蔽。
參數
Datatype.Vector3 世界位置。
返回
WorldToViewportPoint
此功能返回Vector3 的屏幕位置和深度,以及worldPoint 和此點是否位於屏幕的邊界。
此函數不考慮目前的GUI插入,例如占用空間的上方條狀,因此返回的 2D 位置將從視角左上角的Top Bar取得。 若您使用 ScreenGui.IgnoreGuiInset,此位置不適合放置GUI元素。
對於其他相同的功能,請參閱 Camera:WorldToScreenPoint()。
local camera = workspace.CurrentCameralocal 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 將無論是否隱藏在 true 或 BaseParts 中,都會以 2>true2> 無論點是否被 5>Class.BasePart|BaseParts5> 或 8>Class.Terrain8> 遮蔽。
參數
Datatype.Vector3 世界位置。
返回
活動
InterpolationFinished
此事件發生,當 Camera 已完成使用 Camera:Interpolate() 函數的 interpolation 完成。
若再次呼叫 Camera:Interpolate(),則不會發生此事件。
您建議使用 TweenService 來動畫 Camera ,而不是使用它,因為它更可靠,並提供更多選項來幫助減輕樣式。