Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-07-2004, 00:03   #1
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Java - OpenGL: 1 = 0.333 ???

Non trovo neanche le parole per spiegarlo. Al 99.9 percento mi sono perso in un bicchier d'acqua, tuttavia sto affogando e allora... HELP.

Ecco cosa succede:

in OpenGL creo una cassa di 1x1x1 e la posizione nel punto (0,0,0)

a questo punto creo una seconda cassa, sempre di 1x1x1. Per non sovrapporla all'altra trasformo le sue coordinate spostandola di 1 lungo l'asse delle X, direzione positiva. Transformo pertanto il solido aggiungendo il vettore (1, 0, 0) ad ogni suo punto.

Logico, no? No, perchè per spostare una cassa lunga 1 di 1 devo aggiungere 0.3 periodico...

Quello che non capisco è perchè diavolo se il cubo è alto una unità e viene visualizzato come alto una unità, per spostarlo di una unità devo aggiungere-togliere 0.3333.

Il codice per la trasformazione dei 4 vertici (v0, v1, v2, v3, "tuple" da 3 float) mi sembra ok:
Codice:
public final void translate(final float x, final float y, final float z) {
	v0.x += x;
	v0.y += y;
	v0.z += z;
		
	v1.x += x;
	v1.y += y;
	v1.z += z;
		
	v2.x += x;
	v2.y += y;
	v2.z += z;
		
	v3.x += x;
	v3.y += y;
	v3.z += z;
}
eppure non mi pare di aver letto di questa stranezza nei vari blue-red book...

aita, aita!

Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2004, 02:59   #2
Mason
Senior Member
 
L'Avatar di Mason
 
Iscritto dal: Nov 2002
Città: Morbegno (SO)
Messaggi: 1410
Quote:
Logico, no? No, perchè per spostare una cassa lunga 1 di 1 devo aggiungere 0.3 periodico...
O_o
o_O

una scatola lunga 1 di 1 e' lunga 1, usa cubo unitario, non scatola di 1 x 1 x 1
per spostarla la trasli, non ci aggiungi 0.3 peridoico

di solito si procede cosi in open gl

setti modelviev
resetti la matrice
gli setti tramite una glTranslate di quanto vuoi traslare(tramite il vettore di traslate supposto 1 0 0)
gli passi la primitiva del cubo.

supposto tutto l'init di opengl sia +o- giusto

prendi con calma, mi sembra stia facendo un po di confusione

cmq dai un occhio ai tutorial di nehe, se leggi leggi il red book, il bluebook sono le man pages.

cmq posta al max tutto il codice o mettilo da qualche parte, la procedura che hai messo non e molto esplicativa
__________________
e' difficile cio' che non si conosce
Tic Tac
Andrew Morton, 15/02/2008 LKML:"`tmp' is an awful identifier, and renaming it to `temp' hardly improves it."
Mason è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2004, 10:52   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Giusto... Dovresti usare glTranslate per spostarla
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2004, 13:56   #4
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
grazie per essere venuti in soccorso.

Per l'init ho usato il codice di Nehe (la svista è sempre dietro l'angolo ma mi sembra sia ok).

Posto quelle parti di codice che, nell'ordine, compongono la scena (i nomi dei metodi chiamati su "gl" corrispondono alle funzioni OpenGL)

inizializzazione di OpenGL

