Implementace Z-Buffer – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Implementace Z-Buffer – Java – Fórum – Programujte.comImplementace Z-Buffer – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Yimo0
Newbie
23. 2. 2014   #1
-
0
-

Ahoj,
už cca 14 dní se snažím vyřešit implementaci algoritmu Z-Buffer, ale jediné co se mi povedlo je vytvořit drátěný model objektu (čtverec, trojúhelník, ....) + rotaci, zoom, scale, atp....

Vím, že tam má být takovýhle code:
 

public void drawPixel(int x, int y, int z, RGB rgb) {
    if (z < zbuffer[y][x]) {
        pixels[y][x] = rgb;
        zbuffer[y][x] = z;
    }
}

Ale opravdu nedokážu pochopit jak to tam dát, či jak to s tím vlastně souvisí.
Nevím, zda jsem vůbec řekl s čím potřebuji pomoc.... V podstatě se snažím o obarvení krychle, trojúhelníku pomocí Z-Bufferu, jen nevím jak..(Mám jen ten drátěný model).

Drátěný model => mám vertex a index list.... a pomocí něho pak vykreslím ten objekt.. samozřejmě pomocí pár úprav a poté dehomogenizaci.. atp..

Najde se tu nějaká dobrá duše, která by mi dokázala pomoc ? Nevím, zda odkázání na nějaký článek nebo tak mi pomůže(přečetl jsem už asi půlku googlu...)... Spíše bych potřeboval "code kick".

Budu rád za jakoukoliv radu, která mi pomůže dokončit projekt.
Díky

Nahlásit jako SPAM
IP: 93.99.204.–
Reklama
Reklama
Flowy0
Věrný člen
23. 2. 2014   #2
-
0
-

Z je tretia suradnica v 3D priestore (x, y, z) ... zbuffer je pamet pre tieto suradnice presne tak isto ako si ukladas farbu pre kazdy pixel si ukladas z polohu pre kazdy pixel (alebo plochu zalezi na implementacii) ... najprirodzenejsie bude asi ak umiestnis pozorovatela do bodu z=0 a to co je pred nim bude mat kladne Z a to co je za nim zaporne potom vo vysledku je z vlastne kolma vzdialenost od pozorovatela (ak vylucime zaporne vzdialenosti)

pre vylucenie zapornych vzdialenosti pridas do tvojho kodu tiez podmienku aby z bolo viac ako 0 ... a Z vlastne zistis podla nejakeho vzorca pre plochu alebo uz cokolvek co potrebujes vykreslit ... vysledkom pouzitia z bufferu je ze kazdy objekt (bod alebo plocha) bude mat nastavene svoju z suradnicu a teda tie ktore su blizsie k pozorovatelovy sa budu vykreslovat a prekryju tie vzdialenejsie

moj starsi kod pouzitia z bufferu pre vykreslenie gule (v zasade to iste ako mas ty len so vzorcami pre gulu)

	float[][] zBuffer;
	final float zBufferNull = -1f; //prirodzenejsie bude ak pouzijes maximalnu vzdialenost do ktorej vykreslujes (pouzijes ju pri inicializacii a vsetko co je za touto vzdialenostou prosto nevykreslis)

	public void addGlobe(int gx, int gy, int gz, int r, Color globeColor) {
		double zDiff;
		for (int x = 0; x < bufImg.getWidth() ; x++) {
			for (int y = 0; y < bufImg.getHeight(); y++) {

				//in fact - it calculates the positive (cause of squared) z coordinate - its on diversed side of globe
				zDiff = Math.pow(r, 2) - Math.pow(x-gx, 2) - Math.pow(y-gy, 2);
				if (zDiff > 0) {
					//distance of center of globe - z coordinate of point on globe
					zDiff = gz - Math.sqrt(zDiff);

					if (zDiff >= 0 && (zBuffer[x][y] == zBufferNull || zDiff < zBuffer[x][y]) ){
						zBuffer[x][y] = (float) zDiff;
						//pomer svetlosti farby //vtedy som este nepoznal dostatocne phongov model
						zDiff = (gz-zDiff)/r;
						putPixelNoDraw(x, y, new Color (
								(int) (globeColor.getRed() * zDiff),
								(int) (globeColor.getGreen() * zDiff),
								(int) (globeColor.getBlue() * zDiff)
								));
					}
				}
			}
		}
	}
Nahlásit jako SPAM
IP: 95.102.43.–
https://github.com/Flowy
Yimo0
Newbie
1. 3. 2014   #3
-
0
-

Ahoj,
trochu jsem v tom pokročil a myslím, že se mi to povedlo :-)
Nic méně chtěl bych se zeptat, zda nevíte, jak to předělat na Textury.
Teď se mi strany obarví jen barvami, ale chtěl bych to předělat na mapování textury.

našel jsem, že se musí do podmínky přidat něco takové ho
  

x1uv = (a.uv.mul(1 - s1)).add(b.uv.mul(s1));
x2uv = (a.uv.mul(1 - s2)).add(c.uv.mul(s2));

if (z < this.zBuffer[x][y])
{
      Vec2D uv = (x1uv.mul(1 - t)).add(x2uv.mul(t));    
      
      img.setRGB(x, y, textura.getRGB(int(uv.x * sirkaTex), int(uv.y *        vyskaTex)));
      this.zBuffer[x][y] = z;
}

Ale jaksi netuším kde přesně vzít ten bod "a.uv, b.uv"....S1 a S2 už mám ... ....
Když tam zkusím dát jakýsi "proměnlivý" bod, tak se objekt pohybuje v textuře, ale ne aby se textura namapovala na ten objekt... a fakt mě nenapadá co musím udělat aby se to namapovalo :X

Nemáte nějaké rady ? Třeba co jsou zač ty body a.uv, b.uv ?  To by asi hodně pomohlo :D
Díky :)
 

Nahlásit jako SPAM
IP: 93.99.204.–
Flowy0
Věrný člen
2. 3. 2014   #4
-
0
-

z buffer je cisto o tom ze sa z suradnice uklada do nejakej pamete a potom sa podla toho urcuje co je najblizsie a teda co ma byt vykreslene ... to akym sposobom zistis tu z suradnicu alebo akym sposobom ju pouzijes z buffer neriesi cize tvoja otazka by mala smerovat skor na to ako pouzivat textury (a podla toho hladat odpoved na tvoju otazku) ... uv.x a uv.y vyzera byt real 0 az 1 pre urcenie pozicie v texture ale tie ostatne premenne su strasne slabo zdokumentovane (vecsinou pouzite len raz - hlavne s1,s2,t) a zistovat co tym autor myslel nedava zmysel (jednoduchsie bude implementovat to nanovo)

Nahlásit jako SPAM
IP: 95.102.43.–
https://github.com/Flowy
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 38 hostů

Podobná vlákna

3D projekce - Z-buffer — založil linarts

Klavesnicový buffer — založil Grungy

Uart buffer — založil davixxx

Buffer operačního systému — založil Matěj Andrle

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý