This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Una telecamera (camera) in Defold è un componente che modifica il viewport e la proiezione del mondo di gioco. Il componente telecamera definisce una telecamera prospettica o ortografica essenziale che fornisce una matrice di vista e una matrice di proiezione allo script di rendering.
Una telecamera prospettica viene generalmente utilizzata nei giochi 3D, dove la vista della telecamera, le dimensioni e la prospettiva degli oggetti dipendono da un frustum di vista e dalla distanza e dall’angolo di visuale tra la telecamera e gli oggetti nel gioco.
Nei giochi 2D è spesso preferibile eseguire il rendering della scena con una proiezione ortografica. In questo caso la vista della telecamera non è più determinata da un frustum di vista, ma da un parallelepipedo. La proiezione ortografica non è realistica, perché non modifica le dimensioni degli oggetti in base alla loro distanza. Un oggetto distante 1000 unità viene visualizzato con le stesse dimensioni di un oggetto posto proprio davanti alla telecamera.

Per creare una telecamera, fai clic con il pulsante destro su un oggetto di gioco e seleziona Add Component ▸ Camera. In alternativa, puoi creare un file di componente nella gerarchia del progetto e aggiungerlo all’oggetto di gioco.

Il componente telecamera ha le seguenti proprietà che definiscono il frustum della telecamera:

Fixed corrisponde allo zoom effettivo. Nelle modalità Auto Fit e Auto Cover viene moltiplicato per lo zoom calcolato automaticamente, consentendo di aggiungere ulteriore zoom senza disattivare il dimensionamento automatico.game.project → display.width/height).
Fixed (zoom costante): Utilizza il valore corrente di Orthographic Zoom così com’è.Auto Fit (contenimento): Calcola automaticamente lo zoom affinché l’intera area di progetto rientri nella finestra, poi lo moltiplica per Orthographic Zoom. Può mostrare contenuti aggiuntivi ai lati o in alto e in basso.Auto Cover (copertura): Calcola automaticamente lo zoom affinché l’area di progetto copra l’intera finestra, poi lo moltiplica per Orthographic Zoom. Può tagliare i contenuti ai lati o in alto e in basso.
Disponibile solo quando Orthographic Projection è attiva.Tutte le telecamere sono automaticamente abilitate e aggiornate durante ogni fotogramma, e il modulo Lua camera è disponibile in tutti i contesti di script. A partire da Defold 1.8.1 non è più necessario abilitare esplicitamente una telecamera inviando un messaggio acquire_camera_focus al componente telecamera. I vecchi messaggi di acquisizione e rilascio sono ancora disponibili, ma si consiglia di utilizzare i messaggi enable e disable, come per qualsiasi altro componente che desideri abilitare o disabilitare:
msg.post("#camera", "disable")
msg.post("#camera", "enable")
Per elencare tutte le telecamere attualmente disponibili, puoi usare camera.get_cameras():
-- Note: The render calls are only available in a render script.
-- The camera.get_cameras() function can be used anywhere,
-- but render.set_camera can only be used in a render script.
for k,v in pairs(camera.get_cameras()) do
-- the camera table contains the URLs of all cameras
render.set_camera(v)
-- do rendering here - anything rendered here that uses materials with
-- view and projection matrices specified, will use matrices from the camera.
end
-- to disable a camera, pass in nil (or no arguments at all) to render.set_camera.
-- after this call, all render calls will use the view and projection matrices
-- that are specified on the render context (render.set_view and render.set_projection)
render.set_camera()
Il modulo di scripting camera offre diverse funzioni per controllare la telecamera. Di seguito sono riportate solo alcune delle funzioni disponibili; per conoscerle tutte, consulta la documentazione API).
camera.get_aspect_ratio(camera) -- get aspect ratio
camera.get_far_z(camera) -- get far z
camera.get_fov(camera) -- get field of view
camera.get_orthographic_mode(camera) -- get orthographic mode (one of camera.ORTHO_MODE_*)
camera.get_orthographic_zoom(camera) -- get the user-controlled zoom multiplier
camera.get_orthographic_auto_zoom(camera) -- get the automatically calculated zoom
camera.set_aspect_ratio(camera, ratio) -- set aspect ratio
camera.set_far_z(camera, far_z) -- set far z
camera.set_near_z(camera, near_z) -- set near z
camera.set_orthographic_mode(camera, camera.ORTHO_MODE_AUTO_FIT) -- set orthographic mode
... And so forth
Una telecamera è identificata da un URL, che rappresenta il percorso completo del componente nella scena e comprende la collezione, l’oggetto di gioco a cui appartiene e l’ID del componente. In questo esempio, useresti l’URL /go#camera per identificare il componente telecamera dall’interno della stessa collezione e main:/go#camera per accedere a una telecamera da una collezione diversa o dallo script di rendering.

