Lo spazio affiancato 3D ha visto un piano alla volta; concetti generali da capire mentre si programma questo?

2

Non sto chiedendo a qualcuno di programmare questo per me, mi piacerebbe comunque fare tutta la programmazione, tuttavia ho bisogno di qualche altro background di programmazione matematica per questo genere di cose, perché non mi sono davvero dilettato in spazi 3D molto e Sto pensando che molti potenziali if e thens potrebbero essere semplificati se penso a questo concetto nel modo giusto. Utilizzerò un linguaggio di programmazione che supporta l'output di retinatura 2D o di testo (si pensi a Java). Voglio sapere se ci sono modi semplici per programmare nella visualizzazione, orientarsi e muoversi su questo spazio virtuale che sto per descrivere senza ricorrere a molte istruzioni switch per controllare cioè ciò che lo schermo mostrerà a seconda della posizione del PC, di fronte direzione e rotazione.

Va bene finora sto elaborando concetti di un modo per esplorare un ambiente di tipo labirinto top-down 3D con un paesaggio voxel generato proceduralmente e un personaggio giocatore 1x1x1 che può visualizzare solo il piano del livello degli occhi e l'unità del piano 1 al di sotto . il PC può muoversi nei seguenti modi; Si prega di notare che intendo in qualsiasi modo il PC considera in basso quale direzione la gravità agisce su di essa, (non realistico):

  • Cammina in avanti verso un altro quadrato non ostruito da un muro o un dirupo
  • Ruota la faccia in un'altra direzione, nel qual caso una diversa direzione diventa la faccia anteriore del PC (visivamente). Il PC sembrerà sempre rivolto verso l'alto per l'utente.
  • Inizia a ridimensionare un muro, nel qual caso la direzione precedente verso l'alto (fuori dallo schermo, verso l'utente) diventa diretta.
  • Scalare e ridimensionare il muro di una fossa sottostante, nel qual caso la direzione verso il basso diventa avanti.
  • Scivolare sottosopra e legare il soffitto ora, salendo in su o in giù fino al momento in cui il PC colpisce un pavimento. nel qual caso può scegliere nuovamente altre modalità di trasporto.
  • Ogni volta che il PC si sposta, tutte le altre entità hanno la possibilità di spostarsi in una modalità basata su turni.

Questo non sarà come una sandbox di Minecraft, quindi la modifica del panorama dopo generazione non sarà probabilmente necessaria. Avrò uno schermo che visualizza voxel 16x16x2 alla volta. Mi piace comunque l'idea di blocchi allocati dinamicamente. Pianifico di generare o caricare blocchi di voxel 16x16x16 generati in precedenza e 26 blocchi adiacenti secondo necessità. durante lo scaricamento dei blocchi di intervalli e salvarli in un file. Voglio conoscere le idee matematiche / concettuali dietro la generazione di questi blocchi e il caricamento di blocchi già generati. Nota Uso ancora il termine voxel anche se li visualizzerò solo come quadrati su una schermata di testo, perché lo spazio di gioco è una griglia 3D.

    
posta 0xFFF1 24.05.2013 - 05:49
fonte

1 risposta

1

Ci saranno 24 diversi orientamenti per il tuo personaggio. Quindi sicuramente non vuoi seguire le istruzioni if / then / else.

Se descrivi il tuo orientamento del personaggio come una matrice 3x3 (costituita da 0, 1 e -1), ogni tipo di turno si ottiene moltiplicando quella matrice per una matrice di rotazione (anche 0,1 & -1).

La matrice di orientamento

Considera un sistema di assi ortonormali positivi X'Y'Z ', descrivendo l'orientamento del tuo personaggio nel tuo mondo 3D. In genere, X 'indica i caratteri correttamente. Y 'punterebbe verso l'alto (dalla prospettiva dei personaggi) e Z' punterebbe all'indietro. (avanti sembrerebbe più logico, ma quello non sarebbe un sistema destrorso.)

Questi 3 vettori costituiscono le colonne della matrice di orientamento 3x3.

Nota che devi ancora tenere traccia della posizione dei personaggi separatamente.

Rotazioni

Ogni volta che il personaggio fa un turno, la sua matrice di orientamento cambia. Questo può essere ottenuto attraverso le matrici di rotazione. Per eseguire la rotazione, moltiplichi la matrice di rotazione con un vettore, o in questo caso con l'intera matrice di orientamento:

NewOrientationMatrix = RotationMatrix * OldOrientationMatrix

Per descrivere tutte le possibili rotazioni di 90 gradi attorno agli assi principali X, Y e Z, sono necessarie 6 matrici di rotazione.

ad es. Una rotazione di 90 gradi attorno all'asse Z, in senso orario quando si guarda contro la direzione Z positiva, sarebbe:

0 -1  0
1  0  0
0  0  1

Nota che queste matrici di rotazione sono specificate nello spazio assoluto (XYZ), non in X'Y'Z '.

Trasforma nel punto di vista dei caratteri

Supponiamo di avere un punto nello spazio 3D e vuoi sapere dove si trova questo punto, in relazione al tuo personaggio:

Per prima cosa sottraggo la posizione dei caratteri:

point - charactersPosition

Ora, vuoi decomporre questo vettore ai componenti X ', Y' e Z '. Per questo moltiplica con l'inverso (che in questo caso è la trasposizione) della tua matrice di orientamento:

relativePoint = Transpose(OrientationMatrix) * (point - charactersPosition)

Eg. Se il risultato è (3,0, -1), questo punto si trova a 3 unità di caratteri a destra, un'unità in avanti e stessa altezza.

    
risposta data 24.05.2013 - 13:57
fonte

Leggi altre domande sui tag