Camera

Hiển Thị Bản Đã Lỗi Thời

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Không Sao Chép

Vật Camera định nghĩa một cái nhìn về thế giới 3D.Trong một trải nghiệm đang chạy, mỗi khách hàng có đối tượng riêng của mình ở trong địa phương của khách hàng đó, có thể truy cập thông qua thuộc tính .

Các thuộc tính máy ảnh quan trọng nhất là:

  • CFrame đại diện cho vị trí và hướng của máy ảnh.

  • CameraType được đọc bởi các kịch bản máy ảnh của trải nghiệm và xác định cách máy ảnh nên cập nhật mỗi khung.

  • CameraSubject được đọc bởi các kịch bản máy ảnh của trải nghiệm và xác định đối tượng mà máy ảnh nên theo dõi.

  • FieldOfView đại diện cho phạm vi có thể nhìn thấy của thế giới quan sát được.

  • Focus đại diện cho điểm mà camera đang nhìn vào.Quan trọng là thuộc tính này được cài đặt, vì một số hình ảnh sẽ chi tiết hơn và sẽ được cập nhật thường xuyên hơn tùy thuộc vào mức độ gần với điểm tập trung.

Xem Tùy chỉnh máy ảnh để có thêm thông tin về cách điều chỉnh và tùy chỉnh hành vi của máy ảnh.

Lưu trữ nhiều camera

Lưu ý rằng khi thay đổi Workspace.CurrentCamera thành một Camera mới, tất cả các Cameras khác trực tiếp giảm từ Workspace sẽ bị phá hủy.Nếu bạn cần lưu trữ nhiều máy ảnh và trao đổi giữa chúng theo yêu cầu, được khuyến nghị rằng bạn lưu chúng trong một Folder hoặc Model dưới Workspace, trong đó chúng sẽ vẫn còn nguyên khi CurrentCamera được thay đổi.

Tóm Tắt

Thuộc Tính

  • Đọc Song Song

    The CFrame of the Camera , xác định vị trí và hướng của nó trong thế giới 3D.

  • Đọc Song Song

    Các Humanoid hoặc BasePart là chủ đề Camera.

  • Đọc Song Song

    Xác định Enum.CameraType để được đọc bởi các kịch bản máy ảnh.

  • Không Sao Chép
    Đọc Song Song

    Đặt góc của góc nhìn chéo của máy ảnh.

  • Đọc Song Song

    Đặt góc của lĩnh vực nhìn ngang của camera.

  • Xác định giá trị FOV của Camera mà không thay đổi khi thay đổi kích thước cửa sổ xem.

  • Đọc Song Song

    Đặt khu vực trong không gian 3D được ưu tiên bởi các hệ thống đồ họa của Roblox.

  • Đọc Song Song

    Bật/tắt việc máy ảnh sẽ tự động theo dõi chuyển động đầu của một người chơi bằng thiết bị VR.

  • Đọc Song Song

    Đặt quy mô của quan điểm của người dùng về thế giới khi sử dụng VR.

  • Không Sao Chép
    Đọc Song Song

    Đặt góc của lĩnh vực nhìn của camera theo trục xem dài nhất.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Mô tả độ trừ Z âm, bằng đơn vị đo, của gần khung cắt của máy ảnh.

  • Bật/tắt việc áp dụng độ nghiêng và lộn từ thuộc tính CFrame khi người chơi đang sử dụng thiết bị VR.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Kích thước của khu vực an toàn thiết bị trên một khách hàng Roblox.

Thuộc Tính kế thừa từ PVInstance
  • Không Sao Chép
    Không Thể Viết Kịch Bản
    Đọc Song Song
  • Không Sao Chép
    Không Thể Viết Kịch Bản
    Đọc Song Song

