Camera

แสดงที่เลิกใช้งานแล้ว

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ไม่ซ้ำ

วัตถุ Camera กำหนดมุมมองของโลก 3Dในประสบการณ์ที่กําลังดําเนินอยู่แต่ละไคลเอนต์มีวัตถุของตัวเอง Camera ซึ่งอยู่ในท้องถิ่นของไคลเอนต์นั้น Workspace สามารถเข้าถึงได้ผ่านคุณสมบัติ Workspace.CurrentCamera

คุณสมบัติกล้องที่สำคัญที่สุดคือ:

  • CFrame ซึ่งเป็นตำแหน่งและทิศทางของกล้อง

  • CameraType ซึ่งถูกอ่านโดยสคริปต์กล้องของประสบการณ์และกำหนดว่ากล้องควรอัปเดตแต่ละเฟรมอย่างไร

  • CameraSubject ซึ่งถูกอ่านโดยสคริปต์กล้องของประสบการณ์และกำหนดว่าวัตถุใดที่กล้องควรติดตาม

  • FieldOfView ซึ่งเป็นตัวแทนของขอบเขตที่มองเห็นได้ของโลกที่สังเกตได้

  • Focus ตั้งค่าเนื่องจากภาพบางอย่างจะมีรายละเอียดมากขึ้นและอัปเดตบ่อยขึ้นขึ้นอยู่กับว่าพวกเขาใกล้จุดโฟกัสแค่ไหน

ดู การปรับแต่งกล้อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการปรับแต่งและปรับแต่งพฤติกรรมของกล้อง

เก็บกล้องหลายตัว

โปรดทราบว่าเมื่อเปลี่ยน Workspace.CurrentCamera เป็น Camera ใหม่ทั้งหมด Cameras ที่ลดลงโดยตรงจาก Workspace จะถูกทําลายหากคุณต้องการจัดเก็บกล้องหลายตัวและสลับระหว่างกันตามความต้องการ แนะนำให้คุณจัดเก็บไว้ใน Folder หรือ Model ภายใต้ Workspace ซึ่งพวกเขาจะยังคงอยู่แม้เมื่อ CurrentCamera เปลี่ยนแปลง

สรุป

คุณสมบัติ

  • อ่านพร้อมๆ กัน

    The CFrame ของ Camera , กำหนดตำแหน่งและทิศทางในโลก 3D

  • อ่านพร้อมๆ กัน

    The Humanoid หรือ BasePart ที่เป็นหัวข้อ Camera

  • อ่านพร้อมๆ กัน

    ระบุ Enum.CameraType ที่จะอ่านโดยสคริปต์กล้อง

  • ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    ตั้งมุมของฟิลด์มุมมองแนวนอนของกล้อง

  • อ่านพร้อมๆ กัน

    ตั้งมุมมองแนวตั้งของกล้อง

  • อ่านพร้อมๆ กัน

    กำหนดค่า FOV ของ Camera ที่ไม่เปลี่ยนแปลงภายใต้การเปลี่ยนแปลงขนาดหน้าต่าง

  • อ่านพร้อมๆ กัน

    ตั้งพื้นที่ในพื้นที่ 3D ที่ได้รับการส่งเสริมโดยระบบกราฟิกของ Roblox

  • อ่านพร้อมๆ กัน

    สลับว่ากล้องจะติดตามการเคลื่อนไหวของหัวของผู้เล่นโดยอัตโนมัติโดยใช้อุปกรณ์ VR หรือไม่

  • อ่านพร้อมๆ กัน

    ตั้งค่าขนาดของมุมมองของผู้ใช้ต่อโลกเมื่อใช้ VR

  • ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    ตั้งมุมมองของกล้องตามแกนมุมมองที่ยาวที่สุด

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    อธิบายความเคลื่อนที่เชิงลบ Z ในสตัดของกล้องใกล้เคียงกับแผ่นตัด

  • อ่านพร้อมๆ กัน

    สลับว่าจะใช้แนวเอียงและการกลิ้งจากคุณสมบัติ CFrame ในขณะที่ผู้เล่นกำลังใช้อุปกรณ์ VR

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    มิติของพื้นที่ปลอดภัยของอุปกรณ์บนไคลเอนต์ Roblox

คุณสมบัติรับทอดมาจากPVInstance
  • ไม่ซ้ำ
    ไม่สามารถเขียนสคริปต์
    อ่านพร้อมๆ กัน
  • ไม่ซ้ำ
    ไม่สามารถเขียนสคริปต์
    อ่านพร้อมๆ กัน

วิธีการ

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

    ส่งคืนคอลเลกชันของ BaseParts ที่ทำให้เส้นสายตาระหว่างจุดโจมตีของกล้อง CFrame และจุดโยนหายไป

  • ส่งคืนค่าจริง CFrame ที่ Camera กำลังถูกแสดงออก ซึ่งรวมถึงการใช้งานใดๆ และผลกระทบของอุปกรณ์ VR

  • คืนในรัศมีที่ม้วนปัจจุบันหรือหมุนรอบแกน Z ของกล้องโดยใช้ Camera โดยใช้ SetRoll()

  • เขียนพร้อมๆ กัน

    สร้างหน่วย จากตำแหน่งบนหน้าจอ (ในพิกเซล) ในความลึกที่กำหนดไว้จากทิศทางที่เอียงไปในกล้องบัญชีสำหรับการสอด GUI

  • SetRoll(rollAngle : number):()

    ตั้งค่าการหมุนปัจจุบันที่ใช้รอบแกน Z ของกล้อง

  • เขียนพร้อมๆ กัน

    สร้างหน่วย Ray จากตำแหน่งบนหน้าต่างมุมมอง (ในพิกเซล) ในระยะทางที่กำหนดจาก Camera และหันไปทางทิศทางของกล้องไม่นับรวมกับแมลง CoreUISafeInsets

  • เขียนพร้อมๆ กัน

    ส่งคืนตำแหน่งและความลึกของหน้าจอของ Datatype.Vector3``worldPoint และว่าจุดนี้อยู่ภายในขอบเขตของหน้าจอหรือไม่บัญชีสำหรับการสอด GUI

  • เขียนพร้อมๆ กัน

    ส่งคืนตำแหน่งและความลึกของหน้าจอของ Datatype.Vector3``worldPoint และว่าจุดนี้อยู่ภายในขอบเขตของหน้าจอหรือไม่ไม่นับรวมการสอด GUI

  • ZoomToExtents(boundingBoxCFrame : CFrame,boundingBoxSize : Vector3):()
วิธีการรับทอดมาจากPVInstance
  • เขียนพร้อมๆ กัน

    รับจุดศูนย์กลางของ PVInstance .

  • PivotTo(targetCFrame : CFrame):()

    เปลี่ยน PVInstance พร้อมกับบรรดาลูกหลานทั้งหมดของมัน PVInstances ทำให้จุดศูนย์กลางอยู่ที่ตําแหน่งที่ระบุแล้ว CFrame

คุณสมบัติ

CFrame

อ่านพร้อมๆ กัน

คุณสมบัตินี้เป็น CFrame ของ Camera โดยกำหนดตำแหน่งและทิศทางในโลก 3Dโปรดทราบว่าการเปลี่ยนแปลงบางอย่าง เช่น การหมุนหัวเมื่อใช้อุปกรณ์ VR จะไม่สะท้อนในคุณสมบัตินี้ ดังนั้นคุณควรใช้ GetRenderCFrame() เพื่อรับ "จริง" CFrame ของกล้อง

คุณสามารถย้ายกล้องโดยการตั้งค่าคุณสมบัตินี้ อย่างไรก็ตาม สคริปต์กล้องเริ่มต้นยังตั้งค่ามันด้วย ดังนั้นคุณควร:

  • ตั้งกล้อง CameraType เป็น Enum.CameraType.Scriptable เพื่อให้สคริปต์กล้องเริ่มต้นไม่อัปเดตกล้อง CFrameวิธีนี้เป็นวิธีที่ง่ายที่สุดและแนะนำในกรณีส่วนใหญ่

  • แทนที่สคริปต์กล้องเริ่มต้นด้วยตัวเลือกวิธีนี้แนะนำเฉพาะถ้าคุณไม่ต้องการฟังก์ชันกล้องเริ่มต้นใดๆ

วิธีที่เข้าใจได้มากที่สุดในการตำแหน่งและกำหนดทิศทางของ Camera คือโดยใช้ CFrame.lookAt() คอนสตรัคเตอร์ในตัวอย่างต่อไปนี้ Camera จะตำแหน่งที่ Vector3.new(0, 10, 0) และมุ่งเน้นไปที่ 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)

แม้ว่ากล้องจะสามารถวางไว้ในลักษณะที่แสดงด้านบน คุณอาจต้องการที่จะแอนิเมชั่นมันเพื่อเคลื่อนไหวได้อย่างราบรื่นจากหนึ่ง CFrame ไปยังอีกสำหรับสิ่งนี้ คุณสามารถ:

  • ตั้งตำแหน่ง/ทิศทางของกล้องในแต่ละเฟรมด้วย RunService:BindToRenderStep() และวิธี CFrame:Lerp()

  • สร้างและเล่น Tween ที่แอนิเมชั่นตำแหน่ง/ทิศทางของกล้อง:


    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

อ่านพร้อมๆ กัน

CameraSubject ยอมรับหลากหลายของ Instances . สคริปต์กล้องเริ่มต้นตอบสนองต่างกันตามการตั้งค่าที่มีอยู่:

  • โดยค่าเริ่มต้น สคริปต์กล้องจะทําตามตัวละครท้องถิ่น Humanoid และคํานวณสถานะปัจจุบันของหุ่นยนต์ Humanoid.CameraOffset

  • เมื่อตั้งค่าเป็น BasePart สคริปต์กล้องจะติดตามตำแหน่งของมันด้วยการเลื่อนแนวตั้งในกรณีของ VehicleSeats

CameraSubject ไม่สามารถตั้งค่าเป็น nil ได้ การพยายามทำเช่นนั้นจะย้อนกลับไปสู่มูลค่าก่อนหน้า

เพื่อฟื้นค่าเริ่มต้นของ CameraSubject กลับไปที่ค่าเริ่มต้นของตัวละครท้องถิ่นให้ตั้งค่าเป็น Humanoid :


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

อ่านพร้อมๆ กัน

สคริปต์กล้อง Roblox เริ่มต้นมีพฤติกรรมที่ติดตั้งไว้หลายอย่างการตั้งค่าคุณสมบัตินี้สลับไประหว่างพฤติกรรมต่างๆของ Enum.CameraTypeโปรดทราบว่าบางประเภทกล้องต้องใช้ CameraSubject ที่ถูกต้องเพื่อให้ทำงานได้อย่างถูกต้อง

สคริปต์กล้องเริ่มต้นจะไม่ย้ายหรืออัปเดตกล้องหาก CameraType ถูกตั้งค่าเป็น Enum.CameraType.Scriptableสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดตำแหน่งและการจัดทิศทางของกล้องด้วยตนเองดูที่ CFrame

สำหรับการตั้งค่าทั้งหมด CameraType ของ ยกเว้น Enum.CameraType.Scriptable คุณสมบัติที่ CameraSubject แทนที่ตำแหน่งของวัตถุที่กล้อง Focus ถูกตั้งค่า

DiagonalFieldOfView

ไม่ซ้ำ
อ่านพร้อมๆ กัน

ตั้งค่าจำนวนองศาในทิศทางทแยง (จากมุมมองหนึ่งไปยังมุมตรงข้าม) ที่กล้องสามารถมองเห็นได้ดู FieldOfView สำหรับคำอธิบายทั่วไปของฟิลด์มุมมองมากขึ้น

โปรดทราบว่า DiagonalFieldOfView เป็นฟิลด์มุมมองที่สามารถมองเห็นได้โดยการเรนเดอร์ Camera ในพื้นที่หน้าจอเต็มซึ่งอาจถูกปิดกั้นโดยขอบหรือการตัดหน้าจอบางอย่างบนอุปกรณ์บางอย่างดู ViewportSize สำหรับข้อมูลเพิ่มเติม

FieldOfView

อ่านพร้อมๆ กัน

คุณสมบัติ FieldOfView (FOV) กำหนดจำนวนองศาในแนวนอนที่กล้องสามารถมองเห็นได้คุณสมบัตินี้ถูกขัดขวางระหว่าง 1 และ 120 องศาและค่าเริ่มต้นที่ 70ฟิลด์มุมมองที่ต่ำมากหรือสูงมากไม่แนะนำเนื่องจากอาจทําให้ผู้เล่นสับสนได้

โปรดทราบว่าการปรับขนาดยูนิฟอร์มถูกบังคับใช้ ซึ่งหมายความว่าสนามมุมมองแนวตั้งและแนวนอนเสมอเกี่ยวข้องกับอัตราส่วนของหน้าจอ

การใช้งานที่แนะนำสำหรับ FieldOfView รวมถึง:

  • ลด FOV เพื่อให้ความประทับใจเกี่ยวกับการขยาย เช่น เมื่อใช้กล้องส่องทางไกล
  • เพิ่ม FOV เมื่อผู้เล่น "วิ่ง" เพื่อให้ความรู้สึกของการขาดการควบคุม

โปรดทราบว่า FieldOfView เป็นฟิลด์มุมมองที่สามารถมองเห็นได้โดยการเรนเดอร์ Camera ในพื้นที่หน้าจอเต็มซึ่งอาจถูกปิดกั้นโดยขอบหรือการตัดหน้าจอบางอย่างบนอุปกรณ์บางอย่างดู ViewportSize สำหรับข้อมูลเพิ่มเติม

FieldOfViewMode

อ่านพร้อมๆ กัน

ค่า FieldOfView (FOV) ของกล้องต้องได้รับการอัปเดตเพื่อสะท้อนการเปลี่ยนแปลง ViewportSizeค่าของ FieldOfViewMode กำหนดว่าค่า FOV ใดที่จะคงที่

ตัวอย่างเช่น เมื่อคุณสร้างค่าความละเอียดในแนวนอนเป็น Enum.FieldOfViewMode.Vertical ค่า FOV แนวตั้งจะได้รับการอัปเดตเมื่อมุมมองถูกปรับขนาด แต่ค่า FOV แนวตั้งจะคงที่หากคุณสร้างค่านี้เป็น Enum.FieldOfViewMode.Diagonal ค่า FOV แนวนอนและแนวตั้งทั้งสองอาจถูกเปลี่ยนเพื่อให้คงที่ FOV ในแนวนอน

Focus

อ่านพร้อมๆ กัน

การดำเนินการทางกราฟิกบางอย่างที่เครื่องทำ เช่น การปรับปรุงแสง อาจใช้เวลาหรือความพยายามในการคำนวณเพื่อเสร็จสิ้นคุณสมบัติของกล้อง Focus บอกเครื่องยนต์ว่าพื้นที่ใดในพื้นที่ 3D ควรได้รับการส่งเสริมเมื่อดำเนินการดังกล่าวตัวอย่างเช่น แสงไดนามิกจากวัตถุเช่น PointLights อาจไม่แสดงผลในระยะไกลจากจุดโฟกัส

สคริปต์กล้อง Roblox เริ่มต้นจะตั้ง Focus ให้ติดตาม CameraSubject (โดยปกติคือ Humanoid )อย่างไรก็ตาม จะไม่อัปเดตโดยอัตโนมัติเมื่อ ถูกตั้งค่าเป็น หรือเมื่อสคริปต์กล้องเริ่มต้นไม่ถูกใช้ในกรณีเหล่านี้คุณควรอัปเดต Focus ในแต่ละเฟรมโดยใช้วิธี RunService:BindToRenderStep() ที่ความสําคัญ Enum.RenderPriority.Camera

Focus ไม่มีผลต่อตำแหน่งหรือทิศทางของกล้อง; ดู CFrame สำหรับสิ่งนี้

HeadLocked

อ่านพร้อมๆ กัน

สลับว่ากล้องจะติดตามการเคลื่อนไหวของหัวของผู้เล่นโดยอัตโนมัติโดยใช้อุปกรณ์ VR หรือไม่เมื่อ true (ปกติ) เครื่องยนต์จะรวม CFrame กับ Enum.UserCFrame ของหัวของผู้ใช้เพื่อแสดงมุมมองของผู้เล่นด้วยการติดตามหัวที่คำนึงถึงมุมมองจะถูกแสดงที่ต่อไป CFrame :


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
-- นี้จะเทียบเท่ากับ Camera:GetRenderCFrame()
local renderCFrame = camera.CFrame * headCFrame

ขอแนะนำให้ ไม่ ปิดใช้งานคุณสมบัตินี้ด้วยเหตุผลต่อไปนี้:

  • ผู้เล่นอาจประสบอาการเวียนศีรษะหากไม่มีการเพิ่มโซลูชันติดตามหัวที่เทียบเท่า
  • เครื่องยนต์ Roblox ทำการเพิ่มประสิทธิภาพความล่าช้าเมื่อ HeadLocked เป็นจริง
ดูเพิ่มเติม
  • VRService:GetUserCFrame() ซึ่งสามารถใช้เพื่อรับ CFrame ของหัว
  • VRService:RecenterUserHeadCFrame() ซึ่งใช้เพื่อนําหัวกลับสู่ตําแหน่งและทิศทางปัจจุบันของอุปกรณ์ VR
  • วิธี GetRenderCFrame() ซึ่งส่งคืน CFrame รวมกับ CFrame ของหัวของผู้ใช้

HeadScale

อ่านพร้อมๆ กัน

HeadScale เป็นระดับมุมมองของผู้ใช้ต่อโลกเมื่อใช้ VR

ขนาดของ 1 สตัดใน VR คือ 0.3 meters / HeadScale , หมายความว่ามูลค่าที่ใหญ่กว่า HeadScale เท่ากับโลกที่ดูเล็กลงจากมุมมองของผู้ใช้เมื่อใช้อุปกรณ์ VRตัวอย่างเช่น ส่วนที่สูง 1 สตัดดูเหมือนจะสูง 0.6 เมตรไปยังผู้เล่น VR ที่มี HeadScale ของ 0.5

คุณสมบัตินี้จะถูกควบคุมโดยอัตโนมัติโดย VRService.AutomaticScaling อวาตาร์HeadScale ตัวเองหรือใช้ตัวละครที่กําหนดเองเปิด/ปิด VRService.AutomaticScaling เพื่อ Enum.VRScaling.Off

คุณสมบัตินี้ไม่ควรสับสนกับ ซึ่งเป็นพ่อของ ที่จะควบคุมการขยายตัวของมัน

MaxAxisFieldOfView

ไม่ซ้ำ
อ่านพร้อมๆ กัน

คุณสมบัติ MaxAxisFieldOfView กำหนดจำนวนองศาตามแกนมุมมองที่ยาวที่สุดที่กล้องสามารถมองเห็นได้

เมื่อแกนที่ยาวที่สุดเป็นแกนแนวตั้ง คุณสมบัตินี้จะทำงานคล้ายกับคุณสมบัติ FieldOfViewนี่เป็นกรณีทั่วไปเมื่ออุปกรณ์อยู่ในทิศทางแนวนอนในการจัดเรียงภูมิทัศน์แนวนอนแกนที่ยาวที่สุดจะเป็นแกนแนวนอน; ในกรณีนี้คุณสมบัติจะอธิบายฟิลด์มุมมองแนวนอนของ Camera

