Torna indietro   Hardware Upgrade Forum > Software > Programmazione

MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
Wireless 2.4 GHz, Bluetooth 5.4, cancellazione attiva del rumore, design pieghevole e un'autonomia che mette in imbarazzo prodotti che costano il doppio. Le Maestro 500 non eccellono in nulla, ma offrono tutto. E a questo prezzo è difficile chiedere di più
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
Dopo anni di attesa e una lunga fase di sviluppo, Noctua entra nel mercato dei dissipatori a liquido AIO con la nuova serie NL-LC1. Forte dell'esperienza maturata nel raffreddamento ad aria, l'azienda austriaca promette di portare la propria filosofia fatta di qualità costruttiva, attenzione ai dettagli e silenziosità anche in questo segmento. Abbiamo provato il nuovo sistema per scoprire se riesce a distinguersi in un mercato ormai molto competitivo.
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Arrivato sul mercato italiano a fine marzo, la serie Boox Go 10.3 (Gen II) offre Android 15, penna da 4096 livelli e retroilluminazione opzionale (nel modello da noi provato, Lumi, presente). La serie si compone di due tablet ePaper che fanno da e-reader, blocco note digitale e persino browser, tutto a un prezzo che fa dimenticare i prodotti di brand più blasonati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-11-2006, 16:08   #1
PUMA81
Senior Member
 
L'Avatar di PUMA81
 
Iscritto dal: Sep 2004
Messaggi: 404
Texture in Java 3D