-- Accessing a camera from a script in the same collection:
camera.get_fov("/go#camera")
-- Accessing a camera from a script in a different collection:
camera.get_fov("main:/go#camera")
-- Accessing a camera from the render script:
render.set_camera("main:/go#camera")
A ogni fotogramma, il componente telecamera che detiene il focus della telecamera invia un messaggio set_view_projection al socket @render:
-- builtins/render/default.render_script
--
function on_message(self, message_id, message)
if message_id == hash("set_view_projection") then
self.view = message.view -- [1]
self.projection = message.projection
end
end
Il componente telecamera fornisce allo script di rendering una matrice di proiezione prospettica oppure ortografica, a seconda della proprietà Orthographic Projection della telecamera. La matrice di proiezione tiene conto anche dei piani di clipping vicino e lontano definiti, del campo visivo e delle impostazioni del rapporto d’aspetto della telecamera.
La matrice di vista fornita dalla telecamera ne definisce la posizione e l’orientamento. Una telecamera con Orthographic Projection centra la vista sulla posizione dell’oggetto di gioco a cui è collegata, mentre una telecamera con Perspective Projection posiziona l’angolo inferiore sinistro della vista sull’oggetto di gioco a cui è collegata.
Quando usi lo script di rendering predefinito, Defold imposta automaticamente l’ultima telecamera abilitata come telecamera da utilizzare per il rendering. Prima di questa modifica, uno script del progetto doveva inviare esplicitamente il messaggio use_camera_projection al renderer per indicargli di utilizzare la vista e la proiezione dei componenti telecamera. Questo passaggio non è più necessario, ma resta possibile per garantire la retrocompatibilità.
In alternativa, puoi impostare una telecamera specifica da utilizzare per il rendering in uno script di rendering. Può essere utile quando devi controllare con maggiore precisione quale telecamera utilizzare per il rendering, per esempio in un gioco multigiocatore.
-- render.set_camera will automatically use the view and projection matrices
-- for any rendering happening until render.set_camera() is called.
render.set_camera("main:/my_go#camera")
Per verificare se una telecamera è attiva, puoi utilizzare la funzione get_enabled dell’API della telecamera:
if camera.get_enabled("main:/my_go#camera") then
-- camera is enabled, use it for rendering!
render.set_camera("main:/my_go#camera")
end
Per usare la funzione set_camera insieme all’esclusione degli oggetti esterni al frustum, devi passare questa impostazione come opzione alla funzione:
render.set_camera("main:/my_go#camera", {use_frustum = true})
Puoi spostare la telecamera nel mondo di gioco muovendo l’oggetto di gioco a cui è collegato il componente telecamera. Il componente telecamera invia automaticamente una matrice di vista aggiornata in base alla posizione corrente della telecamera sugli assi x e y.
Con una telecamera prospettica puoi ingrandire e ridurre la vista spostando lungo l’asse z l’oggetto di gioco a cui è collegata la telecamera. Il componente telecamera invia automaticamente una matrice di vista aggiornata in base alla posizione z corrente della telecamera.
Con una telecamera ortografica puoi ingrandire e ridurre la vista modificando la proprietà Orthographic Zoom della telecamera, nell’editor oppure durante l’esecuzione:
-- In Fixed mode, this is the effective zoom.
go.set("#camera", "orthographic_zoom", 2)
Nelle modalità Auto Fit e Auto Cover, Orthographic Zoom viene applicato allo zoom calcolato automaticamente e non viene ignorato. Per esempio, imposta Orthographic Mode su Auto Fit e Orthographic Zoom su 1.25 nell’editor per adattare l’area di progetto alla finestra e poi ingrandirla di un ulteriore 25%. La configurazione equivalente durante l’esecuzione è:
camera.set_orthographic_mode("#camera", camera.ORTHO_MODE_AUTO_FIT)
go.set("#camera", "orthographic_zoom", 1.25)
local auto_zoom = camera.get_orthographic_auto_zoom("#camera")
local zoom_multiplier = camera.get_orthographic_zoom("#camera")
local effective_zoom = auto_zoom * zoom_multiplier
camera.get_orthographic_auto_zoom() restituisce lo zoom calcolato a partire dalle dimensioni correnti della finestra e del progetto nelle modalità Auto Fit e Auto Cover. Restituisce 1.0 in modalità Fixed. Lo stesso valore è disponibile tramite la proprietà di sola lettura orthographic_auto_zoom del componente:
local auto_zoom = go.get("#camera", "orthographic_auto_zoom")
Quando usi una telecamera ortografica, puoi anche cambiare il modo in cui viene determinato lo zoom tramite l’impostazione Orthographic Mode o tramite script:
-- get current mode (one of camera.ORTHO_MODE_FIXED, _AUTO_FIT, _AUTO_COVER)
local mode = camera.get_orthographic_mode("#camera")
-- switch to auto-fit (contain) to always keep the full design area visible
camera.set_orthographic_mode("#camera", camera.ORTHO_MODE_AUTO_FIT)
-- switch to auto-cover to ensure the design area covers the window
camera.set_orthographic_mode("#camera", camera.ORTHO_MODE_AUTO_COVER)
-- switch to fixed mode to use orthographic_zoom without automatic sizing
camera.set_orthographic_mode("#camera", camera.ORTHO_MODE_FIXED)
Il principio dello zoom adattivo consiste nel regolare il valore di zoom della telecamera quando la risoluzione dello schermo cambia rispetto alla risoluzione iniziale impostata in game.project.
Due approcci comuni allo zoom adattivo sono:
Esempio:
local DISPLAY_WIDTH = sys.get_config_int("display.width")
local DISPLAY_HEIGHT = sys.get_config_int("display.height")
function init(self)
local initial_zoom = go.get("#camera", "orthographic_zoom")
local display_scale = window.get_display_scale()
window.set_listener(function(self, event, data)
if event == window.WINDOW_EVENT_RESIZED then
local window_width = data.width
local window_height = data.height
local design_width = DISPLAY_WIDTH / initial_zoom
local design_height = DISPLAY_HEIGHT / initial_zoom
-- max zoom: ensure that the initial design dimensions will fill and expand beyond the screen bounds
local zoom = math.max(window_width / design_width, window_height / design_height) / display_scale
-- min zoom: ensure that the initial design dimensions will shrink and be contained within the screen bounds
--local zoom = math.min(window_width / design_width, window_height / design_height) / display_scale
go.set("#camera", "orthographic_zoom", zoom)
end
end)
end
Puoi trovare un esempio completo di zoom adattivo in questo progetto di esempio.
Nota: con una telecamera ortografica puoi ora ottenere il comportamento di contenimento o copertura senza codice personalizzato, impostando Orthographic Mode su Auto Fit (contenimento) o Auto Cover (copertura). In queste modalità lo zoom calcolato a partire dalle dimensioni della finestra e dalla risoluzione di progetto viene moltiplicato per Orthographic Zoom.
Puoi fare in modo che la telecamera segua un oggetto di gioco impostando l’oggetto di gioco a cui è collegato il componente telecamera come figlio dell’oggetto di gioco da seguire:

In alternativa, puoi aggiornare a ogni fotogramma la posizione dell’oggetto di gioco a cui è collegato il componente telecamera, mentre l’oggetto di gioco da seguire si sposta.
Quando una telecamera è stata spostata, ha cambiato zoom o ha modificato la propria proiezione, le coordinate di input non corrispondono più direttamente alle coordinate del mondo. Usa le funzioni di conversione della telecamera con action.screen_x e action.screen_y. Se l’URL facoltativo della telecamera viene omesso, viene utilizzata l’ultima telecamera abilitata.
Per una telecamera ortografica, camera.screen_xy_to_world() restituisce il punto nello spazio del mondo sul piano vicino della telecamera corrispondente a un pixel dello schermo:
function on_input(self, action_id, action)
if action_id == hash("touch") and action.pressed then
local world_position = camera.screen_xy_to_world(
action.screen_x, action.screen_y, "#camera")
go.set_position(world_position, "/marker")
end
end
Per una telecamera prospettica, camera.screen_to_world() accetta un vector3 la cui componente Z rappresenta la profondità di vista in unità del mondo misurata dal piano della telecamera:
local depth = 10
local world_position = camera.screen_to_world(
vmath.vector3(action.screen_x, action.screen_y, depth), "#camera")
camera.world_to_screen() esegue la conversione inversa. Restituisce X e Y in pixel dello schermo e Z secondo la stessa convenzione per la profondità di vista, quindi il risultato può essere passato nuovamente a camera.screen_to_world():
-- Update the cached world transform first if the object moved this frame.
go.update_world_transform("/marker")
local world_position = go.get_world_position("/marker")
local screen_position = camera.world_to_screen(world_position, "#camera")
Visita la pagina degli esempi per vedere la conversione delle coordinate in azione. È disponibile anche un progetto di esempio che mostra le stesse API.
Le soluzioni per telecamere di terze parti menzionate in questo manuale forniscono funzioni per convertire da e verso le coordinate dello schermo.
Puoi controllare le telecamere durante l’esecuzione tramite diversi messaggi e proprietà (consulta la documentazione API per l’utilizzo).
Una telecamera ha diverse proprietà che puoi modificare usando go.get() e go.set():
fovnumber).near_znumber).far_znumber).orthographic_zoomAuto Fit e Auto Cover viene moltiplicato per orthographic_auto_zoom. (number).orthographic_auto_zoomAuto Fit e Auto Cover, oppure 1.0 in modalità Fixed. SOLA LETTURA. (number).aspect_rationumber).viewmatrix4).projectionmatrix4).Esistono soluzioni per telecamere realizzate dalla comunità che implementano funzionalità comuni come lo scuotimento dello schermo, l’inseguimento degli oggetti di gioco, la conversione dalle coordinate dello schermo a quelle del mondo e molto altro. Puoi scaricarle dall’Asset Portal di Defold: