Camera
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
วัตถุ Camera กำหนดมุมมองของโลก 3Dในประสบการณ์ที่กําลังดําเนินอยู่แต่ละไคลเอนต์มีวัตถุของตัวเอง Camera ซึ่งอยู่ในท้องถิ่นของไคลเอนต์นั้น Workspace สามารถเข้าถึงได้ผ่านคุณสมบัติ Workspace.CurrentCamera
คุณสมบัติกล้องที่สำคัญที่สุดคือ:
CFrame ซึ่งเป็นตำแหน่งและทิศทางของกล้อง
CameraType ซึ่งถูกอ่านโดยสคริปต์กล้องของประสบการณ์และกำหนดว่ากล้องควรอัปเดตแต่ละเฟรมอย่างไร
CameraSubject ซึ่งถูกอ่านโดยสคริปต์กล้องของประสบการณ์และกำหนดว่าวัตถุใดที่กล้องควรติดตาม
FieldOfView ซึ่งเป็นตัวแทนของขอบเขตที่มองเห็นได้ของโลกที่สังเกตได้
Focus ตั้งค่าเนื่องจากภาพบางอย่างจะมีรายละเอียดมากขึ้นและอัปเดตบ่อยขึ้นขึ้นอยู่กับว่าพวกเขาใกล้จุดโฟกัสแค่ไหน
ดู การปรับแต่งกล้อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการปรับแต่งและปรับแต่งพฤติกรรมของกล้อง
เก็บกล้องหลายตัว
โปรดทราบว่าเมื่อเปลี่ยน Workspace.CurrentCamera เป็น Camera ใหม่ทั้งหมด Cameras ที่ลดลงโดยตรงจาก Workspace จะถูกทําลายหากคุณต้องการจัดเก็บกล้องหลายตัวและสลับระหว่างกันตามความต้องการ แนะนำให้คุณจัดเก็บไว้ใน Folder หรือ Model ภายใต้ Workspace ซึ่งพวกเขาจะยังคงอยู่แม้เมื่อ CurrentCamera เปลี่ยนแปลง
สรุป
คุณสมบัติ
ระบุ Enum.CameraType ที่จะอ่านโดยสคริปต์กล้อง
ตั้งมุมของฟิลด์มุมมองแนวนอนของกล้อง
ตั้งมุมมองแนวตั้งของกล้อง
กำหนดค่า FOV ของ Camera ที่ไม่เปลี่ยนแปลงภายใต้การเปลี่ยนแปลงขนาดหน้าต่าง
ตั้งพื้นที่ในพื้นที่ 3D ที่ได้รับการส่งเสริมโดยระบบกราฟิกของ Roblox
สลับว่ากล้องจะติดตามการเคลื่อนไหวของหัวของผู้เล่นโดยอัตโนมัติโดยใช้อุปกรณ์ VR หรือไม่
ตั้งค่าขนาดของมุมมองของผู้ใช้ต่อโลกเมื่อใช้ VR
ตั้งมุมมองของกล้องตามแกนมุมมองที่ยาวที่สุด
อธิบายความเคลื่อนที่เชิงลบ Z ในสตัดของกล้องใกล้เคียงกับแผ่นตัด
สลับว่าจะใช้แนวเอียงและการกลิ้งจากคุณสมบัติ CFrame ในขณะที่ผู้เล่นกำลังใช้อุปกรณ์ VR
มิติของพื้นที่ปลอดภัยของอุปกรณ์บนไคลเอนต์ Roblox
วิธีการ
ส่งคืนคอลเลกชันของ BaseParts ที่ทำให้เส้นสายตาระหว่างจุดโจมตีของกล้อง CFrame และจุดโยนหายไป
ส่งคืนค่าจริง CFrame ที่ Camera กำลังถูกแสดงออก ซึ่งรวมถึงการใช้งานใดๆ และผลกระทบของอุปกรณ์ VR
คืนในรัศมีที่ม้วนปัจจุบันหรือหมุนรอบแกน Z ของกล้องโดยใช้ Camera โดยใช้ SetRoll()
สร้างหน่วย จากตำแหน่งบนหน้าจอ (ในพิกเซล) ในความลึกที่กำหนดไว้จากทิศทางที่เอียงไปในกล้องบัญชีสำหรับการสอด GUI
ตั้งค่าการหมุนปัจจุบันที่ใช้รอบแกน Z ของกล้อง
สร้างหน่วย Ray จากตำแหน่งบนหน้าต่างมุมมอง (ในพิกเซล) ในระยะทางที่กำหนดจาก Camera และหันไปทางทิศทางของกล้องไม่นับรวมกับแมลง CoreUISafeInsets
ส่งคืนตำแหน่งและความลึกของหน้าจอของ Datatype.Vector3``worldPoint และว่าจุดนี้อยู่ภายในขอบเขตของหน้าจอหรือไม่บัญชีสำหรับการสอด GUI
ส่งคืนตำแหน่งและความลึกของหน้าจอของ Datatype.Vector3``worldPoint และว่าจุดนี้อยู่ภายในขอบเขตของหน้าจอหรือไม่ไม่นับรวมการสอด GUI
รับจุดศูนย์กลางของ PVInstance .
เปลี่ยน PVInstance พร้อมกับบรรดาลูกหลานทั้งหมดของมัน PVInstances ทำให้จุดศูนย์กลางอยู่ที่ตําแหน่งที่ระบุแล้ว CFrame
อีเวนต์
ยิงเมื่อ Camera ได้สิ้นสุดการแทรกแซงโดยใช้ Interpolate()
คุณสมบัติ
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.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 Workspace = game:GetService("Workspace")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
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.CurrentCameralocal 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
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

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