Phương Pháp

  • GetPartsObscuringTarget(castPoints : Array,ignoreList : Instances):Instances

    Trả về một array của BaseParts đang che khuất các đường nhìn giữa camera của CFrame và các điểm phát sóng.

  • Trả về thực tế CFrame nơi Camera đang được hiển thị, tính toán cho bất kỳ cuộn được áp dụng và tác động của thiết bị VR.

  • Trả về trong radians cuộn hiện tại, hoặc xoay quanh trục Z của máy ảnh, áp dụng cho Camera bằng cách sử dụng SetRoll() .

  • Ghi Song Song

    Tạo một đơn vị Ray từ vị trí trên màn hình (bằng pixel), ở độ sâu được đặt sẵn từ Camera hướng vào máy ảnh.Tài khoản cho việc chèn GUI.

  • SetRoll(rollAngle : number):()

    Đặt vòng xoay hiện tại được áp dụng xung quanh trục Z của máy ảnh.

  • Ghi Song Song

    Tạo một đơn vị Ray từ vị trí trên cửa sổ (bằng像素), ở độ sâu nhất định từ Camera, hướng về phía máy ảnh.Không tính đến đoạn CoreUISafeInsets nhúc nhích.

  • Ghi Song Song

    Trả vị trí và độ sâu của màn hình của Datatype.Vector3``worldPoint và xem liệu điểm này có nằm trong giới hạn của màn hình hay không.Tài khoản cho việc chèn GUI.

  • Ghi Song Song

    Trả vị trí và độ sâu của màn hình của Datatype.Vector3``worldPoint và xem liệu điểm này có nằm trong giới hạn của màn hình hay không.Không tính đến việc chèn GUI.

  • ZoomToExtents(boundingBoxCFrame : CFrame,boundingBoxSize : Vector3):()
Phương Pháp kế thừa từ PVInstance

Thuộc Tính

CFrame

Đọc Song Song

Thuộc tính này là CFrame của Camera, xác định vị trí và hướng của nó trong thế giới 3D.Lưu ý rằng một số biến đổi, chẳng hạn như việc xoay đầu khi sử dụng thiết bị VR, không được phản ánh trong tính chất này, vì vậy bạn nên sử dụng GetRenderCFrame() để có được "thực sự" CFrame của máy ảnh.

Bạn có thể di chuyển máy ảnh bằng cách đặt thuộc tính này. Tuy nhiên, các kịch bản máy ảnh mặc định cũng đặt nó, vì vậy bạn nên:

  • Chỉnh sửa camera CameraType để Enum.CameraType.Scriptable các kịch bản máy ảnh mặc định không cập nhật ảnh của camera CFrame .Phương pháp này đơn giản nhất và được khuyến nghị trong hầu hết các trường hợp.

  • Thay thế hoàn toàn các kịch bản máy ảnh mặc định bằng các lựa chọn thay thế.Cách tiếp cận này chỉ được khuyến nghị nếu bạn không cần bất kỳ chức năng máy ảnh mặc định nào.

Cách dễ hiểu nhất để vị trí và hướng Camera là bằng cách sử dụng constructor CFrame.lookAt().Trong ví dụ sau, Camera được đặt tại Vector3.new(0, 10, 0) và được hướng tới Vector3.new(10, 0, 0) .


local Workspace = game:GetService("Workspace")
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)

Mặc dù camera có thể được đặt theo cách được minh họa ở trên, bạn có thể muốn hoạt hình nó để di chuyển mượt mà từ một CFrame sang một khác.Đối với điều này, bạn có thể:

  • Đặt vị trí/hướng của camera mỗi khung với RunService:BindToRenderStep() và phương pháp CFrame:Lerp().

  • Tạo và chơi một Tween tạo hoạt hình vị trí/hướng của máy ảnh:


    local Players = game:GetService("Players")
    local TweenService = game:GetService("TweenService")
    local Workspace = game:GetService("Workspace")
    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

Đọc Song Song

CameraSubject chấp nhận một loạt các Instances . Các kịch bản máy ảnh mặc định phản ứng khác nhau với các cài đặt có sẵn:

  • Mặc định, các kịch bản máy ảnh tuân theo Humanoid của nhân vật địa phương, bao gồm tình trạng hiện tại của humanoid và Humanoid.CameraOffset .

  • Khi được đặt thành BasePart, các kịch bản máy ảnh theo dõi vị trí của nó, với một chênh lệch theo chiều dọc trong trường hợp VehicleSeats .

CameraSubject không thể được đặt thành nil . Cố gắng làm như vậy sẽ đưa nó trở lại giá trị trước đó.

Để khôi phục CameraSubject về giá trị mặc định, đặt nó thành Humanoid của nhân vật địa phương:


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

CameraType

Đọc Song Song

Các kịch bản máy ảnh Roblox mặc định có một số hành vi được tích hợp.Bộ đặt tính này chuyển đổi giữa các hành vi Enum.CameraType khác nhau.Lưu ý rằng một số loại máy ảnh yêu cầu một CameraSubject hợp lệ để hoạt động đúng.

Các kịch bản máy ảnh mặc định sẽ không di chuyển hoặc cập nhật máy ảnh nếu CameraType được đặt thành Enum.CameraType.Scriptable .Để biết thêm thông tin về việc đặt và hướng dẫn camera bằng tay, xem CFrame .

Đối với tất cả các cài đặt ngoại trừ , thuộc tính đại diện cho đối tượng có vị trí mà vị trí của máy ảnh được đặt.

DiagonalFieldOfView

Không Sao Chép
Đọc Song Song

Xác định bao nhiêu độ trong chiều ngang (từ một góc của viewport đến góc đối diện của nó) mà camera có thể xem.Xem FieldOfView để có một lời giải thích chung chung hơn về góc nhìn.

Lưu ý rằng DiagonalFieldOfView đại diện cho góc nhìn mà có thể nhìn thấy bởi Camera render vào khu vực màn hình toàn màn hình có thể bị che khuất bởi các gờ hoặc cắt màn hình trên một số thiết bị.Xem ViewportSize để biết thêm thông tin.

FieldOfView

Đọc Song Song

Thuộc tính FieldOfView (FOV) xác định số độ trong chiều ngang mà máy ảnh có thể nhìn thấy.Thuộc tính này bị giới hạn giữa 1120 độ và mặc định tại 70 .Các lĩnh vực nhìn rất thấp hoặc rất cao không được khuyến khích vì chúng có thể gây choáng cho người chơi.

Lưu ý rằng tỉ lệ thu nhỏ đồng đều được áp dụng, có nghĩa là góc nhìn ngang và dọc luôn luôn liên quan đến tỷ lệ khổ màn hình.

Các sử dụng được đề xuất cho FieldOfView bao gồm:

  • Giảm FOV để tạo ấn tượng về sự phóng to, ví dụ khi sử dụng kính lúp.
  • Tăng FOV khi người chơi "chạy" để tạo ấn tượng về sự thiếu kiểm soát.

Lưu ý rằng FieldOfView đại diện cho góc nhìn mà có thể nhìn thấy bởi Camera render vào khu vực màn hình toàn màn hình có thể bị che khuất bởi các gờ hoặc cắt màn hình trên một số thiết bị.Xem ViewportSize để biết thêm thông tin.

FieldOfViewMode

Đọc Song Song

Ảnh của camera FieldOfView (FOV) phải được cập nhật để phản ánh ViewportSize thay đổi.Giá trị của FieldOfViewMode xác định giá trị FOV nào sẽ được giữ nguyên.

Ví dụ, khi thuộc tính này được đặt thành Enum.FieldOfViewMode.Vertical, FOV ngang được cập nhật khi cửa sổ bị thay đổi kích thước, nhưng FOV dọc được giữ nguyên.Nếu thuộc tính này được đặt thành Enum.FieldOfViewMode.Diagonal , cả FOV ngang và dọc có thể được thay đổi để giữ cho FOV song song không thay đổi.

Focus

Đọc Song Song

Một số hoạt động đồ họa mà động cơ thực hiện, chẳng hạn như cập nhật ánh sáng, có thể mất thời gian hoặc nỗ lực tính toán để hoàn thành.Thuộc tính của camera Focus cho thông số động cơ trong không gian 3D nào ưu tiên thực hiện các hoạt động như vậy.Ví dụ, ánh sáng năng động từ các đối tượng như PointLights có thể không hiển thị ở khoảng cách xa tập trung.

Các kịch bản máy ảnh mặc định của Roblox tự động đặt Focus để theo dõi CameraSubject (thường là Humanoid ).Tuy nhiên, Focus sẽ không tự động cập nhật khi CameraType được đặt thành Enum.CameraType.Scriptable hoặc khi các kịch bản máy ảnh mặc định không được sử dụng.Trong những trường hợp này, bạn nên cập nhật Focus mỗi khung, sử dụng phương pháp RunService:BindToRenderStep() tại ưu tiên Enum.RenderPriority.Camera.

Focus không có ảnh hưởng đến vị trí hoặc hướng của máy ảnh; xem CFrame đối với điều này.

HeadLocked

Đọc Song Song

Bật/tắt việc máy ảnh sẽ tự động theo dõi chuyển động đầu của một người chơi bằng thiết bị VR.Khi true (mặc định), động cơ kết hợp CFrame với Enum.UserCFrame của đầu của người dùng để hiển thị cái nhìn của người chơi với dữ liệu theo dõi đầu được tính toán.Cái nhìn sẽ được hiển thị tại CFrame sau đây:


local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local camera = Workspace.CurrentCamera
local headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)
headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScale
-- Điều này sẽ tương đương với Camera:GetRenderCFrame()
local renderCFrame = camera.CFrame * headCFrame

Khuyến nghị không không vô hiệu hóa tính năng này vì các lý do sau:

  • Người chơi có thể bị chóng mặt nếu không có giải pháp theo dõi đầu tương đương được thêm vào.
  • Cơ chế Roblox thực hiện tối ưu hóa độ trễ khi HeadLocked là đúng.
Xem thêm

HeadScale

Đọc Song Song

HeadScale là quy mô của quan điểm của người dùng về thế giới khi sử dụng VR.

Kích thước của 1 đinh tán trong VR là 0.3 meters / HeadScale , có nghĩa là các giá trị lớn hơn HeadScale tương đương với thế giới trông nhỏ hơn từ quan điểm của người dùng khi sử dụng thiết bị VR.Ví dụ, một phần cao 1 đinh tán có vẻ cao 0,6 mét đối với một người chơi VR với HeadScale của 0.5 .

Thuộc tính này được kiểm soát tự động bởi VRService.AutomaticScaling để căn chỉnh quan điểm của người chơi với kích thước của avatar của họ.Nếu bạn có ý định kiểm soát HeadScale bản thân hoặc sử dụng nhân vật tùy chỉnh, chuyển sang VRService.AutomaticScaling để Enum.VRScaling.Off .

Tính chất này không nên nhầm lẫn với Humanoid.HeadScale đó là một NumberValue được gán cho một Humanoid để kiểm soát quy mô của nó.

MaxAxisFieldOfView

Không Sao Chép
Đọc Song Song

Các thiết lập tính năng MaxAxisFieldOfView xác định số độ dọc theo trục xem lớn nhất mà máy ảnh có thể xem.

Khi trục dài nhất là trục dọc, thuộc tính này sẽ hành xử tương tự như thuộc tính FieldOfView.Đây là trường hợp chung khi một thiết bị ở trong hướng dọc.Trong một hướng cảnh quan, trục dài nhất sẽ là trục ngang; trong trường hợp này, thuộc tính mô tả trường nhìn ngang của Camera .

NearPlaneZ

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Thuộc tính NearPlaneZ mô tả cách xa mức cắt gần của máy ảnh, bằng đơn vị stud.Máy cắt gần là một máy bay hình học nằm trước CFrame của camera.Bất cứ thứ gì giữa máy bay này và máy ảnh sẽ không hiển thị, tạo ra một cái nhìn cắt khi xem các đối tượng ở rất ngắn khoảng cách.Giá trị của NearPlaneZ dao động trên các nền tảng khác nhau và hiện đang luôn nằm giữa -0.1-0.5 .

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

VRTiltAndRollEnabled

Đọc Song Song

Thuộc tính này chuyển đổi xem có nên áp dụng độ nghiêng và lăn từ thuộc tính CFrame trong khi người chơi đang sử dụng thiết bị VR.

Để ngăn ngừa chứng say sóng, ranh giới nên được cấpở mức bằng.Nghiêng và lăn góc nhìn của người chơi trong khi sử dụng thiết bị VR có thể gây mất kết nối giữa không gian vật lý của người chơi và không gian ảo họ đang xem.Thay đổi hướng xuống dưới rõ ràng có thể khiến người chơi mất cân bằng hoặc trải nghiệm chóng mặt.

Vì những lý do này, thông thường nó là không khuyến khích để để tính năng này bị vô hiệu hóa, trừ khi bạn đã kiểm tra trải nghiệm của bạn một cách bài bản cho những hiệu ứng này.Ngay cả khi có khả năng nghiêng và lăn bật được bật, bạn có thể muốn đảm bảo người chơi luôn có một khung tham chiếu ổn định, chẳng hạn như nội thất của một chiếc xe hoặc một tầng có thể giúp người chơi tự định vị trong không gian vật lý của họ.

ViewportSize

Chỉ Đọc
Không Sao Chép
Đọc Song Song

ViewportSize trả về kích thước khu vực an toàn của thiết bị trên màn hình hiện tại.Khu vực này là một hình chữ nhật bao gồm khu vực thanh trên cùng của Roblox nhưng không bao gồm bất kỳ khuyết tật thiết bị hoặc cắt màn hình nào.Các đơn vị của ViewportSize là đơn vị bù trừ UI Roblox có thể khác với điểm hiển thị bản địa.

Mobile device screen with cutout showing device safe area.

Như đã đề cập ở trên, ViewportSize không bằng kích thước khu vực toàn màn hình trên các màn hình có cắt bỏ hoặc gờ.Để có được kích thước khu vực toàn màn hình trên tất cả các màn hình, bạn có thể truy vấn thuộc tính AbsoluteSize của một ScreenGui với ScreenInsets được đặt thành None .Xem Enum.ScreenInsets để có thêm thông tin về cách các khu vực màn hình được định nghĩa.

Cuối cùng, lưu ý rằng ViewportSize không phải là kích thước cửa sổ thực mà máy ảnh sử dụng để hiển thị (máy ảnh hiển thị trong khu vực toàn màn hình).Ngoài ra, các thuộc tính FieldOfViewDiagonalFieldOfView được dựa trên khu vực toàn màn hình, không phải ViewportSize .

Cập nhật máy ảnh

Chỉ Camera hiện được đề cập bởi Workspace.CurrentCamera hiện đang được cập nhật ViewportSize mỗi khung trong bước PreRender .Các ViewportSize của tất cả các máy ảnh khác trong trải nghiệm của bạn sẽ không được cập nhật, bao gồm cả những máy ảnh được sử dụng cho ViewportFrames .

Phương Pháp

GetPartsObscuringTarget

Instances

Phương pháp này trả về một mảng của BaseParts những điều khó nhìn giữa các vị trí CFrameVector3 của máy ảnh trong mảng castPoints.Bất kỳ Instances bao gồm trong mảng ignoreList sẽ bị bỏ qua, cùng với con cháu của chúng.

Tham số castPoints được cung cấp như một mảng của Vector3 vị trí.Lưu ý rằng mảng của BaseParts trả về ở một trật tự ngẫu nhiên, và không có dữ liệu raycast bổ sung nào được cung cấp.Nếu bạn cần dữ liệu như vị trí đánh, chất liệu đánh, hoặc bề mặt bình thường, bạn nên chọn phương pháp WorldRoot:Raycast() .


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

Nếu Terrain che khuất điểm ném, BaseParts che khuất điểm ném giữa che khuất Terrain và điểm ném sẽ không được trả lại.

Tham Số

castPoints: Array

Một mảng của Vector3 vị trí của điểm ném.

Giá Trị Mặc Định: ""
ignoreList: Instances

Một mảng của Instances nên bị bỏ qua, cùng với con cháu của chúng.

Giá Trị Mặc Định: ""

Lợi Nhuận

Instances

Một mảng của BaseParts những gì làm mờ các đường nhìn giữa camera của CFramecastPoints .

GetRenderCFrame

Phương pháp này trả về thực tế CFrame của Camera như nó được hiển thị, bao gồm tác động của VR (biến hình đầu VR không áp dụng cho thuộc tính CFrame nên tốt nhất là sử dụng GetRenderCFrame() để có được "thực sự" CFrame của quan điểm của người chơi).

Ví dụ, khi sử dụng VR, Camera thực sự được render tại CFrame sau đây:


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

Hiển thị của máy ảnh CFrame sẽ chỉ được thay đổi để tính toán đầu khi thuộc tính HeadLocked là true.


Lợi Nhuận

Cái CFrame the Camera đang được render tại.

GetRoll

Phương pháp này trả về, bằng radian, cuộn hiện tại được áp dụng cho Camera bằng cách sử dụng SetRoll() .Cuộn được định nghĩa là xoay quanh trục Z của máy ảnh.

Phương pháp này chỉ trả về cuộn được áp dụng bằng cách sử dụng phương pháp SetRoll().Cuộn được áp dụng thủ công cho ảnh của máy ảnh CFrame không được tính vào.Để có được cuộn thực của Camera, bao gồm cuộn được áp dụng thủ công, bạn có thể sử dụng các đoạn sau:


local Workspace = game:GetService("Workspace")
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

Lợi Nhuận

Cuộn hiện tại được áp dụng bởi SetRoll() , trong radian.

Mẫu mã

This example, when used in a LocalScript, will retrieve the current roll of the camera in degrees. Then, if the camera roll angle is not 20 degrees, the camera roll angle is set to 20 degrees.

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

Ghi Song Song

Phương pháp này tạo một đơn vị Ray từ vị trí 2D trên màn hình (được định nghĩa bằng像素), tính cho việc chèn GUI.Nguồn bắt nguồn từ 2D vị trí trong thế giới tương đương với độ sâu đã cho (bằng studs) cách xa .

Vì phương pháp này công nhận sự xuất hiện của GUI, thì offset áp dụng cho các thành phần GUI (như từ thanh trên cùng) được tính toán.Điều này có nghĩa là vị trí màn hình được chỉ định sẽ bắt đầu ở góc trên cùng bên trái dưới thanh trên cùng.Đối với một phương pháp tương tự khác không tính đến độ trừ bù GUI, hãy sử dụng ViewportPointToRay() .

Vì đối tượng Ray được tạo là một tia đơn vị, nó chỉ dài một đinh tán. Để tạo một tia dài hơn, bạn có thể làm theo điều theo dõi:


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)

Phương pháp này chỉ hoạt động cho camera hiện tại Workspace .Các máy ảnh khác, chẳng hạn như những máy ảnh bạn tạo cho một ViewportFrame , có kích thước cửa sổ ban đầu là (1, 1) và chỉ được cập nhật sau khi bạn đặt chúng thành Workspace.CurrentCamera .Sự không phù hợp trong kích thước cửa sổ gây ra việc máy ảnh trả về một tia với sai lệch Ray.Direction .

Tham Số

Vị trí trên trục X , bằng pixel, của điểm màn hình mà để xuất phát Ray. Vị trí này chiếm tỷ lệ GUI chèn.

Giá Trị Mặc Định: ""

Vị trí trên trục Y , bằng pixel, của điểm màn hình mà để xuất phát Ray . Vị trí này chiếm tỷ lệ GUI chèn.

Giá Trị Mặc Định: ""
depth: number

Chiều sâu từ Camera , trong đinh tán, từ đó để bù trừ nguồn gốc của Ray .

Giá Trị Mặc Định: 0

Lợi Nhuận

Một đơn vị Ray , xuất phát từ vị trí tương đương Vector3 của màn hình được cho ở độ sâu đã cho từ điểm Camera .Tia này được hướng dẫn theo hướng của Camera .

SetRoll

()

Phương pháp này đã lỗi thời và không còn được coi là tốt nhất.

Phương pháp này đặt cuộn hiện tại, bằng radian, của Camera .Cuộn được áp dụng sau CFrame và đại diện cho sự xoay xung quanh trục Z của máy ảnh.

Ví dụ, sau đây sẽ đảo ngược Camera :


local Workspace = game:GetService("Workspace")
Workspace.CurrentCamera:SetRoll(math.pi) -- math.pi radians = 180 degrees

SetRoll không có tác động đến bất kỳ cuộn nào được áp dụng bằng cách sử dụng thuộc tính CFrame .Cuộn được áp dụng bằng SetRoll không được phản ánh trong tính năng CFrame nhưng được phản ánh trong CFrame được trả về bởi GetRenderCFrame() .

Phương pháp này chỉ có thể được sử dụng khi CameraType được đặt thành Scriptable , bất kể liệu các kịch bản máy ảnh mặc định có được sử dụng hay không.Nếu nó được sử dụng với bất kỳ điều khác CameraType một cảnh báo sẽ được cung cấp trong output.

Bất kỳ cuộn nào được áp dụng bằng cách này sẽ bị mất khi CameraType được thay đổi từ Scriptable.

Để lấy bộ cuộn sử dụng phương pháp này, sử dụng GetRoll() .

Vì phương pháp này đã lỗi thời, bạn được khuyên nên áp dụng cuộn thay vào Camera bằng cách sử dụng thuộc tính CFrame. Ví dụ:


local Workspace = game:GetService("Workspace")
local currentCFrame = Workspace.CurrentCamera.CFrame
local rollCFrame = CFrame.Angles(0, 0, roll)
Workspace.CurrentCamera.CFrame = currentCFrame * rollCFrame

Tham Số

rollAngle: number

Góc lăn, bằng radian, để áp dụng cho Camera .

Giá Trị Mặc Định: ""

Lợi Nhuận

()

ViewportPointToRay

Ghi Song Song

Phương pháp này tạo một đơn vị Ray từ vị trí 2D trong cửa sổ an toàn thiết bị, được định nghĩa bằng像素.Tia phát xuất từ Vector3 tương đương với vị trí 2D trên thế giới ở độ sâu đã cho (bằng đinh tán) cách xa Camera .

Như được minh họa dưới đây, (0, 0) phù hợp với điểm trên cùng bên trái của thanh trên cùng của Roblox.Điều này có nghĩa là vị trí nhập 2D không không tính đến CoreUISafeInsets inset, nhưng nó tính cho bất kỳ DeviceSafeInsets nào.

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

Lưu ý rằng các ví dụ UI sử dụng một hệ thống phối trí khác ( > sử dụng hệ thống phối trí cửa sổ trong khi phương pháp này sử dụng hệ thống phối trí cửa sổ).Nếu bạn muốn xác định vị trí trong phối cảnh UI chính, vui lòng sử dụng ScreenPointToRay() .

Cũng lưu ý rằng phương pháp này chỉ hoạt động cho camera Workspace.CurrentCamera.Các máy ảnh khác, chẳng hạn như những máy ảnh bạn tạo cho một ViewportFrame , có kích thước cửa sổ ban đầu là (1, 1) và chỉ được cập nhật sau khi bạn đặt chúng thành CurrentCamera .Sự không phù hợp trong kích thước cửa sổ gây ra việc máy ảnh trả về một tia với sai lệch Ray.Direction .

Phương pháp này có thể được sử dụng kết hợp với thuộc tính ViewportSize để tạo một tia từ trung tâm của màn hình, ví dụ:


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

Vì đối tượng Ray được tạo là một tia đơn vị, nó chỉ dài một đinh tán. Để tạo một tia dài hơn, bạn có thể làm theo điều theo dõi:


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)

Tham Số

Vị trí trên trục X , bằng pixel, của điểm nhìn ở đó để bắt nguồn Ray, trong phạm vi an toàn thiết bị.

Giá Trị Mặc Định: ""

Vị trí trên trục Y , bằng像素, của điểm quan sát tại đó để bắt nguồn Ray, trong điểm định vị an toàn thiết bị.

Giá Trị Mặc Định: ""
depth: number

Chiều sâu từ Camera , trong đinh tán, từ đó để bù trừ nguồn gốc của Ray .

Giá Trị Mặc Định: 0

Lợi Nhuận

Một đơn vị , xuất phát từ vị trí tương đương của điểm quan sát được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại độ sâu được cho tại đơn được cho tại được cho tại độ sâu từ vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị vị trong vị trong vị trong vị vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị trong vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vị vTia này được hướng dẫn theo hướng của Camera .

WorldToScreenPoint

Ghi Song Song

Phương pháp này trả vị trí và độ sâu của màn hình của Datatype.Vector3``worldPoint và xem liệu điểm này có nằm trong giới hạn của màn hình hay không.

Phương pháp này xem xét chèn GUI hiện tại, chẳng hạn như không gian bị chiếm bởi thanh trên cùng, có nghĩa là vị trí 2D được trả về tương đương với vị trí GUI và có thể được sử dụng để đặt các thành phần GUI.Đối với một phương pháp tương tự khác mà bỏ qua việc chèn GUI, xem WorldToViewportPoint() .


local Workspace = game:GetService("Workspace")
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

Lưu ý phương pháp này không thực hiện bất kỳ raycasting và boolean chỉ ra xem liệu worldPoint có nằm trong giới hạn của màn hình sẽ là true độc lập với việc liệu điểm có bị che khuất bởi BaseParts hoặc Terrain .

Tham Số

worldPoint: Vector3

Vị trí thế giới Vector3 .

Giá Trị Mặc Định: ""

Lợi Nhuận

Một tuple chứa, theo thứ tự:

  • Một Vector3 mà các thành phần XY đại diện cho sự chênh lệch của worldPoint từ góc trên cùng bên trái của màn hình, bằng pixel.Thành phần Vector3 Z đại diện cho độ sâu của worldPoint từ màn hình (bằng đơn vị studs).

  • Một boolean chỉ ra nếu worldPoint nằm trong giới hạn của màn hình.

WorldToViewportPoint

Ghi Song Song

Phương pháp này trả vị trí và độ sâu của màn hình của Datatype.Vector3``worldPoint và xem liệu điểm này có nằm trong giới hạn của màn hình hay không.

Phương pháp này không xem xét chèn GUI hiện tại, chẳng hạn như không gian bị chiếm bởi thanh trên cùng, có nghĩa là vị trí 2D được trả về từ góc trên cùng bên trái của cửa sổ xem.Trừ khi bạn đang sử dụng ScreenGui.IgnoreGuiInset, vị trí này không thích hợp để đặt các thành phần GUI.

Đối với một phương pháp tương tự khác mà có trách nhiệm cho việc chèn GUI, xem WorldToScreenPoint() .


local Workspace = game:GetService("Workspace")
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

Lưu ý phương pháp này không thực hiện bất kỳ raycasting và boolean chỉ ra xem liệu worldPoint có nằm trong giới hạn của màn hình sẽ là true độc lập với việc liệu điểm có bị che khuất bởi BaseParts hoặc Terrain .

Tham Số

worldPoint: Vector3

Vị trí thế giới Vector3 .

Giá Trị Mặc Định: ""

Lợi Nhuận

Một tuple chứa, theo thứ tự:

  • Một Vector3 mà các thành phần XY đại diện cho khoảng trừ bị của worldPoint từ góc trên cùng bên trái của viewport, bằng pixel.Thành phần Vector3 Z đại diện cho độ sâu của worldPoint từ màn hình (bằng đơn vị studs).

  • Một boolean chỉ ra nếu worldPoint nằm trong giới hạn của màn hình.

ZoomToExtents

()

Tham Số

boundingBoxCFrame: CFrame
Giá Trị Mặc Định: ""
boundingBoxSize: Vector3
Giá Trị Mặc Định: ""

Lợi Nhuận

()

Sự Kiện

InterpolationFinished

Sự kiện này bắt lửa khi Camera đã kết thúc interpolating bằng cách sử dụng phương pháp Camera:Interpolate().Nó sẽ không bắn nếu một tween bị gián đoạn do Camera:Interpolate() được gọi lại.

Bạn được khuyên sử dụng TweenService để hoạt hình Camera thay vào đó, vì nó đáng tin cậy hơn và cung cấp nhiều lựa chọn để làm dịu các kiểu.