Salve a tutti, avrei bisogno di un aiutino...
Come faccio ad applicare una texture su un'altra? mi spiego meglio: ho un parallelepipedo dove ho applicato una texture di mattoni e adesso vorrei applicare in un punto specifico una texture per le finestre. Come si fa?
Grazie e ciao.
PUMA81 è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2006, 11:41   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se usi almeno la versione 1.3 (siamo alla 1.4 è in dirittura d'arrivo la 1.5) puoi passare per:

setSubImage(java.awt.image.RenderedImage image, int width, int height, int srcX, int srcY, int dstX, int dstY)

di ImageComponent2D.

setSubimage è l'omologo dell'openg-elliano glTexSubimage2D
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2006, 09:35   #3
PUMA81
Senior Member
 
L'Avatar di PUMA81
 
Iscritto dal: Sep 2004
Messaggi: 404
Non sono molto pratico, potresti spiegarti meglio?
Questo è quello che io ho scritto:


Appearance appB = new Appearance();
TextureLoader tl = new TextureLoader("muro.jpg",null); //Applico una textura in maniera ripetuta
TextureAttributes myTex = new TextureAttributes();
Transform3D myT = new Transform3D();
myT.set(4.0);
myTex.setTextureTransform(myT);
Texture tex = tl.getTexture();
appB.setTextureAttributes(myTex);
appB.setTexture(tex);


//Crea l'aspetto del piano
Appearance appear=new Appearance();

//Carica la texture
TextureLoader loader=new TextureLoader("finestra.jpg",null);
ImageComponent2D image=loader.getImage();

//Crea la texture
Texture2D texture=new Texture2D(Texture.BASE_LEVEL,Texture.RGBA,image.getWidth(),image.getHeight());
texture.setImage(0,image);

//Crea un piano
QuadArray plane=new QuadArray(4,GeometryArray.COORDINATES|GeometryArray.TEXTURE_COORDINATE_2);
Point3f p=new Point3f(-1.0f,1.0f,0.0f);
plane.setCoordinate(0,p);
p.set(-1.0f,-1.0f,0.0f);
plane.setCoordinate(1,p);
p.set(1.0f,-1.0f,0.0f);
plane.setCoordinate(2,p);
p.set(1.0f,1.0f,0.0f);
plane.setCoordinate(3,p);

TexCoord2f q=new TexCoord2f(0.0f,1.0f);
q.set(0,1);
plane.setTextureCoordinate(0,0,q);
q.set(0,0);
plane.setTextureCoordinate(0,1,q);
q.set(1,0);
plane.setTextureCoordinate(0,2,q);
q.set(1,1);
plane.setTextureCoordinate(0,3,q);


//Imposta la texture nell'aspetto
appB.setTexture(texture);


Come faccio a "mettere" la finestra?
Grazie e ciao
PUMA81 è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2006, 12:51   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ho fatto zic anzichè zac col registro di windows e al momento sono un po' precario. Ti "indirizzo".

Allora, tex è la texture del muro e image è lo ImageComponent2D della finestra.

Quello che dovresti fare è copiare "image" nell'ImageComponent2D di "tex".

Codice:
ImageComponent2D texImage = (ImageComponent2D)tex.getImage(0);
RenderedImage windowImage = image.getRenderedImage();
textImage.setSubImage(
    windowImage,
    altezzaFinestra,
    larghezzaFinestra,
    0, 0, //"origine" della porzione di finestra da copiare
    posizioneXFinestraSullImmagineDelMuro,
    posizioneYFinestraSullImmagineDelMuro);
Teoricamente non fa una piega ma al momento non posso fare una prova preliminare.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 14-11-2006, 22:23   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
PUMA81, ti rispondo "al pubblico ludibrio".

Supponendo di avere due immagini, wall.png e window.png, appiccico window su wall.

Codice:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.imageio.*;
import com.sun.j3d.utils.universe.*;

public class Main extends WindowAdapter implements Runnable {

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Main());
	}

	private Frame frame = new Frame("3D");
	private Canvas3D canvas;

	public void run() {
		int vertexFormat = 
			GeometryArray.COORDINATES |
			GeometryArray.NORMALS |
			GeometryArray.TEXTURE_COORDINATE_2;
		float[] coords = {
			0, 0, 0,
			1, 0, 0,
			1, 1, 0,
			0, 1, 0,
		};
		//Dritto negli occhi (z+)
		float[] normals =  {
			0, 0, 1,
			0, 0, 1,
			0, 0, 1,
			0, 0, 1,
		};
		//U = X + Z
		//V = Y
		float[] uv = {
			0, 0,
			1, 0,
			1, 1,
			0, 1,
		};
		QuadArray tile = new QuadArray(4, vertexFormat);
		tile.setCoordinates(0, coords);
		tile.setNormals(0, normals);
		tile.setTextureCoordinates(0, 0, uv);

		/* Il muro */
		BufferedImage wallImage = getImage("/wall.png"); //64*64
		/* La finestra */
		BufferedImage windowImage = getImage("/window.png"); //16*32

		/* ImageComponent2D del muro... */
		ImageComponent2D wallImageComponent = 
			new ImageComponent2D(ImageComponent.FORMAT_RGB, wallImage);
		
		/* Spiaccica la finestra sul muro... */
		wallImageComponent.setSubImage(
			windowImage,
			windowImage.getWidth(),
			windowImage.getHeight(),
			0,
			0,
			24,
			4);

		/* Crea la texture del muro (che ha la finestra appiccicata) */
		Texture2D wallTexture = new Texture2D(
			Texture2D.BASE_LEVEL,
			Texture2D.RGB,
			wallImage.getWidth(),
			wallImage.getHeight());

		/* Imposta la texture del muro al livello mip map 0 */
		wallTexture.setImages(new ImageComponent[] { wallImageComponent });

		/* Multitexturing... con una texture sola =) */
		TextureUnitState wallTextureUnit = new TextureUnitState();
		wallTextureUnit.setTexture(wallTexture);
		TextureUnitState[] stateArray = { wallTextureUnit };

		Appearance tileApp = new Appearance();
		tileApp.setTextureUnitState(stateArray);

		Shape3D tileShape = new Shape3D(tile, tileApp);

		Transform3D tileLocation = new Transform3D();
		tileLocation.setTranslation(new Vector3d(-0.5f, -0.5f, -5));
		TransformGroup tileGroup = new TransformGroup(tileLocation);
		tileGroup.addChild(tileShape);

		Background bg = new Background(new Color3f(0.5f, 0.5f, 0.5f));
		BoundingSphere bounds = new BoundingSphere(new Point3d(0, 0, 0), 1000);
		bg.setApplicationBounds(bounds);
		BranchGroup root = new BranchGroup();
		root.addChild(bg);
		root.addChild(tileGroup);
		root.compile();

		GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
		canvas = new Canvas3D(config);
		SimpleUniverse universe = new SimpleUniverse(canvas);
		universe.addBranchGraph(root);
		//universe.getViewingPlatform().setNominalViewingTransform();
		
		frame.addWindowListener(this);
		frame.setLayout(new GridLayout(1, 1));
		frame.add(canvas);
		frame.setSize(400, 400);
		frame.setVisible(true);
	}

	private BufferedImage getImage(String path) {
		try {
			return ImageIO.read(getClass().getResource(path));
		} catch(Exception ex) {
			throw new RuntimeException(ex);
		}
	}

	public void windowClosing(WindowEvent e) {
		System.exit(-1);
	}
	
}
Praticamente a te interessa solo la parte colorata, il resto è fuffa sperimentale.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 15-11-2006, 09:47   #6
PUMA81
Senior Member
 