Codice:
	public final void init(GLDrawable drawable) {
		System.out.println("INIT");
		GL gl = drawable.getGL();
		GLU glu = drawable.getGLU();
		
		gl.glShadeModel(GL.GL_SMOOTH);
		gl.glClearColor(0f, 0f, 0f, 0f); // sfondo nero
		gl.glClearDepth(1f); //buffer di profondità
		gl.glEnable(GL.GL_DEPTH_TEST);
		gl.glDepthFunc(GL.GL_LEQUAL);
		gl.glEnable(GL.GL_TEXTURE_2D);
		// prospettiva migliore
		gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
sempre nell'init, di seguito, creo un "muro" ed un "tetto"
Codice:
                //muro
		box = new Box(10, 3, 1);
		box.mulTexCoords(10, 3, Box.FACE_BACK | Box.FACE_FRONT);
		box.mulTexCoords(1, 3, Box.FACE_RIGHT | Box.FACE_LEFT);
		box.setTexture(texture1);
		boxes.add(box);

		//tetto
		Box box4 = new Box(10, 0.1f, 10);
		box4.translate(0, WeirdMath.weirdUnit(3), WeirdMath.weirdUnit(10));
		box4.mulTexCoords(10, 10, Box.FACE_TOP | Box.FACE_BOTTOM);
		box4.setTexture(texture3);
		boxes.add(box4);
Quel "WeirdMath.weirdUnit(3)" moltiplica 3x0.333. Il primo oggetto (box) è alto 3. Per piazzargli sopra il secondo dovrei "alzarlo" di 3. Nel mio mondo tutto strano devo alzarlo di 3x0.333.

Il ciclo di rendering poi è breve. "boxes" è una lista di tutti gli oggetti "Box" da visualizzare:

Codice:
	public final void display(GLDrawable drawable) {
		GL gl = drawable.getGL();
		GLU glu = drawable.getGLU();
		gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
		gl.glLoadIdentity();
		
		time1 = System.currentTimeMillis();
		dTime = time0 - time1;
		
		player.update(dTime);
		
		gl.glRotatef(360 - player.getYAngle(), 0, 1, 0);
		gl.glTranslatef(-player.getX(), -player.getY(), -player.getZ());
		
		for(Box b : boxes) {
			if(player.distanceSquare(b.getLocation()) < 400f)
				b.draw(gl);
		}
		time0 = time1;
	}
La fantomatica classe Box è un parallelepipedo. Incollo la parte significativa.

Codice:
	public Box(float x, float y, float z) {
		bound = new RectBound2f(0, 0, x, z);
		
		Tuple3f v0 = new Tuple3f(0, 0, 0);
		Tuple3f v1 = new Tuple3f(x, 0, 0);
		Tuple3f v2 = new Tuple3f(x, y, 0);
		Tuple3f v3 = new Tuple3f(0, y, 0);
		Tuple3f v4 = new Tuple3f(0, y, -z);
		Tuple3f v5 = new Tuple3f(x, y, -z);
		Tuple3f v6 = new Tuple3f(x, 0, -z);
		Tuple3f v7 = new Tuple3f(0, 0, -z);
		
		faces[0] = new Quad(v1, v2, v0, v3);
		faces[1] = new Quad(v6, v5, v1, v2);
		faces[2] = new Quad(v7, v4, v6, v5);
		faces[3] = new Quad(v0, v3, v7, v4);
		faces[4] = new Quad(v1, v6, v0, v7);
		faces[5] = new Quad(v2, v5, v3, v4);
	}
	
	public void setTexture(int texture) {
		this.texture = texture;
	}
	
	public void draw(GL gl) {
		if(texture >= 0)
			gl.glBindTexture(GL.GL_TEXTURE_2D, texture);
		faces[0].draw(gl);
		faces[1].draw(gl);
		faces[2].draw(gl);
		faces[3].draw(gl);
		faces[4].draw(gl);
		faces[5].draw(gl);
	}
anche Quad non ha molta fantasia:

Codice:
	public Quad(Tuple3f v0, Tuple3f v1, Tuple3f v2, Tuple3f v3) {
		this.v0 = v0;
		this.v1 = v1;
		this.v2 = v2;
		this.v3 = v3;
		
		t0 = new Tuple2f(1, 0);
		t1 = new Tuple2f(1, 1);
		t2 = new Tuple2f(0, 0);
		t3 = new Tuple2f(0, 1);
	}
	
	public final void draw(GL gl) {
		gl.glBegin(GL.GL_TRIANGLE_STRIP);
		gl.glTexCoord2f(t0.x, t0.y);
		gl.glVertex3f(v0.x, v0.y, v0.z);
		
		gl.glTexCoord2f(t1.x, t1.y);
		gl.glVertex3f(v1.x, v1.y, v1.z);
		
		gl.glTexCoord2f(t2.x, t2.y);
		gl.glVertex3f(v2.x, v2.y, v2.z);
		
		gl.glTexCoord2f(t3.x, t3.y);
		gl.glVertex3f(v3.x, v3.y, v3.z);
		gl.glEnd();
	}
Non uso glTranslate per le "casse" perchè vorrei definire lo spostamento una volta sola, anzichè inserire nel ciclo di rendering una trasformazione per ogni oggetto Box. Il costruttore di Box crea una "cassa" (insisto ) di lunghezza (x, y, z) inizialmente collocata nel punto (0,0,0). Potrei benissimo definire un costruttore che permetta di specificare il punto di partenza anzichè trasformare le coordinate successivamente alla creazione (e sono quasi certo che lì 1 sarebbe uguale a 1 e non a 0.33), ma non riesco a capire perchè la trasformazione successiva (è il metodo "translate" che ho postato precedentemente e che appartiene alla classe Quad) dia quel bizzarro risultato.

aita2.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2004, 00:19   #5
Mason
Senior Member
 
L'Avatar di Mason
 
Iscritto dal: Nov 2002
Città: Morbegno (SO)
Messaggi: 1410
mm ho riletto il tuo msg tipo 4 volte ,sta cosa del 3*1/3 mi e stata di difficile comprensione

per il fatto di "cassa" figurati solo non quotarla piu io era solo perche trovavo buffo cassa 1x1x1, l'importante e capirsi nel definito, poi se li chiamano mucchepazze o metri poco cambia

alcune precisazioni, il cubo non e proprio centrato in 0,0,0 ma in x/2 ,y/2 ,0, per crearlo centrato devi cambiare le minime coordinate della primitiva a -x -y e -z al posto che 0, questo te lo dico perche' , pur essendo un trascurabile errore geometrico, mi fa sospettare che tu non abbia ben chiara la distinzione tra coordinate globali(o mondo) e coordinate locali.(ps il -z lo fai, perche non fai anche -z e -y?, strana primitiva )

con quella traslate, modificanod proprio i vertici dell oggetto, non l'oggetto, tu perdi il sistema di riferimento locale dell'oggetto, o per lo meno, lo fai conicidere col sistema mondo, quindi diventa poco significativo.

metti di avere un modello di bernarda:
la sua geometria interna e definita come un tot di vertici attorno ad un suo centro
questo e il centro del sistema di riferimento locale

ora mettiamo sta bernarda in uno spazio e volgiamo che la bernarda si sposta in 2,2,0.

metti ora di volere ruotare la bernarda di 90 risp a z
settata la matrice di rotazione, tu non puoi ruotare i punti che hai perche senno ruoteresti anche la distanza 2 dal centro del tuo mondo, quindi dovresti sottrarre 2,2,0 ruotare e poi ritraslare a 2,2,0.

incece di aggiungere a tutti i vertici bernarda all'inzio 2,2,0 costruiamo un vettore tras(per tenere in memoria per te la traslazione di questa istanza di bernarda,non per opengl),al inizio tras sara 0,0,0, quidni la modelview(supposta identita') non cambiera.
settata a 2,2,0 e comunicata a opengl tramite la transalte sara' piu o meno simile al tuo codice.
ora supponiamo di ruotare.
a me basta resettare la modelview e metterci nel ordine una rotare e poi traslare tramite il vect che avevo(supponi un altro vect per il rotate e uno scalare per lo scale). tu dovresti come detto sopra sottrarre prima ruotare e poi ritraslare

