Come implementare il rilevamento delle collisioni dei portali?


12

Ad esempio, prendi questo scenario (scusa le mie orribili abilità di disegno): Immagine

Questo si basa sul "Portale", dove lo stickman sta attraversando il portale blu (che è collegato al portale rosso), ma c'è un muro che lo ferma sul portale rosso. Pertanto non può passare completamente attraverso il portale.

Quindi la mia domanda è questa: come faccio a rilevare la fisica / collisione con loro? Divido il giocatore? C'è un modo per collegarli? Ci sono motori fisici che supportano questo? In caso contrario, come ne farei uno?


Per quanto ne so spiegano alcune cose nel commento degli sviluppatori di Portal 1.
Archy,


@ Byte56, grazie, ho aggiornato il mio post. Penso che questo dovrebbe chiarire di più :)
MiJyn

1
Penso che la situazione che descrivi sia molto rara nel portale (se mai dovesse accadere) poiché i portali non sono posizionamenti flottanti. Sono posizionati su pareti e solo pareti specifiche. Non ricordo una situazione in cui sono stato in grado di posizionare un portale, ma incapace di attraversarlo a causa di un'ostruzione all'altra estremità del portale. Immagino che potresti creare una copia temporanea del giocatore in entrambe le posizioni per il periodo di transizione.
MichaelHouse

2
@ Byte56: non devi ricordare molto. Ricordo che ciò avveniva nel Portale 1. Mi sembra di ricordare un'area schiacciante in cui si poteva usare un portale per evitare di morire. Scontrarsi con cose vicino ai portali è un evento comune e il motore lo gestisce facilmente.
Nicol Bolas,

Risposte:


7

Il gioco Portal ha un modo carino con cui hanno risolto questo problema:

Il giocatore passa attraverso il portale di origine (blu) e viene visto sporgere dal portale di destinazione (arancione). Il giocatore viene copiato sul portale di destinazione e visto attraversarlo. Il gioco rende l'immagine che vedi guardando attraverso il portale di origine usando una seconda telecamera e render-to-texture.

Tuttavia, la copia del giocatore nella posizione di destinazione non interagisce con la fisica. È lì solo per scopi di rendering. Al contrario, creano oggetti di collisione virtuali sull'altro lato del portale di origine e fanno invece collidere il giocatore con quello. Questo semplifica la fisica.

Hai solo bisogno di quegli oggetti virtuali per quanto il giocatore può raggiungere senza passare completamente attraverso il portale. Non appena il giocatore passa completamente attraverso il portale, la situazione si inverte.

Un'immagine per illustrare : il portale blu è il portale di origine, il portale arancione il portale di destinazione. La casella bianca tratteggiata è l'oggetto di collisione virtuale, mentre la casella reale è l'oggetto renderizzato. Il giocatore (con il punto rosso) interagisce solo con gli oggetti direttamente attorno ad esso. Gli oggetti sul portale arancione vengono completamente ignorati.

inserisci qui la descrizione dell'immagine


4
" utilizzo di una seconda fotocamera e rendering-to-texture " Il commento degli sviluppatori su Portal 1 ha esplicitamente affermato che non usano il rendering-to-texture, perché non ha funzionato bene per le loro esigenze (in particolare con la visualizzazione di portali da altri portali ). Al contrario, sostanzialmente trasformano una versione del mondo dall'altra parte del portale e semplicemente rieseguono il rendering.
Nicol Bolas

Caspita, questo risponde a quasi tutto! Mi sto solo chiedendo, funziona dal portale essere un buco con oggetti all'interno?
MiJyn

6

Ecco come proverei a farlo.

Mentre sei all'interno di un portale ci sarebbero due copie del giocatore nel motore fisico. Ogni copia ignora tutte le collisioni che si trovano sul lato opposto del portale, quindi si combinano i risultati e si applicano i risultati della simulazione a entrambi i modelli.

Idealmente, dovresti applicare la gravità separatamente per ogni metà del giocatore, ma potresti riuscire a cavartela semplicemente applicandola per il lato del portale su cui si trova il centro di massa del giocatore.

Per ignorare quelle collisioni è necessario impostare un volume appropriato e verificare se un punto è al suo interno. Un cilindro (forse allungato verticalmente) sembrerebbe essere una buona opzione. Il test è quindi qualcosa di simileif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();

Credo che la maggior parte dei motori fisici abbia un sistema per filtrare ciò con cui un oggetto può scontrarsi, quindi dovrebbe essere possibile utilizzare un motore fisico standard. Ad esempio http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering

Per combinare i risultati, l'opzione più semplice sarebbe probabilmente quella di aggiungere una sorta di vincolo inflessibile tra i due e lasciare che il motore fisico lo gestisca.


Hmm, okay, come potrei farlo? Ricevo la parte sulla copia del lettore, ma a parte questo, sono all'oscuro. Come ignorerei le collisioni dalla parte opposta? Come potrei anche combinare i risultati?
MiJyn

Ho modificato alcuni dettagli.
Adam

grazie, ci penserò su e rispondo più tardi una volta che me lo sarò messo in testa :)
MiJyn

Grazie mille, la tua risposta e la risposta di Virtlink alla mia domanda :) Ora per decidere quale impostare la "risposta corretta" su ...
MiJyn

4

Come calcolerei fino a che punto il giocatore scende?

Perché vorresti farlo? Non è necessario calcolare fino a che punto un giocatore "scende"; scoprirai quanto scende mentre l'oggetto passa attraverso la simulazione.

Come potrei anche collegare i portali?

Un portale, dal punto di vista puramente in-game, è poco più di un elaborato teletrasporto che fa casini con la collisione per trasformare oggetti collezionabili in oggetti non collidabili. Quando un oggetto tocca il portale, inizia potenzialmente a scontrarsi con cose dall'altra parte. Quando l'oggetto passa "abbastanza lontano" attraverso il portale, lo si teletrasporta effettivamente all'altro, modificando istantaneamente la sua posizione e orientamento.

La fisica procede semplicemente normalmente.


When an object touches the portal, it starts potentially colliding with things on the other sidesi, esattamente. Come lo farei con un motore fisico? Immagino fosse la mia domanda :)
MiJyn il

@MiJyn: scrivi un motore fisico che può farlo. Valve ha dovuto essenzialmente interrompere il motore di origine per far funzionare il portale. Nessun motore di fisica commerciale o open source può farlo naturalmente. C'è un motivo per cui, nonostante la popolarità di Portal, non ci sono decine di cloni di Portal sul mercato.
Nicol Bolas,

interessante, perché ci sono molti altri giochi che hanno meccaniche molto simili (vedi anche la mod TARDIS per Minecraft). Sono sicuro che ci deve essere un modo per farlo facilmente.
MiJyn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.