Camera

Tampilkan yang Tidak Digunakan Lagi

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Tidak Direplikasi

Objek Camera mendefinisikan pandangan dunia 3D.Dalam pengalaman yang berjalan, setiap klien memiliki objek sendiri Camera yang berada di lokal klien itu Workspace , dapat diakses melalui properti Workspace.CurrentCamera .

Properti kamera paling penting adalah:

  • CFrame yang mewakili posisi dan orientasi kamera.

  • CameraType yang dibaca oleh skrip kamera pengalaman dan menentukan bagaimana kamera harus memperbarui setiap frame.

  • CameraSubject yang dibaca oleh skrip kamera pengalaman dan menentukan objek mana kamera harus mengikuti.

  • FieldOfView yang mewakili jangkauan terlihat dari dunia yang dapat diamati.

  • Focus yang mewakili titik kamera yang dilihat.Penting properti ini atur, karena visual tertentu akan lebih terperinci dan akan diperbarui lebih sering tergantung pada seberapa dekat mereka dengan titik fokus.

Lihat Menyesuaikan Kamera untuk informasi lebih lanjut tentang cara menyesuaikan dan menyesuaikan perilaku kamera.

Menyimpan Beberapa Kamera

Perhatikan bahwa ketika mengubah Workspace.CurrentCamera ke Camera baru, semua yang lain Cameras langsung turun dari Workspace akan hancur.Jika Anda perlu menyimpan banyak kamera dan bertukar di antara mereka sesuai permintaan, disarankan untuk menyimpannya di Folder atau Model di bawah Workspace, di mana mereka akan tetap berada bahkan ketika CurrentCamera diubah.

Rangkuman

Properti

Properti diwarisi dari PVInstance

Metode

Metode diwarisi dari PVInstance

Properti

CFrame

Baca Paralel

Properti ini adalah CFrame dari Camera , yang mendefinisikan posisi dan orientasi di dunia 3D.Perhatikan bahwa beberapa transformasi, seperti rotasi kepala saat menggunakan perangkat VR, tidak tercermin dalam properti ini, jadi Anda harus menggunakan GetRenderCFrame() untuk mendapatkan "nyata" CFrame dari kamera.

Anda dapat memindahkan kamera dengan mengatur properti ini. Namun, skrip kamera default juga mengatur ini, sehingga Anda harus:

  • Atur kamera CameraType ke Enum.CameraType.Scriptable sehingga skrip kamera default tidak akan memperbarui CFrame kamera.Metode ini paling sederhana dan direkomendasikan dalam kebanyakan kasus.

  • Sekpenuhnya ganti skrip kamera default dengan alternatif.Pendekatan ini hanya direkomendasikan jika Anda tidak membutuhkan fungsi kamera default.

Cara paling intuitif untuk menempatkan dan memosisikan Camera adalah dengan menggunakan konstruktor CFrame.lookAt().Dalam contoh berikut, Camera di posisikan di Vector3.new(0, 10, 0) dan diposisikan untuk melihat ke arah 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)

Meskipun kamera dapat ditempatkan dengan cara yang ditunjukkan di atas, Anda mungkin ingin menganimasinya untuk bergerak lancar dari satu CFrame ke yang lain.Untuk ini, Anda dapat:

  • Tetapkan posisi/orientasi kamera setiap frame dengan RunService:BindToRenderStep() dan metode CFrame:Lerp().

  • Buat dan mainkan Tween yang menganimasikan posisi/orientasi kamera:


    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

Baca Paralel

CameraSubject menerima berbagai Instances . Skrip kamera default menanggapi berbeda dengan pengaturan yang tersedia:

  • Secara default, skrip kamera mengikuti Humanoid karakter lokal, mempertimbangkan status manusiaoid saat ini dan Humanoid.CameraOffset .

  • Saat ditetapkan ke BasePart, skrip kamera mengikuti posisinya, dengan offset vertikal dalam kasus VehicleSeats .

CameraSubject tidak dapat ditetapkan ke nil. Mencoba melakukannya akan mengembalikannya ke nilai sebelumnya.

Untuk memulihkan CameraSubject ke nilai defaultnya, atur ke karakter lokal 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

Baca Paralel

Skrip kamera Roblox default memiliki beberapa perilaku bawaan.Mengatur properti ini beralih di antara berbagai perilaku Enum.CameraType.Perhatikan bahwa beberapa jenis kamera memerlukan CameraSubject yang valid untuk berfungsi dengan benar.

Skrip kamera default tidak akan bergerak atau memperbarui kamera jika CameraType diatur ke Enum.CameraType.Scriptable.Untuk informasi lebih lanjut tentang penempatan dan orientasi kamera secara manual, lihat CFrame .

Untuk semua pengaturan CameraType kecuali Enum.CameraType.Scriptable , properti CameraSubject mewakili objek yang posisinya kamera Focus diatur ke.

DiagonalFieldOfView

Tidak Direplikasi
Baca Paralel

Mengatur berapa banyak derajat dalam arah diagonal (dari satu sudut pandang ke sudut berlawanannya) yang dapat dilihat kamera.Lihat FieldOfView untuk penjelasan yang lebih umum tentang bidang pandang.

Perhatikan bahwa DiagonalFieldOfView mewakili bidang pandang yang terlihat oleh rendering Camera ke area layar penuh yang mungkin ditutup oleh notch atau potongan layar di beberapa perangkat.Lihat ViewportSize untuk informasi lebih lanjut.

FieldOfView

Baca Paralel

Properti FieldOfView (FOV) menetapkan berapa banyak derajat dalam arah vertikal kamera dapat melihat.Properti ini dibatasi antara 1 dan 120 derajat dan default di 70 .Bidang pandang yang sangat rendah atau sangat tinggi tidak direkomendasikan karena dapat membingungkan pemain.

Perhatikan bahwa skala seragam diterapkan, artinya bidang pandang vertikal dan horizontal selalu terkait dengan rasio aspek layar.

Penggunaan yang disarankan untuk FieldOfView termasuk:

  • Mengurangi FOV untuk memberikan kesan perbesaran, misalnya saat menggunakan binokel.
  • Meningkatkan FOV saat pemain "berlari" untuk memberikan kesan kurangnya kontrol.

Perhatikan bahwa FieldOfView mewakili bidang pandang yang terlihat oleh rendering Camera ke area layar penuh yang mungkin ditutup oleh notch atau potongan layar di beberapa perangkat.Lihat ViewportSize untuk informasi lebih lanjut.

FieldOfViewMode

Baca Paralel

Kamera FieldOfView (FOV) harus diperbarui untuk mencerminkan perubahan ViewportSize .Nilai dari FieldOfViewMode menentukan nilai FOV mana yang akan tetap konstan.

Sebagai contoh, ketika properti ini diatur ke Enum.FieldOfViewMode.Vertical, FOV horizontal diperbarui saat jendela melihat diubah ukurannya, tetapi FOV vertikal tetap konstan.Jika properti ini diatur ke Enum.FieldOfViewMode.Diagonal , FOV horizontal dan vertikal mungkin diubah untuk menjaga konstan FOV diagonal.

Focus

Baca Paralel

Beberapa operasi grafis yang dilakukan mesin, seperti memperbarui pencahayaan, dapat memakan waktu atau upaya komputasi untuk diselesaikan.Properti kamera Focus memberi tahu mesin area mana di ruang 3D untuk diprioritaskan saat melakukan operasi seperti itu.Sebagai contoh, pencahayaan dinamis dari objek seperti PointLights mungkin tidak ditampilkan pada jarak jauh dari fokus.

Skrip kamera Roblox default secara otomatis mengatur Focus untuk mengikuti CameraSubject (biasanya Humanoid ).Namun, Focus tidak akan tidak secara otomatis diperbarui saat CameraType diatur ke Enum.CameraType.Scriptable atau saat skrip kamera default tidak digunakan.Dalam kasus ini, Anda harus memperbarui Focus setiap frame, menggunakan metode RunService:BindToRenderStep() pada prioritas Enum.RenderPriority.Camera.

Focus tidak memiliki pengaruh pada posisi atau orientasi kamera; lihat CFrame untuk ini.

HeadLocked

Baca Paralel

Mengubah apakah kamera akan secara otomatis melacak gerakan kepala pemain menggunakan perangkat VR.Ketika true (默认), mesin menggabungkan CFrame dengan Enum.UserCFrame kepala pengguna untuk menampilkan pandangan pemain dengan faktor pelacakan kepala yang dihitung.Tampilan akan ditampilkan pada berikut 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
-- Ini akan setara dengan Camera:GetRenderCFrame()
local renderCFrame = camera.CFrame * headCFrame

Disarankan untuk tidak menonaktifkan properti ini karena alasan berikut:

  • Pemain dapat mengalami mual jika solusi pelacakan kepala yang setara tidak ditambahkan.
  • Mesin Roblox melakukan optimisasi latensi saat HeadLocked benar.
Lihat Juga

HeadScale

Baca Paralel

HeadScale adalah skala perspektif pengguna terhadap dunia saat menggunakan VR.

Ukuran 1 stud di VR adalah 0.3 meters / HeadScale , artinya nilai yang lebih besar HeadScale sama dengan dunia yang terlihat lebih kecil dari perspektif pengguna saat menggunakan perangkat VR.Sebagai contoh, bagian yang tinggi 1 stud tampaknya tinggi 0,6 meter ke pemain VR dengan .

Properti ini secara otomatis dikontrol oleh VRService.AutomaticScaling untuk menyesuaikan perspektif pemain dengan ukuran avatar mereka.Jika Anda berniat untuk mengontrol HeadScale diri sendiri atau menggunakan karakter khusus, beralih VRService.AutomaticScaling ke Enum.VRScaling.Off .

Properti ini tidak boleh dikacaukan dengan Humanoid.HeadScale yang merupakan NumberValue orangtua ke Humanoid untuk mengontrol skalanya.

MaxAxisFieldOfView

Tidak Direplikasi
Baca Paralel

Properti MaxAxisFieldOfView mengatur berapa banyak derajat di sepanjang sumbu pandang terpanjang yang dapat dilihat kamera.

Ketika sumbu terpanjang adalah sumbu vertikal, properti ini akan berperilaku mirip dengan properti FieldOfView.Ini umumnya terjadi ketika perangkat berada dalam orientasi potret.Dalam orientasi pemandangan, sumbu terpanjang akan menjadi sumbu horizontal; dalam kasus ini, properti menggambarkan bidang pandang horizontal dari Camera .

NearPlaneZ

Hanya Baca
Tidak Direplikasi
Baca Paralel

Properti NearPlaneZ menggambarkan seberapa jauh pesawat pemotong dekat kamera, dalam stud.Pesawat pemotong dekat adalah pesawat geometris yang berada di depan kamera CFrame .Apa pun antara pesawat ini dan kamera tidak akan ditampilkan, membuat tampilan potong saat melihat objek pada jarak sangat pendek.Nilai dari NearPlaneZ bervariasi di antara berbagai platform dan saat ini selalu antara -0.1 dan -0.5 .

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

VRTiltAndRollEnabled

Baca Paralel

Properti ini beralih apakah akan menerapkan kemiringan dan gulir dari properti CFrame saat pemain menggunakan perangkat VR.

Untuk mencegah penyakit gerakan, cakrawala harus tetap level.Miring dan menggulir pandangan pemain saat menggunakan perangkat VR dapat menyebabkan terputusnya antara ruang fisik pemain dan ruang virtual yang mereka lihat.Mengubah arah ke bawah yang tampak bisa menyebabkan pemain kehilangan keseimbangan atau mengalami pusing.

Untuk alasan ini, umumnya disarankan untuk meninggalkan properti ini dinonaktifkan, kecuali Anda telah secara ekstensif menguji pengalaman Anda untuk efek ini.Bahkan dengan kemiringan dan gulungan diaktifkan, Anda mungkin ingin memastikan pemain selalu memiliki frame referensi yang stabil, seperti interior kendaraan atau lantai yang dapat membantu pemain mendaratkan diri di ruang fisik mereka.

ViewportSize

Hanya Baca
Tidak Direplikasi
Baca Paralel

ViewportSize kembali dimensi area aman perangkat di layar saat ini.Area ini adalah segi empat yang mencakup area bilah atas Roblox tetapi tidak termasuk notifikasi perangkat atau pemotongan layar.Unit dari ViewportSize adalah unit offset UI Roblox yang mungkin berbeda dari piksel tampilan asli.

Mobile device screen with cutout showing device safe area.

Seperti disebutkan di atas, ViewportSize tidak sama dengan ukuran area layar penuh pada tampilan dengan cutout atau notch.Untuk mendapatkan ukuran area layar penuh di semua tampilan, Anda dapat menanyakan properti AbsoluteSize dari sebuah ScreenGui dengan ScreenInsets diatur ke None .Lihat Enum.ScreenInsets untuk informasi lebih lanjut tentang cara mendefinisikan area layar.

Akhirnya, perhatikan bahwa ViewportSize bukan ukuran jendela yang sebenarnya yang digunakan kamera untuk rendering (kamera rendah di area layar penuh).Juga, properti FieldOfView dan DiagonalFieldOfView berdasarkan pada area layar penuh, bukan ViewportSize.

Pembaruan Kamera

Hanya Camera saat ini yang disebutkan oleh Workspace.CurrentCamera memiliki ViewportSize diperbarui setiap frame selama langkah PreRender .The ViewportSize dari semua kamera lain dalam pengalaman Anda tidak akan diperbarui, termasuk yang digunakan untuk ViewportFrames .

Metode

GetPartsObscuringTarget

Instances

Metode ini mengembalikan array dari BaseParts yang menghalangi garis pandang antara posisi kamera CFrame dan Vector3 di array castPoints.Setiap Instances termasuk dalam array ignoreList akan diabaikan, bersama dengan keturunann mereka.

Parameter castPoints diberikan sebagai array dari Vector3 posisi.Perhatikan bahwa array dari BaseParts dikembalikan dalam urutan acak, dan tidak ada data raycast tambahan yang disediakan.Jika Anda membutuhkan data seperti posisi pukul, bahan pukul, atau permukaan normal, Anda harus memilih metode 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)

Jika Terrain menghalangi titik lempar, BaseParts menghalangi titik lempar di antara penghalang Terrain dan titik lempar tidak akan dikembalikan.

Parameter

castPoints: Array

Sebuah array dari Vector3 posisi titik lempar.

Nilai Default: ""
ignoreList: Instances

Sebuah array dari Instances yang harus diabaikan, bersama dengan keturunann mereka.

Nilai Default: ""

Memberikan nilai

Instances

Sebuah array dari BaseParts yang menyembunyikan garis pandang antara kamera CFrame dan castPoints.

GetRenderCFrame

Metode ini mengembalikan aktual CFrame dari Camera sebagai itu ditampilkan, termasuk dampak VR (transformasi kepala VR tidak diterapkan pada properti CFrame , jadi praktik terbaik adalah menggunakan GetRenderCFrame() untuk mendapatkan "nyata" CFrame pandangan pemain).

Sebagai contoh, saat menggunakan VR, Camera sebenarnya drender di berikut 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

Render kamera CFrame hanya akan diubah untuk menghitung kepala saat properti HeadLocked benar.


Memberikan nilai

The CFrame the Camera sedang ditampilkan.

GetRoll

Metode ini kembali, dalam radian, gulungan saat ini yang diterapkan ke Camera menggunakan SetRoll() .Roll didefinisikan sebagai rotasi di sekitar sumbu Z kamera.

Metode ini hanya mengembalikan gulungan yang diterapkan menggunakan metode SetRoll().Roll secara manual diterapkan ke kamera CFrame tidak dihitung.Untuk mendapatkan gulungan aktual dari Camera , termasuk gulungan yang diterapkan secara manual, Anda dapat menggunakan potongan berikut:


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

Memberikan nilai

Gulir saat ini yang diterapkan oleh SetRoll() , dalam radian.

Contoh Kode

Contoh ini, saat digunakan dalam LocalScript, akan mengambil gulungan kamera saat ini dalam derajat.Kemudian, jika sudut putaran kamera tidak 20 derajat, sudut putaran kamera diatur ke 20 derajat.

Kamera:DapatkanRoll

local currentRoll = math.deg(workspace.CurrentCamera:GetRoll()) -- Mendapatkan gulungan kamera saat ini dalam derajat.
if currentRoll ~= 20 then
workspace.CurrentCamera:SetRoll(math.rad(20)) -- Jika kamera tidak berada pada sudut 20 derajat, gulir diatur ke 20 derajat.
end

ScreenPointToRay

Tulis Paralel

Metode ini membuat unit Ray dari posisi 2D di layar (didefinisikan dalam piksel), yang menyumbangkan GUI yang dimasukkan.Asal Ray berasal dari Vector3 setara dengan posisi 2D di dunia pada kedalaman yang diberikan (dalam stud) jauh dari Camera .

Karena metode ini mengakui insersi GUI, offset yang diterapkan ke elemen GUI (seperti dari bilah atas) dihitung.Ini berarti posisi layar yang ditentukan akan dimulai di sudut kiri atas bawah bilah atas.Untuk metode identik lainnya yang tidak mempertimbangkan offset GUI, gunakan ViewportPointToRay() .

Karena Ray yang dibuat adalah sinar unit, hanya panjang satu stud. Untuk membuat sinar yang lebih panjang, Anda dapat melakukan hal mengikuti:


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)

Metode ini hanya berfungsi untuk kamera Workspace saat ini.Kamera lain, seperti kamera yang Anda buat untuk ViewportFrame , memiliki ukuran jendela pandang awal (1, 1) dan hanya diperbarui setelah Anda mengatur mereka ke Workspace.CurrentCamera .Ketidakcocokan dalam ukuran viewport menyebabkan kamera untuk mengembalikan sebuah sinar dengan salah Ray.Direction .

Parameter

Posisi di sumbu X , dalam piksel, pada titik layar di mana berasal Ray . Posisi ini menyumbangkan inseran GUI.

Nilai Default: ""

Posisi di sumbu Y pada sumbu, dalam piksel, dari titik layar di mana asal Ray . Posisi ini menyumbangkan inseran GUI.

Nilai Default: ""
depth: number

Kedalaman dari Camera , dalam stud, dari mana untuk mengimbangkan asal Ray .

Nilai Default: 0

Memberikan nilai

Unit Ray , berasal dari posisi dunia yang setara Vector3 dari koordinat layar yang diberikan pada kedalaman yang diberikan jauh dari Camera .Sinar ini diposisikan ke arah Camera .

SetRoll

()

Metode ini sudah usang dan tidak lagi dianggap sebagai praktik terbaik.

Metode ini menetapkan gulungan saat ini, dalam radian, dari Camera .Gulungan diterapkan setelah CFrame dan mewakili rotasi di sekitar sumbu Z kamera.

Sebagai contoh, berikut akan mengbalikkan Camera :


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

SetRoll tidak memiliki efek pada gulungan apa pun yang diterapkan menggunakan properti CFrame.Roll diterapkan menggunakan SetRoll tidak dicerminkan dalam properti CFrame tetapi dicerminkan dalam CFrame yang dikembalikan oleh GetRenderCFrame() .

Metode ini hanya dapat digunakan ketika CameraType diatur ke Scriptable, terlepas dari apakah skrip kamera default digunakan atau tidak.Jika digunakan dengan yang lain CameraType peringatan diberikan dalam output.

Setiap gulungan yang diterapkan menggunakan metode ini akan hilang saat CameraType diubah dari Scriptable .

Untuk mendapatkan roll set menggunakan metode ini gunakan GetRoll() .

Karena metode ini sudah ketinggalan zaman, Anda disarankan untuk menerapkan roll ke Camera menggunakan properti CFrame. Misalnya:


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

Parameter

rollAngle: number

Sudut gulungan, dalam radian, untuk diterapkan pada Camera .

Nilai Default: ""

Memberikan nilai

()

ViewportPointToRay

Tulis Paralel

Metode ini membuat unit Ray dari posisi 2D di port pandang aman perangkat, didefinisikan dalam piksel.Sinar berasal dari Vector3 setara dengan posisi 2D di dunia pada kedalaman yang diberikan (dalam stud) jauh dari Camera .

Seperti yang ditunjukkan di bawah, (0, 0) sesuai dengan titik bagian atas kiri dari bilah atas Roblox.Ini berarti bahwa posisi input 2D tidak tidak memperhitungkan inserat CoreUISafeInsets , tetapi memperhitungkan apa pun DeviceSafeInsets .

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

Perhatikan bahwa instansi UI menggunakan sistem koordinat yang berbeda ( menggunakan sistem koordinat viewport sementara metode ini menggunakan sistem koordinat viewport).Jika Anda ingin menentukan posisi dalam koordinat UI utama, silakan gunakan ScreenPointToRay() .

Perhatikan juga bahwa metode ini hanya berfungsi untuk kamera Workspace.CurrentCamera .Kamera lain, seperti kamera yang Anda buat untuk ViewportFrame , memiliki ukuran jendela pandang awal (1, 1) dan hanya diperbarui setelah Anda mengatur mereka ke CurrentCamera .Ketidakcocokan dalam ukuran viewport menyebabkan kamera untuk mengembalikan sebuah sinar dengan salah Ray.Direction .

Metode ini dapat digunakan bersama dengan properti ViewportSize untuk membuat sebuah sinar dari pusat layar, misalnya:


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

Karena Ray yang dibuat adalah sinar unit, hanya panjang satu stud. Untuk membuat sinar yang lebih panjang, Anda dapat melakukan hal mengikuti:


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)

Parameter

Posisi di sumbu X , dalam piksel, pada titik pandang di mana asal Ray , dalam koordinat zona aman perangkat.

Nilai Default: ""

Posisi di sumbu Y pada sumbu, dalam piksel, dari titik pandang di mana asal Ray , dalam koordinat zona aman perangkat.

Nilai Default: ""
depth: number

Kedalaman dari Camera , dalam stud, dari mana untuk mengimbangkan asal Ray .

Nilai Default: 0

Memberikan nilai

Unit Ray , berasal dari posisi dunia yang setara Vector3 dari koordinat viewport yang diberikan pada kedalaman yang diberikan jauh dari Camera .Sinar ini diposisikan ke arah Camera .

WorldToScreenPoint

Tulis Paralel

Metode ini mengembalikan lokasi layar dan kedalaman dari Datatype.Vector3``worldPoint dan apakah titik ini berada dalam batas layar.

Metode ini mempertimbangkan insert GUI saat ini, seperti ruang yang ditempati oleh bilah atas, sehingga posisi 2D yang dikembalikan berada di dalam istilah yang sama dengan posisi GUI dan dapat digunakan untuk menempatkan elemen GUI.Untuk metode identik lainnya yang mengabaikan insersi GUI, lihat 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

Perhatikan metode ini tidak melakukan raycasting apa pun dan boolean yang menunjukkan apakah worldPoint berada dalam batas layar akan menjadi true terlepas dari apakah titik terhalang oleh BaseParts atau Terrain .

Parameter

worldPoint: Vector3

Posisi dunia Vector3 .

Nilai Default: ""

Memberikan nilai

Sebuah tuple yang berisi, dalam urutan:

  • Sebuah yang whose X dan Y komponen mewakili offset dari sudut kiri atas layar, dalam piksel.Komponen Z mewakili kedalaman dari layar (dalam stud)

  • Sebuah boolean yang menunjukkan apakah worldPoint berada dalam batas layar.

WorldToViewportPoint

Tulis Paralel

Metode ini mengembalikan lokasi layar dan kedalaman dari Datatype.Vector3``worldPoint dan apakah titik ini berada dalam batas layar.

Metode ini tidak mempertimbangkan insert GUI saat ini, seperti ruang yang ditempati oleh bilah atas, sehingga posisi 2D yang dikembalikan diambil dari sudut kiri atas tampilan.Kecuali Anda menggunakan ScreenGui.IgnoreGuiInset, posisi ini tidak cocok untuk menempatkan elemen GUI.

Untuk metode identik lainnya yang menyumbangkan insersi GUI, lihat 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

Perhatikan metode ini tidak melakukan raycasting apa pun dan boolean yang menunjukkan apakah worldPoint berada dalam batas layar akan menjadi true terlepas dari apakah titik terhalang oleh BaseParts atau Terrain .

Parameter

worldPoint: Vector3

Posisi dunia Vector3 .

Nilai Default: ""

Memberikan nilai

Sebuah tuple yang berisi, dalam urutan:

  • Sebuah yang whose X dan Y komponen mewakili offset dari sudut kiri atas tampilan, dalam piksel.Komponen Z mewakili kedalaman dari layar (dalam stud)

  • Sebuah boolean yang menunjukkan apakah worldPoint berada dalam batas layar.

ZoomToExtents

()

Parameter

boundingBoxCFrame: CFrame
Nilai Default: ""
boundingBoxSize: Vector3
Nilai Default: ""

Memberikan nilai

()

Acara

InterpolationFinished

Peristiwa ini terjadi ketika Camera telah selesai menginterpolasi menggunakan metode Camera:Interpolate().Ini tidak akan menembak jika seorang remaja terputus karena Camera:Interpolate() dipanggil lagi.

Anda disarankan untuk menggunakan TweenService untuk menganimasikan Camera sebagai gantinya, karena lebih dapat diandalkan dan memberikan lebih banyak pilihan untuk meringankan gaya.