metti ora di voler ritraslare, ruotare rispetto a y(rispetto al suo punto) ritraslare
a me basta resettare la modelview, ruoto z, ruoto y (...), traslo il tutto in 5 linee di codice tipo
col tuo metodo dovresti tenere traccia di tutti i cambiamenti dei vertici se vuoi metterci un operazione in mezzo

e un po come se modificando la geometria dei punti bernardi aggiungendoci 2,2,0 modifichi proprio la classe berndarda, dicendo "tutte le bernarde sono distanti 2,2,0 dal centro", come idea.

giusto perche spiego(parlo) come mangiare pane e prociutto(parole di un mio prof) ti faccio un altro esempio di come vedo i 2 metodi.

per me e come se tu avessi un cubo di ferro sotto la mano sx,e vuoi spostarlo di un 50 cm piu a sx.
io ci vedo 2 metodi:
prendi l'oggeto in se e lo sposti di 50 cm.
prendi un martello e spsoti tutti gli atomi singolarmente del cubo di 50 cm.
il risultato sara' quello, tutti gli atomi del cubo son spostati di 50 cm, la strada per spostarli non proprio.

secondo me quello che fai tu e piu da geometria computazionale che da opengl con quella translate, e cmq ti consiglio per esercizio di passarla a matrice 4x4.

tornando al prob di questo 1/3 che gira e non si sa bene del perche' fai una cosa: posta tutto il codice tipo allegato se possibile , almeno eseguo proprio e non ci penso sopra troppo, anche perche sara il fascino del periodico nel 3 ma mi sembra molto strano(come dici anche tu mi pare).

ultima cosa, da quel player.getdistance<400 sembra tu voglia settare una profondita' massima di visualizzazione, in opengl ci son gia queste chiamate nella gluperspective o cmq nell primitive di proiezione.
__________________
e' difficile cio' che non si conosce
Tic Tac
Andrew Morton, 15/02/2008 LKML:"`tmp' is an awful identifier, and renaming it to `temp' hardly improves it."
Mason è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2004, 01:33   #6
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Grazie per aver avuto la pazienza di leggere il codice.

Il -z era un residuato bellico, prima erano tutti "-", avrebbero dovuto diventare tutti "+", ho perso un pezzo per strada.

Potrei applicare la trasformazione nel ciclo di rendering associando ad ogni oggetto 3D un secondo oggetto Transform usandolo poi come riferimento per glTranslate & rotate tuttavia così facendo introduco 4 operazioni per oggetto ad ogni passaggio nel ciclo di rendering, per visualizzare elementi di cui conosco in partenza le coordinate finali e la cui posizione non sarà modificata (salvo le trasformazione globali, ma mi viene più facile pensare che sia il giocatore a muoversi e non tutto il mondo intorno al giocatore ).

E' lecito dire: "e perchè cavolo non costruisci direttamente l'oggetto a (x,y,z) anzichè a (0,0,0) per poi spostarlo a (x,y,z)?". Beh, perchè se lo costruisco direttamente a x,y,z...funziona, mentre se lo costruisco a 0 e poi lo sposto salta fuori quel malefico 0.3 periodico.

Adesso vedo un po' la questione delle coordinate locali e globali, forse ho fatto qualche trasformazione inconsapevole. Se non ne salto fuori posto una versione condensata di tutto il motore per centrare il problema.

Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Xbox Cloud Gaming arriva su Amazon Fire ...
Un blackout a San Francisco manda in til...
Windows 11 è diventato più...
Apple cambia strategia a causa della cri...
007 First Light: uscita rimandata di due...
Samsung Galaxy A37 e A57: il comparto fo...
DAZN lancia la sua offerta di Natale: My...
Gigabyte fa marcia indietro? Sparito il ...
Alcuni rivenditori giapponesi bloccano l...
Le feste non placano Amazon, anzi: aggio...
Roborock Q10 S5+ a un super prezzo: robo...
Formula sceglie WINDTRE BUSINESS per gar...
EXPO 1.20: AMD migliora il supporto all'...
MacBook Pro con chip M4, 24GB di RAM e 1...
Lefant M330 da 6.000Pa a 139€ o ECOVACS ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v