NearPlaneZ

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

คุณสมบัติ NearPlaneZ อธิบายระยะทางของแผ่นตัดใกล้ของกล้องที่ไกลออกไปในสตัดเครื่องบินตัดใกล้เป็นเครื่องบินที่ตั้งอยู่ข้างหน้ากล้อง CFrameสิ่งใดระหว่างเครื่องบินนี้และกล้องจะไม่แสดงผล สร้างมุมมองตัดทอนเมื่อดูวัตถุในระยะทางที่สั้นมากค่าของ NearPlaneZ แตกต่างกันไปในแต่ละแพลตฟอร์มและขณะนี้อยู่เสมอระหว่าง -0.1 และ -0.5

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

VRTiltAndRollEnabled

อ่านพร้อมๆ กัน

คุณสมบัตินี้สลับว่าจะใช้แนวเอียงและการกลิ้งจากคุณสมบัติ CFrame ในขณะที่ผู้เล่นกำลังใช้อุปกรณ์ VR

เพื่อป้องกันอาการเวียนศีรษะ ขอบฟ้าควรยังคงเป็นระดับเดียวการเอียงและกลิ้งมุมมองของผู้เล่นในขณะที่ใช้อุปกรณ์ VR สามารถทําให้เกิดการตัดการเชื่อมต่อระหว่างพื้นที่กายภาพของผู้เล่นและพื้นที่เสมือนที่พวกเขากําลังดูการเปลี่ยนทิศทางลงที่เห็นได้ชัดอาจทำให้ผู้เล่นสูญเสียสมดุลหรือประสบอาการเวียนหัว

ด้วยเหตุผลเหล่านี้จึงเป็นสิ่งที่ควรทิ้งคุณสมบัตินี้ไว้ปิดใช้งาน เว้นแต่คุณจะทดสอบประสบการณ์ของคุณอย่างกว้างขวางสำหรับผลกระทบเหล่านี้แม้จะเปิดใช้งานการเอียงและการกลิ้งแล้ว คุณอาจต้องการให้แน่ใจว่าผู้เล่นมีกรอบอ้างอิงที่เสถียรเสมอ เช่น ภายในของยานพาหนะหรือพื้นที่ที่สามารถช่วยผู้เล่นให้ยืนบนพื้นที่กายภาพของตนเองได้

ViewportSize

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

ViewportSize ส่งคืนมิติของพื้นที่ปลอดภัยของอุปกรณ์บนหน้าจอปัจจุบันพื้นที่นี้เป็นรูปสี่เหลี่ยมที่รวมพื้นที่แถบด้านบนของ Roblox แต่ไม่รวมรอยบากหรือภาพตัดหน้าจอใดๆหน่วยของ ViewportSize เป็นหน่วยการเคลื่อนที่ UI Roblox ซึ่งอาจแตกต่างจากพิกเซลการแสดงผลเดิม

Mobile device screen with cutout showing device safe area.

ตามที่ระบุไว้ข้างต้น ViewportSize ไม่เท่ากับขนาดพื้นที่เต็มหน้าจอบนหน้าจอที่มีรอยตัดหรือรอยบากเพื่อรับขนาดพื้นที่หน้าจอเต็มบนทุกหน้าจอคุณสามารถสอบถามค่า AbsoluteSize ของ ScreenGui ด้วย ScreenInsets ตั้งค่าเป็น Noneดู Enum.ScreenInsets สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการจัดเขตหน้าจอ

สุดท้าย โปรดทราบว่า ViewportSize ไม่ใช่ขนาดหน้าต่างที่แท้จริงที่กล้องใช้สําหรับการเรนเดอร์ (กล้องเรนเดอร์ในพื้นที่เต็มจอ)นอกจากนี้คุณสมบัติ FieldOfView และ DiagonalFieldOfView ยังขึ้นอยู่กับพื้นที่เต็มจอไม่ใช่ ViewportSize

การอัปเดตกล้อง

เฉพาะ Camera ที่ได้รับการอ้างถึงในปัจจุบันโดย Workspace.CurrentCamera มี ViewportSize อัปเดตในแต่ละเฟรมระหว่างขั้นตอน PreRenderเลนส์ ViewportSize ของกล้องอื่น ๆ ทั้งหมดในประสบการณ์ของคุณจะไม่ได้รับการอัปเดตรวมถึงกล้องที่ใช้สำหรับ ViewportFrames

วิธีการ

GetPartsObscuringTarget

Instances

วิธีนี้จะคืนค่าเป็นคอลเลกชันของ BaseParts ที่ทำให้เส้นสายตาระหว่างตําแหน่งกล้อง CFrame และ Vector3 ในคอลเลกชัน castPoints หายไปใดๆ Instances ที่รวมอยู่ในแอร์ราย์ ignoreList จะถูกเพิกเฉยพร้อมกับบุตรหลานของพวกเขา

พารามิเตอร์ castPoints จะถูกให้เป็นเป็น массивของตําแหน่ง Vector3โปรดทราบว่ารายการของ BaseParts ที่ส่งคืนอยู่ในลำดับสุ่มและไม่มีข้อมูลรังสีเพิ่มเติมที่จะให้หากต้องการข้อมูลเช่นตำแหน่งการโจมตี วัสดุการโจมตี หรือพื้นปกติ คุณควรเลือกใช้วิธี 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)

หาก Terrain บดบังจุดคาสต์ BaseParts บดบังจุดคาสต์ระหว่างบดบัง Terrain และจุดคาสต์จะไม่ถูกส่งคืน

พารามิเตอร์

castPoints: Array

ชุดตําแหน่งของจุดโยน Vector3 จำนวนหนึ่ง

ค่าเริ่มต้น: ""
ignoreList: Instances

ชุดของ Instances ที่ควรถูกเพิกเฉยพร้อมกับลูกหลานของพวกเขา

ค่าเริ่มต้น: ""

ส่งค่ากลับ

Instances

ชุดของ BaseParts ที่ซ่อนเส้นสายตาระหว่างกล้อง CFrame และ castPoints ไว้

GetRenderCFrame

วิธีนี้จะคืนค่าจริง ของ ตามที่มันถูกแสดงผลรวมถึงผลกระทบของ VR (การเปลี่ยนแปลงหัว VR ไม่ถูกนำไปใช้กับคุณสมบัติ ดังนั้นจึงเป็นการดีที่สุดที่จะใช้ เพื่อรับมุมมอง "จริง" ของผู้เล่น)

ตัวอย่างเช่น เมื่อใช้ VR ตัว Camera จะถูกแสดงจริงที่ต่อไปนี้ CFrame :


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

การแสดงผลของกล้อง CFrame จะเปลี่ยนเฉพาะเมื่อองค์ประกอบ HeadLocked เป็นจริงเท่านั้นเพื่อให้บัญชีสําหรับหัว


ส่งค่ากลับ

The CFrame ที่ Camera กำลังถูกเรนเดอร์อยู่

GetRoll

วิธีนี้จะคืน, ในรัศมี, การหมุนปัจจุบันที่ใช้กับ Camera โดยใช้ SetRoll() .การกลิ้งกำหนดเป็นการหมุนรอบแกน Z ของกล้อง

วิธีนี้จะคืนบทบาทที่ใช้โดยวิธี SetRoll() เท่านั้นการหมุนที่ใช้ด้วยมือไม่ถูกนับรวมในกล้อง CFrame ไม่ได้เพื่อรับการกลิ้งจริงของ Camera รวมถึงการกลิ้งที่ใช้ด้วยมือ คุณสามารถใช้สแน็ปติดตามต่อไปนี้:


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

ส่งค่ากลับ

ม้วนปัจจุบันที่ใช้โดย SetRoll() ในรัศมี

ตัวอย่างโค้ด

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

เขียนพร้อมๆ กัน

วิธีนี้สร้างหน่วย Ray จากตำแหน่ง 2D บนหน้าจอ (กำหนดในพิกเซล) โดยคำนึงถึงการสอดแนม GUIที่มา Ray มาจากตำแหน่ง 2D ในโลกที่เทียบเท่ากับความลึกที่กำหนด (ในสตัด) ห่างจาก Vector3 ไปที่ Camera

เนื่องจากวิธีนี้รับรองการสอดแนม GUI แล้ว ค่าส่วนลบที่ใช้กับองค์ประกอบ GUI (เช่นจากแถบด้านบน) จะถูกนับซึ่งหมายความว่าตำแหน่งหน้าจอที่ระบุจะเริ่มในมุมซ้ายบนด้านล่างของแถบด้านบนสำหรับวิธีที่เหมือนกันอย่างสมบูรณ์ที่ไม่นับเป็นค่าออฟเซ็ต GUI ให้ใช้ ViewportPointToRay()

เนื่องจากการสร้าง Ray เป็นรัศมีหน่วยจึงยาวเพียงหนึ่งสตัด หากต้องการสร้างรัศมีที่ยาวกว่า กำลังติดตาม:


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)

วิธีนี้ทำงานได้เฉพาะสําหรับกล้องปัจจุบัน Workspaceกล้องอื่นๆ เช่นกล้องที่คุณสร้างสำหรับ มีขนาดมุมมองเริ่มต้นของ และอัปเดตเฉพาะหลังจากที่คุณตั้งค่าพวกเขาเป็น ความไม่ตรงกันในขนาดหน้าต่างทำให้กล้องส่งกลับรังสีที่มีข้อผิดพลาด Ray.Direction

พารามิเตอร์

ตำแหน่งบนแกน X ในพิกเซลของจุดที่หน้าจอจะเริ่มต้น Ray ตำแหน่งนี้เป็นส่วนหนึ่งของการสอด GUI

ค่าเริ่มต้น: ""

ตำแหน่งบนแกน Y ในพิกเซลของจุดที่หน้าจอจะเริ่มต้น Ray ตำแหน่งนี้เป็นส่วนหนึ่งของการสอด GUI

ค่าเริ่มต้น: ""
depth: number

ความลึกจาก Camera , ในสตัด จากซึ่งจะชดเชยต้นกำเนิดของ Ray

ค่าเริ่มต้น: 0

ส่งค่ากลับ

หน่วย Ray , มาจากตำแหน่งโลกเทียบเท่า Vector3 ของคอร์ดสกรีนที่กำหนดในระยะทางที่ห่างออกไปจาก Camera ที่ให้ไว้ลำแสงนี้จะส่องในทิศทางของ Camera

SetRoll

()

วิธีนี้ล้าสมัยและไม่ถือว่าเป็นการดำเนินการที่ดีที่สุดอีกต่อไป

วิธีนี้ตั้งรอบปัจจุบัน, ในรัศมี, ของ Camera .ม้วนถูกใช้หลังจาก CFrame และแทนที่การหมุนรอบแกน Z ของกล้อง

ตัวอย่างเช่นสิ่งต่อไปนี้จะย้อนกลับ Camera :


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

SetRoll ไม่มีผลต่อการหมุนใดๆ ที่ใช้โดยใช้คุณสมบัติ CFrameการใช้บทบาทโดยใช้ SetRoll ไม่สะท้อนในคุณสมบัติ CFrame แต่สะท้อนในคุณสมบัติ CFrame ที่ส่งคืนโดย GetRenderCFrame()

วิธีนี้สามารถใช้ได้เฉพาะเมื่อ CameraType ถูกตั้งค่าเป็น Scriptable ไม่ว่าจะใช้สคริปต์กล้องเริ่มต้นหรือไม่หากใช้ร่วมกับอื่น ๆ CameraType คำเตือนจะได้รับในออก

การหมุนใดๆ ที่ใช้วิธีนี้จะหายไปเมื่อ CameraType เปลี่ยนจาก Scriptable

เพื่อรับชุดม้วนโดยใช้วิธีนี้ใช้ GetRoll()

เนื่องจากวิธีนี้ล้าสมัยแล้วคุณจึงแนะนำให้ใช้ม้วนแทนโดยใช้คุณสมบัติ ตัวอย่างเช่น:


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

พารามิเตอร์

rollAngle: number

มุมกลิ้งในรัศมีที่จะใช้กับ Camera

ค่าเริ่มต้น: ""

ส่งค่ากลับ

()

ViewportPointToRay

เขียนพร้อมๆ กัน

วิธีนี้สร้างหน่วย Ray จากตำแหน่ง 2D ในเขตมุมมองที่ปลอดภัยของอุปกรณ์ที่กำหนดไว้ในพิกเซลลําแสงมาจากตําแหน่ง 2D ที่เทียบเท่าในโลกที่ความลึกที่กำหนด (ในสตัด) ห่างจาก ไกล

ตามที่แสดงด้านล่าง (0, 0) ตรงกับจุดด้านบนซ้ายของแถบด้านบนของ Robloxซึ่งหมายความว่าตำแหน่ง 2D ที่ใส่มี ไม่ นับสําหรับ CoreUISafeInsets ใส่ แต่มันนับสําหรับใดๆ DeviceSafeInsets

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

โปรดทราบว่าตัวอย่าง UI ใช้ระบบข้อมูลสัมพันธ์ที่แตกต่าง ( ใช้ระบบข้อมูลสัมพันธ์จุดมุมมองในขณะที่วิธีนี้ใช้ระบบข้อมูลสัมพันธ์จุดมุมมอง)หากคุณต้องการระบุตำแหน่งในคอร์ด UI หลักโปรดใช้ ScreenPointToRay()

โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะกับกล้อง Workspace.CurrentCamera เท่านั้นกล้องอื่นๆ เช่นกล้องที่คุณสร้างสำหรับ ViewportFrame มีขนาดมุมมองเริ่มต้นของ (1, 1) และอัปเดตเฉพาะหลังจากที่คุณตั้งค่าพวกเขาเป็น CurrentCameraความไม่ตรงกันในขนาดหน้าต่างทำให้กล้องส่งกลับรังสีที่มีข้อผิดพลาด Ray.Direction

วิธีนี้สามารถใช้ร่วมกับคุณสมบัติ 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 เป็นรัศมีหน่วยจึงยาวเพียงหนึ่งสตัด หากต้องการสร้างรัศมีที่ยาวกว่า กำลังติดตาม:


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 ในพิกเซลของจุดมุมมองที่จะเริ่มต้น Ray ในพื้นที่ปลอดภัยของอุปกรณ์

ค่าเริ่มต้น: ""
depth: number

ความลึกจาก Camera , ในสตัด จากซึ่งจะชดเชยต้นกำเนิดของ Ray

ค่าเริ่มต้น: 0

ส่งค่ากลับ

หน่วย Ray , มาจากตำแหน่งโลกเทียบเท่า Vector3 ของจุดมุมมองที่กำหนดในระยะทางที่ห่างจาก Camera ไกลลำแสงนี้จะส่องในทิศทางของ Camera

WorldToScreenPoint

เขียนพร้อมๆ กัน

วิธีนี้จะคืนตำแหน่งหน้าจอและความลึกของ Datatype.Vector3``worldPoint และว่าจุดนี้อยู่ภายในขอบเขตของหน้าจอหรือไม่

วิธีนี้พิจารณาถึงการสอดแทรก GUI ปัจจุบัน เช่น พื้นที่ที่ใช้โดยแถบด้านบน ซึ่งหมายความว่าตำแหน่ง 2D ที่ส่งคืนอยู่ในช่วงเวลาเดียวกับตำแหน่ง GUI และสามารถใช้เพื่อวางองค์ประกอบ GUIสำหรับวิธีที่เหมือนกันอย่างอื่นที่ไม่สนใจการแทรก GUI ดูที่ 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

โปรดทราบว่าวิธีนี้ไม่ทำการคาดการณ์เรย์และตัวเลือกเชิงเสียงที่บ่งบอกว่า worldPoint อยู่ภายในขอบเขตของหน้าจอจะเป็น true ไม่ว่าจะมีจุดได้รับการบดบังโดย BaseParts หรือ Terrain

พารามิเตอร์

worldPoint: Vector3

ตำแหน่งโลก Vector3

ค่าเริ่มต้น: ""

ส่งค่ากลับ

ลิสต์ที่มีอยู่ในลำดับ:

  • A Vector3 ซึ่งส่วนประกอบ X และ Y แทนที่ความแตกต่างของ worldPoint จากมุมซ้ายบนของหน้าจอในพิกเซลส่วนประกอบ Vector3 Z แทนความลึกของ worldPoint จากหน้าจอ (ในสตัด)

  • บูลีนที่บ่งบอกว่า worldPoint อยู่ภายในขอบเขตของหน้าจอ

WorldToViewportPoint

เขียนพร้อมๆ กัน

วิธีนี้จะคืนตำแหน่งหน้าจอและความลึกของ Datatype.Vector3``worldPoint และว่าจุดนี้อยู่ภายในขอบเขตของหน้าจอหรือไม่

วิธีนี้ไม่นำ GUI ปัจจุบันมาพิจารณา เช่น พื้นที่ที่ใช้โดยแถบด้านบน ซึ่งหมายความว่าตำแหน่ง 2D ที่ส่งคืนจะได้รับจากมุมซ้ายบนของหน้าต่างดูยกเว้นที่คุณกำลังใช้ ScreenGui.IgnoreGuiInset ตำแหน่งนี้ไม่เหมาะสำหรับวางองค์ประกอบ GUI

สำหรับวิธีที่เหมือนกันอย่างสมบูรณ์ที่รับผิดชอบสําหรับการสอดแนม GUI ดู 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

โปรดทราบว่าวิธีนี้ไม่ทำการคาดการณ์เรย์และตัวเลือกเชิงเสียงที่บ่งบอกว่า worldPoint อยู่ภายในขอบเขตของหน้าจอจะเป็น true ไม่ว่าจะมีจุดได้รับการบดบังโดย BaseParts หรือ Terrain

พารามิเตอร์

worldPoint: Vector3

ตำแหน่งโลก Vector3

ค่าเริ่มต้น: ""

ส่งค่ากลับ

ลิสต์ที่มีอยู่ในลำดับ:

  • A Vector3 ซึ่งส่วนประกอบ X และ Y แทนที่ความแตกต่างของ worldPoint จากมุมซ้ายบนของหน้าต่างดูในพิกเซลส่วนประกอบ Vector3 Z แทนความลึกของ worldPoint จากหน้าจอ (ในสตัด)

  • บูลีนที่บ่งบอกว่า worldPoint อยู่ภายในขอบเขตของหน้าจอ

ZoomToExtents

()

พารามิเตอร์

boundingBoxCFrame: CFrame
ค่าเริ่มต้น: ""
boundingBoxSize: Vector3
ค่าเริ่มต้น: ""

ส่งค่ากลับ

()

อีเวนต์

InterpolationFinished

อีเวนต์นี้จะเกิดขึ้นเมื่อ Camera ได้สิ้นสุดการแทนที่โดยใช้วิธี Camera:Interpolate()มันจะไม่ยิงหากวัยรุ่นถูกขัดขวางเนื่องจาก Camera:Interpolate() ถูกเรียกอีกครั้ง

คุณแนะนำให้ใช้ TweenService เพื่อแอนิเมชั่น Camera แทนเนื่องจากเป็นที่เชื่อถือได้มากขึ้นและให้ตัวเลือกมากขึ้นสำหรับการปรับแต่งสไตล์