ตามที่ระบุไว้ข้างต้น ViewportSize ไม่เท่ากับขนาดพื้นที่เต็มหน้าจอบนหน้าจอที่มีรอยตัดหรือรอยบากเพื่อรับขนาดพื้นที่หน้าจอเต็มบนทุกหน้าจอคุณสามารถสอบถามค่า AbsoluteSize ของ ScreenGui ด้วย ScreenInsets ตั้งค่าเป็น Noneดู Enum.ScreenInsets สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการจัดเขตหน้าจอ
สุดท้าย โปรดทราบว่า ViewportSize ไม่ใช่ขนาดหน้าต่างที่แท้จริงที่กล้องใช้สําหรับการเรนเดอร์ (กล้องเรนเดอร์ในพื้นที่เต็มจอ)นอกจากนี้คุณสมบัติ FieldOfView และ DiagonalFieldOfView ยังขึ้นอยู่กับพื้นที่เต็มจอไม่ใช่ ViewportSize
การอัปเดตกล้อง
เฉพาะ Camera ที่ได้รับการอ้างถึงในปัจจุบันโดย Workspace.CurrentCamera มี ViewportSize อัปเดตในแต่ละเฟรมระหว่างขั้นตอน PreRenderเลนส์ ViewportSize ของกล้องอื่น ๆ ทั้งหมดในประสบการณ์ของคุณจะไม่ได้รับการอัปเดตรวมถึงกล้องที่ใช้สำหรับ ViewportFrames
วิธีการ
GetPartsObscuringTarget
วิธีนี้จะคืนค่าเป็นคอลเลกชันของ BaseParts ที่ทำให้เส้นสายตาระหว่างตําแหน่งกล้อง CFrame และ Vector3 ในคอลเลกชัน castPoints หายไปใดๆ Instances ที่รวมอยู่ในแอร์ราย์ ignoreList จะถูกเพิกเฉยพร้อมกับบุตรหลานของพวกเขา
พารามิเตอร์ castPoints จะถูกให้เป็นเป็น массивของตําแหน่ง Vector3โปรดทราบว่ารายการของ BaseParts ที่ส่งคืนอยู่ในลำดับสุ่มและไม่มีข้อมูลรังสีเพิ่มเติมที่จะให้หากต้องการข้อมูลเช่นตำแหน่งการโจมตี วัสดุการโจมตี หรือพื้นปกติ คุณควรเลือกใช้วิธี WorldRoot:Raycast()
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal castPoints = {Vector3.new(0, 10, 0),Vector3.new(0, 15, 0)}local ignoreList = {}local partsObscuringTarget = camera:GetPartsObscuringTarget(castPoints, ignoreList)
หาก Terrain บดบังจุดคาสต์ BaseParts บดบังจุดคาสต์ระหว่างบดบัง Terrain และจุดคาสต์จะไม่ถูกส่งคืน
พารามิเตอร์
ชุดของ Instances ที่ควรถูกเพิกเฉยพร้อมกับลูกหลานของพวกเขา
ส่งค่ากลับ
GetRenderCFrame
วิธีนี้จะคืนค่าจริง ของ ตามที่มันถูกแสดงผลรวมถึงผลกระทบของ VR (การเปลี่ยนแปลงหัว VR ไม่ถูกนำไปใช้กับคุณสมบัติ ดังนั้นจึงเป็นการดีที่สุดที่จะใช้ เพื่อรับมุมมอง "จริง" ของผู้เล่น)
ตัวอย่างเช่น เมื่อใช้ VR ตัว Camera จะถูกแสดงจริงที่ต่อไปนี้ CFrame :
local UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal headCFrame = UserInputService:GetUserCFrame(Enum.UserCFrame.Head)headCFrame = headCFrame.Rotation + headCFrame.Position * camera.HeadScalerenderCFrame = camera.CFrame * headCFrame
การแสดงผลของกล้อง CFrame จะเปลี่ยนเฉพาะเมื่อองค์ประกอบ HeadLocked เป็นจริงเท่านั้นเพื่อให้บัญชีสําหรับหัว
ส่งค่ากลับ
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
ส่งค่ากลับ
ตัวอย่างโค้ด
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.
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.CurrentCameralocal length = 500local unitRay = camera:ScreenPointToRay(100, 100)local extendedRay = Ray.new(unitRay.Origin, unitRay.Direction * length)
วิธีนี้ทำงานได้เฉพาะสําหรับกล้องปัจจุบัน Workspaceกล้องอื่นๆ เช่นกล้องที่คุณสร้างสำหรับ มีขนาดมุมมองเริ่มต้นของ และอัปเดตเฉพาะหลังจากที่คุณตั้งค่าพวกเขาเป็น ความไม่ตรงกันในขนาดหน้าต่างทำให้กล้องส่งกลับรังสีที่มีข้อผิดพลาด Ray.Direction
พารามิเตอร์
ตำแหน่งบนแกน X ในพิกเซลของจุดที่หน้าจอจะเริ่มต้น Ray ตำแหน่งนี้เป็นส่วนหนึ่งของการสอด GUI
ตำแหน่งบนแกน Y ในพิกเซลของจุดที่หน้าจอจะเริ่มต้น Ray ตำแหน่งนี้เป็นส่วนหนึ่งของการสอด GUI
ส่งค่ากลับ
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.CFramelocal rollCFrame = CFrame.Angles(0, 0, roll)Workspace.CurrentCamera.CFrame = currentCFrame * rollCFrame
พารามิเตอร์
ส่งค่ากลับ
ViewportPointToRay
วิธีนี้สร้างหน่วย Ray จากตำแหน่ง 2D ในเขตมุมมองที่ปลอดภัยของอุปกรณ์ที่กำหนดไว้ในพิกเซลลําแสงมาจากตําแหน่ง 2D ที่เทียบเท่าในโลกที่ความลึกที่กำหนด (ในสตัด) ห่างจาก ไกล
ตามที่แสดงด้านล่าง (0, 0) ตรงกับจุดด้านบนซ้ายของแถบด้านบนของ Robloxซึ่งหมายความว่าตำแหน่ง 2D ที่ใส่มี ไม่ นับสําหรับ CoreUISafeInsets ใส่ แต่มันนับสําหรับใดๆ DeviceSafeInsets