L'Avatar di PUMA81
 
Iscritto dal: Sep 2004
Messaggi: 404
Grazie PGI-Bis, sei un grande!!!
E' quello che serviva a me
Ancora grazie e ciao.
PUMA81 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2006, 15:50   #7
PUMA81
Senior Member
 
L'Avatar di PUMA81
 
Iscritto dal: Sep 2004
Messaggi: 404
Ciao, volevo chiederti ancora una cosa, però non riguarda direttamente le texture...
Allora:

BoundingSphere bounds=new BoundingSphere(new Point3d(),1500.0);
ImageComponent2D image = new TextureLoader("cielo.jpg",this).getScaledImage(larg,altez);
//Aggiunge uno sfondo
Background background=new Background(image);
background.setApplicationBounds(bounds);
//aggiungiamo l'istanza dello sfondo alla scena 3D
objRoot.addChild(background);

Avrei creato un BoundingSphere e messo una immagine di sfondo.
Adesso nella mia applicazione ho il terreno e subito attaccato il cielo.
Io vorrei fare una cosa un pochino più bellina e cioè mettere tra la terra e il cielo, ad esempio, delle montagne.
Ho provato a replicare ciò che ho scritto sopra passando diverse coordinate rispetto a quelle che passo nel getScaledImage() ma non va, cioè visualizzo solo la prima immagine caricata.
Volevo chiederti: è possibile fare quello che ti ho appena descritto??

Grazie e ciao.
PUMA81 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2006, 16:00   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non puoi usare come sfondo un'immagine in cui ci siano già sia le montagne che il cielo?
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2006, 16:35   #9
PUMA81
Senior Member
 
L'Avatar di PUMA81
 
Iscritto dal: Sep 2004
Messaggi: 404
Quote:
Originariamente inviato da PGI-Bis
Non puoi usare come sfondo un'immagine in cui ci siano già sia le montagne che il cielo?
Dici che mi conviene??
ma se volessi fare come ti ho scritto è molto complicato??
Il fatto è che la nostra applicazione è sospesa nella sfera e al di sotto di essa si vede tutto cielo...
magari volevo provare a mettere un'immagine che si adattava bene all'applicazione...
cmq se dici che non ne vale la pena...
PUMA81 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2006, 16:43   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
So che esiste la possibilità di fare "sfondi carini" usando delle geometrie come sfondi ma non conosco la teoria che ci sta dietro per cui direi al 101% una cialtroneria .
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2006, 17:28   #11
dupa
Senior Member
 
L'Avatar di dupa
 
Iscritto dal: Jan 2002
Città: Napoli
Messaggi: 1727
Quote:
Originariamente inviato da PGI-Bis
So che esiste la possibilità di fare "sfondi carini" usando delle geometrie come sfondi ma non conosco la teoria che ci sta dietro per cui direi al 101% una cialtroneria .
ma senti un po' ma di che ti occupi? ne sai di ogni linguaggio e di tutte le librerie possibili e immaginabili
__________________
Se buttassimo in un cestino tutto ciò che in Italia non funziona cosa rimarrebbe? Il cestino.
dupa è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Google Home Speaker ufficiale: è il prim...
Spotify: i nomi utente stanno per divent...
Il limite vero dei data center AI sono g...
AMD conferma i nuovi Threadripper: Zen 6...
Stop all'ADSL per WindTre: continua la m...
HPE punta sull'IA agentica e dichiara gu...
macOS avvisa quando si incolla un comand...
Everpure ridisegna lo storage per l’IA: ...
NVIDIA RTX Remix 1.5: realizzare remaste...
Come configurare Windows 11 like a pro, ...
Windows 11 cambia finalmente la gestione...
Arianespace: lanciata la missione Amazon...
iPhone 17 escluso dalle funzioni AI più ...
Rokarolla, il trojan Android che ruba cr...
Qwen-Robot Suite: la strategia di Alibab...
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: 16:33.


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