โปรดทราบว่าตัวอย่าง UI ใช้ระบบข้อมูลสัมพันธ์ที่แตกต่าง ( ใช้ระบบข้อมูลสัมพันธ์จุดมุมมองในขณะที่วิธีนี้ใช้ระบบข้อมูลสัมพันธ์จุดมุมมอง)หากคุณต้องการระบุตำแหน่งในคอร์ด UI หลักโปรดใช้ ScreenPointToRay()
โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะกับกล้อง Workspace.CurrentCamera เท่านั้นกล้องอื่นๆ เช่นกล้องที่คุณสร้างสำหรับ ViewportFrame มีขนาดมุมมองเริ่มต้นของ (1, 1) และอัปเดตเฉพาะหลังจากที่คุณตั้งค่าพวกเขาเป็น CurrentCameraความไม่ตรงกันในขนาดหน้าต่างทำให้กล้องส่งกลับรังสีที่มีข้อผิดพลาด Ray.Direction
วิธีนี้สามารถใช้ร่วมกับคุณสมบัติ ViewportSize เพื่อสร้างลําแสงจากศูนย์กลางของหน้าจอได้ เช่น:
local Workspace = game:GetService("Workspace")local camera = Workspace.CurrentCameralocal viewportPoint = camera.ViewportSize / 2local unitRay = camera:ViewportPointToRay(viewportPoint.X, viewportPoint.Y, 0)
เนื่องจากการสร้าง Ray เป็นรัศมีหน่วยจึงยาวเพียงหนึ่งสตัด หากต้องการสร้างรัศมีที่ยาวกว่า กำลังติดตาม:
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)
พารามิเตอร์
ตำแหน่งบนแกน X ในพิกเซลของจุดมุมมองที่จะเริ่มต้น Ray ในพื้นที่ปลอดภัยของอุปกรณ์
ตำแหน่งบนแกน Y ในพิกเซลของจุดมุมมองที่จะเริ่มต้น Ray ในพื้นที่ปลอดภัยของอุปกรณ์
ส่งค่ากลับ
WorldToScreenPoint
วิธีนี้จะคืนตำแหน่งหน้าจอและความลึกของ Datatype.Vector3``worldPoint และว่าจุดนี้อยู่ภายในขอบเขตของหน้าจอหรือไม่
วิธีนี้พิจารณาถึงการสอดแทรก GUI ปัจจุบัน เช่น พื้นที่ที่ใช้โดยแถบด้านบน ซึ่งหมายความว่าตำแหน่ง 2D ที่ส่งคืนอยู่ในช่วงเวลาเดียวกับตำแหน่ง GUI และสามารถใช้เพื่อวางองค์ประกอบ GUIสำหรับวิธีที่เหมือนกันอย่างอื่นที่ไม่สนใจการแทรก GUI ดูที่ WorldToViewportPoint()
local Workspace = game:GetService("Workspace")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 หรือ Terrain
พารามิเตอร์
ส่งค่ากลับ
WorldToViewportPoint
วิธีนี้จะคืนตำแหน่งหน้าจอและความลึกของ Datatype.Vector3``worldPoint และว่าจุดนี้อยู่ภายในขอบเขตของหน้าจอหรือไม่
วิธีนี้ไม่นำ GUI ปัจจุบันมาพิจารณา เช่น พื้นที่ที่ใช้โดยแถบด้านบน ซึ่งหมายความว่าตำแหน่ง 2D ที่ส่งคืนจะได้รับจากมุมซ้ายบนของหน้าต่างดูยกเว้นที่คุณกำลังใช้ ScreenGui.IgnoreGuiInset ตำแหน่งนี้ไม่เหมาะสำหรับวางองค์ประกอบ GUI
สำหรับวิธีที่เหมือนกันอย่างสมบูรณ์ที่รับผิดชอบสําหรับการสอดแนม GUI ดู WorldToScreenPoint()
local Workspace = game:GetService("Workspace")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 หรือ Terrain
พารามิเตอร์
ส่งค่ากลับ
อีเวนต์
InterpolationFinished
อีเวนต์นี้จะเกิดขึ้นเมื่อ Camera ได้สิ้นสุดการแทนที่โดยใช้วิธี Camera:Interpolate()มันจะไม่ยิงหากวัยรุ่นถูกขัดขวางเนื่องจาก Camera:Interpolate() ถูกเรียกอีกครั้ง
คุณแนะนำให้ใช้ TweenService เพื่อแอนิเมชั่น Camera แทนเนื่องจากเป็นที่เชื่อถือได้มากขึ้นและให้ตัวเลือกมากขึ้นสำหรับการปรับแต่งสไตล์