C++, Delphi, JAVA és egyéb programnyelvek

Started by ignus, 2007-06-05, 15:03:45

Previous topic - Next topic

Lt. Simoan Blarke

#90
Felveszel msn-re és lehetőségeimhez mérten segítek. 1 éve dolgozok ADA-val, valamennyire már értem, hogy hogy működik ;)
(Vagy ha mondasz konkrét problémát...)


Edit:
Van 4 változóm; ebből legalább 1 pozitív, de nem tudom, hogy melyik, és kell a legkisebb pozitív közülük. Most egy iszonyat szenvedős if else if else ágaztatott szarral próbálom csinálni (de valami nem jó benne, és már én sem látom át). Van rá normális megoldás? (C++)

Edit2: megoldottam. De ez nem változtatott.
sphereDist = getDistanceUntilSphere(rayStart, rayDir);
gPlaneDist = getDistanceUntilGPlane(rayStart, rayDir);
lPlaneDist = getDistanceUntilLPlane(rayStart, rayDir);
rPlaneDist = getDistanceUntilRPlane(rayStart, rayDir);

if ( sphereDist <= 0.0 && gPlaneDist <= 0.0 && lPlaneDist <= 0.0 && rPlaneDist <= 0.0 ) return La; // ray goes to infinity

Color3D color = { 0.0, 0.0, 0.0, 0.0 };

int firstObjectHit = 0; // if 1, sphere; if 2, ground; if 3, left; if 4, right

float distanceArray[] = { sphereDist, gPlaneDist, lPlaneDist, rPlaneDist };

float minDistance = 1500000.0;
for ( int i = 0; i < 4; i++ ) {
if ( distanceArray[i] < minDistance && distanceArray[i] > 0.0 ){
minDistance = distanceArray[i];
firstObjectHit = i+1;
}
}
Az if rész nem jön létre, de a minimumkereső nem talál kisebb értéket, nincs firstObjectHit (1-4 lenne legális), ergo a program elszáll. what the fuck...? :confused:
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Kvikveg

Probaltad mar kiiratni oket, es megnezni, hogy wtf okozhatja ezt?
Szintaxisra meg nem emlekszem.
WARNING: module "coffee.exe" did not run correctly. Brain running in limited mode.
Do not meddle in the affairs of dragons for you are crunchy and taste good with ketchup.

Lt. Simoan Blarke

Igen. És az aktuális nézőpont miatt nem fordul elő olyan, hogy akár az első három távolságváltozóból legalább 1 ne lenne pozitív. Valamiért a forciklusok le se futnak. Átírtam úgy, hogyfloat minDistance = distanceArray[0];

for ( int i = 0; i < 4; i++ ) {
if ( distanceArray[i] >= minDistance ) {
minDistance = distanceArray[i];
firstObjectHit = i+1;
}
}

for ( int i = 0; i < 4; i++ ) {
if ( distanceArray[i] < minDistance && distanceArray[i] > 0.0 ){
minDistance = distanceArray[i];
firstObjectHit = i+1;
}
}

és REJTÉLY, hogy miért nem íródik legalább 1 bele a firstObjectHit-be, ha már a tömb 0. elemével egyenlővé tettem ezt a temp változót...

valami precompile bibire gyanakszom, egyszerűen ennek így működnie kéne. tuti valami trivi dolgot baszok el :D

In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

#93
Az első, ami ilyeneknél eszembe jut, hogy nem használsz epszilont, mármedig a lebegőpontos numerikus számítások esetén az jól szokott jönni.
#define EPS 0.001f
Utána két double összehasonlításánál valamelyik javára mindig beteszel egy epszilon tagot, hogy elkerüld a numerikus pontatlanságból adódó gikszereket (jelen esetben megengedőbbé téve az if-eket).
double esetén ez nem annyira kritikus, de ott is szükség szokott lenni (egy jóval kisebb) EPSEPS-re.

Pl. ott jöhet jól, hogy ha az egyetlen pozitív a distanceArray[0], akkor ha jól nézem, a jelenlegi kód adott esetben tényleg sosem lép be a az if() blokkba, pl. egy '>=' nem megfelelően sikerül.


if ( distanceArray[i] >= minDistance - EPS ) {
if ( distanceArray[i] < minDistance + EPS && distanceArray[i] > 0.0 - EPS ){



Amúgy az egész első ciklus minek?


Miért nem dobálod be simán egy set<float> collekcióba a pozitívakat, és kiszeded utána a legkisebbet?

Lt. Simoan Blarke

#94
Quote from: Próféta on 2008-04-14, 21:12:36
Miért nem dobálod be simán egy set<float> collekcióba a pozitívakat, és kiszeded utána a legkisebbet?
Mert negatív szám nem jó... ezt az epszilonos csodát megnézem.

Az első forciklus meg azért került bele, hogy megnézzem, hogy ha önmagával hasonlítom össze, akkor se kap-e értéket... vagy hogy van ez magyarul. És így a kezdőérték a legnagyobb a 4 szám közül, azaz nem kell hasraütésszerűen 999999999999999999999999999999999999999.0-t beírnom.

Edit: epszilonozva ugyanúgy szétszáll...
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Kvikveg

Nem lehet, hogy az egesz szall szet valami mas miatt?
WARNING: module "coffee.exe" did not run correctly. Brain running in limited mode.
Do not meddle in the affairs of dragons for you are crunchy and taste good with ketchup.

Lt. Simoan Blarke

Ezen törjük a fejünket. Ennek a firstObjectHit cuccnak annyi a szerepe, hogy ettől függő paraméterrel számolok metszéspontot.

if ( firstObjectHit == 1 ) backupIntersect = countIntersectCoordinates(rayStart, rayDir, sphereDist);
else if ( firstObjectHit == 2 ) backupIntersect = countIntersectCoordinates(rayStart, rayDir, gPlaneDist);
else if ( firstObjectHit == 3 ) backupIntersect = countIntersectCoordinates(rayStart, rayDir, lPlaneDist);
else if ( firstObjectHit == 4 ) backupIntersect = countIntersectCoordinates(rayStart, rayDir, rPlaneDist);
for ( int i = 0; i < 3; i++ ) backupIntersectArray[i] = backupIntersect[i];


a for részen hal szét. Namost, a countIntersect egy referenciát ad vissza egy globális tömbre, amit én egy lokális változóba kiback-elek (ocsmány, tudom). Viszont access violation-ért sír - azaz szar referenciát ad vissza - azaz az előtte lévő 4 sor nem hajtódik végre...
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Quote from: Lt. Simoan Blarke on 2008-04-14, 21:16:18
Quote from: Próféta on 2008-04-14, 21:12:36
Miért nem dobálod be simán egy set<float> collekcióba a pozitívakat, és kiszeded utána a legkisebbet?
Mert negatív szám nem jó... ezt az epszilonos csodát megnézem.
::)

Quote from: Lt. Simoan Blarke on 2008-04-14, 21:16:18azaz nem kell hasraütésszerűen 999999999999999999999999999999999999999.0-t beírnom.
Kevésbé hasraütésszerűen: #include<limits>
float inf = numeric_limits<float>::infinity();


Quote from: Kvikveg on 2008-04-14, 21:29:08
Nem lehet, hogy az egesz szall szet valami mas miatt?
Elég gyanús.

Blarke: írass ki sok debug outputot valami logfájlba vagy stdoutra. Utána meg akár brakpoint + Step Into / Step Over léptetgetés is mehet.
Például az előbb beírt kódtömb ELŐTT írd ki firstObjectHit-et, hogy tuti az-e a baj.
Más, kódtisztasági mozgalom: van ám switch() konstrukció is, annak meg van van ám else ága, épp a hibás esetek megfogására és sikoltozásra...

Lt. Simoan Blarke

Direkt ilyen ocsmány a kód... hogy lakótárs szépen lecsiszolhassa és leadhassa, és ne legyen plágium-vád...
De feladtam, hogy időben befejezzem, 2 hét múlva kell leadni másik feladatot, ugyanilyen az is, csak openGL-lel kell csinálni és textúrázni... de be fogom má fejezni, mert apjafaszát... :D
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

kikuchiyo

0.000lf tapasztalatommal közbepofázom:

Nem lehet, hogy már eleve a sphereDist, *planeDist változókba nem az kerül, amit te szeretnél?

Azokat kéne
Quote from: Próféta on 2008-04-14, 21:38:47
akár brakpoint + Step Into / Step Over léptetgetés

Más:

Quote from: Próféta on 2008-04-14, 21:12:36
Az első, ami ilyeneknél eszembe jut, hogy nem használsz epszilont, mármedig a lebegőpontos numerikus számítások esetén az jól szokott jönni.
#define EPS 0.001f

Összehasonlításnál (<>) nem hiszem, hogy az epszilon bármit is segítene.
Egyenlőségnél szokták ajánlani, de egyes iskolák figyelmeztetnek, hogy ez sem csodaszer, nem old meg minden, lebegőpontos számokkal kapcsolatos problémát.
Failure is the default option

Lt. Simoan Blarke

Azokat végigléptettem, és elvileg azt számolgatja, ami nekem kell... mondjuk csak a bal felső pixelre (azaz összesen 9 hívódásra, rekurzió miatt) számolgattam kézzel végig, mert lusta geci vagyok. De azok az eljárások elvileg úgy számolnak, ahogy nekem kell...
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Quote from: Lt. Simoan Blarke on 2008-04-14, 21:34:52Namost, a countIntersect egy referenciát ad vissza egy globális tömbre, amit én egy lokális változóba kiback-elek (ocsmány, tudom). Viszont access violation-ért sír - azaz szar referenciát ad vissza - azaz az előtte lévő 4 sor nem hajtódik végre...
Az ilyesmit csak elrontani lehet, a végén esetleg véletlenül valami lokális stack-beli másolatra adsz vissza referenciát, és kampec. Nem lehet, hogy simán a countIntersectCoordinates ad vissza rossz referenciát? Van valami különös ok arra, hogy nem kaphatja meg a backupIntersectArray referenciáját paraméterként, hogy abba pakoljon? Így még másolgatsz is egy csomót feleslegesen. Miért kell külön backupIntersect és backupIntersectArray?

Lt. Simoan Blarke

Jogos. Globalt írok az eljárással, nem volt sok értelme visszaadni a globalra a referenciát... kigyomláltam belőle, aztán globalból átmásolgatom localba. Így tényleg nem hal el. Már csak rá kéne jönni, hogy végülis mit rajzolt ki :D Thx
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Na jó munkát még a hátáridőig, és utána tényleg /r/ screenshot!  :angyali:

Lt. Simoan Blarke

Csúnyákat káromkodós szmájli ( :Eztneked: ) x 1500

xsl.
template-en belüli choose-when mi a redvás halál faszáért nem működik?! van egy olyan leágazásom, hogy /page/COMP/ORDER[BOID] (vagy /page/COMP/ORDER/BOID), ami ezerötszázötven százalék, hogy egy kurvanagy NULL kéne, hogy legyen. a debug rész miatt ki is írja, hogy Debug info: BOID = (és itt már br-ek jönnek). de az istennek nem tudom rávenni, hogy ahol ez teljesül, ott az történjen, amit én akarok.

<xsl:template match="ORDER">
<xsl:choose>
<xsl:when test="/page/COMP/ORDER[BOID] =''">
<font color="red">
<span class="description">
<b><xsl:apply-templates select="DESCRIPTION"/></b>
</span>
<span class="quantity">
(quantity: <xsl:apply-templates select="QUANTITY"/>)
</span>
<br/>
<span class="origin">
Origin: <xsl:apply-templates select="ORIGIN"/>
</span>
<br />
<span class="destination">
Destination: <xsl:apply-templates select="ADEST"/>
</span>
<br />
<span class="deadline">
Delivery deadline: <xsl:apply-templates select="DEADLINE"/>
</span>
<span class="keses">
(
<xsl:apply-templates select="KESES" /> days late)
</span>
<br /> <br />
</font>
</xsl:when>
<xsl:when test="/page/COMP/ORDER/AID = /page/COMP/ORDER/BOID">
<font color="black">
<span class="description">
<b><xsl:apply-templates select="DESCRIPTION"/></b>
</span>
<span class="quantity">
(quantity: <xsl:apply-templates select="QUANTITY"/>)
</span>
<br/>
<span class="origin">
Origin: <xsl:apply-templates select="ORIGIN"/>
</span>
<br />
<span class="destination">
Destination: <xsl:apply-templates select="ADEST"/>
</span>
<br />
<span class="deadline">
Delivery deadline: <xsl:apply-templates select="DEADLINE"/>
</span>
<!--debug-->
<br/>
<span class="debug_keses">
Debug: keses = <xsl:apply-templates select="KESES"/>
</span><br/>
<span class="debug">
Debug: BOID = <xsl:apply-templates select="BOID"/>
</span>
<br /> <br />
</font>
</xsl:when>
</xsl:choose>
</xsl:template>


ötlet...?
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Quote from: Lt. Simoan Blarke on 2008-04-18, 20:16:01template-en belüli choose
Cukkolásul: template-en kívül nem is lehet choose ;)

Quote from: Lt. Simoan Blarke on 2008-04-18, 20:16:01van egy olyan leágazásom, hogy /page/COMP/ORDER[BOID] (vagy /page/COMP/ORDER/BOID),
Most melyik? Az egyik /page/COMP/ORDER csomópontokra illeszkedik, amelyeknek mellesleg van BOID gyerekük. A másik ezekre a bizonyos BOID gyerekekre passzol. Mellesleg mindkettő abszolút XPath, tehát a gyökértől indul. Ezt akartad?
Meg úgy egyáltalán mit akarsz tesztelni?

Quote from: Lt. Simoan Blarke on 2008-04-18, 20:16:01<xsl:when test="/page/COMP/ORDER[BOID] =''">
Ha a page gyökérelem alatti COMP alatti ORDER (amelynek mellesleg van BOID gyerekcsomópontja) létezik, ám üres szöveget tartalmaz... biztos ezt akartad?

Lt. Simoan Blarke

Igen. Ezeket mind tudom. Nem üres szöveg, hanem NULL, de szintaktikailag úgy is helyes.
De megvan, mi a gond. A rekurzió... nem hajtódik végre a choose minden sorra külön-külön... megpróbáltam a legkülső, gyökérre illeszkedő template-be tenni a choose-t (csak hogy ebbe ne köthess bele :D ), másik feladat az működött így. Ez nem.

A feladat maga az, hogy azok az ORDER ágak, ahol a BOID nem létezik, vörössel jelenjenek meg, a többi simán...
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Quote from: Lt. Simoan Blarke on 2008-04-18, 20:46:44Nem üres szöveg, hanem NULL, de szintaktikailag úgy is helyes.
Pardon? Mármint 'NULL' sztring van benne? Hogy képzeled te el ezt az XML csomópontot? Nem arra gondoltál, hogy nem létezik?

Quote from: Lt. Simoan Blarke on 2008-04-18, 20:46:44De megvan, mi a gond. A rekurzió... nem hajtódik végre a choose minden sorra külön-külön...
Nem értelek teljesen. xsl:if-et akarsz choose helyett? Vagy az a bajod, hogy maga a template nem illeszkedik korábbi találatok gyerekeire (hint: xsl:apply-templates)? Fogalmazz kicsit világosabban, ha segítséget vársz...

Quote from: Lt. Simoan Blarke on 2008-04-18, 20:46:44A feladat maga az, hogy azok az ORDER ágak, ahol a BOID nem létezik, vörössel jelenjenek meg, a többi simán...
Akkor a test-ben miért indulsz el a gyökértől, hogy másik ORDER-eket keress? Ha már egy ORDER-re illeszkedő templateben vagy, akkor xsl:if-ezd meg az ő BOID gyerekének létezését... (<xsl:if test="BOID"> vagy ilyesmi).

Meg úgy általában: ismerkedj meg az XPath-szal és az XSLT-vel, mielőtt kódolni kezdesz.


Lt. Simoan Blarke

Quote from: Próféta on 2008-04-18, 20:59:51Meg úgy általában: ismerkedj meg az XPath-szal és az XSLT-vel, mielőtt kódolni kezdesz.
Nem áll szándékomban, mert ennyire nyomorékszar megoldást még semmiben sem láttam. Beugró meglett, kettes kell, ennyi... Egyébként néztem xsl:if-et... csak éppen a kiadott forrásanyagunk egy fos, semmi nem derül ki belőle (ez szerepel benne, hogy az említett csomópont értéke "null", és hogy a null-indicator állítgatásával ténylegesen null olvasható ki belőle (stringként), és nem üres)... 15 oldalban összefoglalva egy xml, egy xsl, egy xsql és egy xpath. Szerinted mennyire alapos...? :/ És van rá 72 órád leadni. A JDBC és a php még érdekelt is, _normálisan_ szerepelt a mi forrásainkban is, de ez - hasonlóan az sql-hez - kalap fos. (Ott meg a javítás volt az, nem derültek ki a követelmények, mindkettő azért lett 3-as, mert levontak 2 jegyet olyan kritériumok miatt, amiket csak a leadást követő héten tudtunk meg, szóval az egész tárgy nocomment kategória)

És nem, nem xsl:if-et akarok. (A forrásanyagban annyi van, hogy van rekurzió, az apply-templates-szel, hihi.) Azt akarom, hogy a beszúrt kódban látható módon vagy vörös legyen a text, vagy fekete...

Azért indulok a gyökértől, mert egy büdös hangot nem értek az egészből, és a példaként kiadott honlap forrását kopipasztázom és próbálom heggeszteni...
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Ááá leesett, ez az szglab5/6 cucc.. heh, "szép" emlékek... részvétem, Blarke :)

Nos, [spoiler=ne mondd senkinek, hogy tőlem hallottad]az XSQL egy baromság,[/spoiler] az XML, XSL és XPATH viszont egy nagyon fontos technológiakör, megéri rászánni egy kis időt a megismerésükre, hasznosak lesznek még. Ráadásul szerintem épp ezekkel van gondod. Ha nem érzed kielégítőnek a segédletet, akkor a neten keress tutorialokat, pl. w3schools-on; nem itt a fórumon fogom megtanítani neked őket. Esetleg gyakorolj, ha valami nagyon nem világos.

Quote from: Lt. Simoan Blarke on 2008-04-18, 21:07:54(A forrásanyagban annyi van, hogy van rekurzió, az apply-templates-szel, hihi.) Azt akarom, hogy a beszúrt kódban látható módon vagy vörös legyen a text, vagy fekete...
Azt még mindig nem értem mondjuk, hogy a rekurzió hogy jön képbe.

Lt. Simoan Blarke

Quote from: Próféta on 2008-04-18, 21:20:09Azt még mindig nem értem mondjuk, hogy a rekurzió hogy jön képbe.
Én sem, de amikor magasabb leíróértékű részbe tettem a színezést, működött jól :)

Kérdés.
Gömbre akarok textúrát húzni. Azt mondta srác, aki segített, hogy erre van valami glu függvény. Most egy kockám van, aminek az oldalaira ráhúzom a textúrákat, aztán örülök, mert érdekesen néz ki :D, de a kocka nem jó a feladathoz, mivel (legalább) két paraméteres, textúrázott testtel kell számolni. (Textúrát egyébként nem olvashatunk be file-ból, ami elég undok dolog, és a NeHe-t kilövi, mint tutorial...)

Szóval: mi ez a glu függvény? :D
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Quote from: Lt. Simoan Blarke on 2008-04-27, 18:54:26de a kocka nem jó a feladathoz, mivel (legalább) két paraméteres, textúrázott testtel kell számolni.
Szóval: mi ez a glu függvény? :D
Foglalmam sincs, de szerintem a glu referencia okosabb lesz bármelyikünknél.

BTW, paraméteres felületet kell rajzolni? Magyarul tesszellálás a feladat?

Lt. Simoan Blarke

Quote from: Próféta on 2008-04-27, 19:20:01
Foglalmam sincs, de szerintem a glu referencia okosabb lesz bármelyikünknél.
Megnéztem a könyvet, az csak annyit ír, hogy

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);

GLUquadricObj* sphere = gluNewQuadric();
gluSphere(sphere, 1.0, 40, 40);

Na ez így nem jó, mert a gluSphere egy előre definiált glu alakzat, mint a teáskanna. Viszont azt nem bírtam kikukázni, hogy wasist s und t coordinate. (Annyit ír a könyv, hogy a glTexGen...() függvénycsalád segítségével az s és t koordináták automatikus számolása bekapcsolható. Megnéztem a gömbi vetítést, amire hivatkozik, de ott meg csak térszögek vannak.)

Quote from: Próféta on 2008-04-27, 19:20:01
BTW, paraméteres felületet kell rajzolni? Magyarul tesszellálás a feladat?
Ha meg lehet máshogy oldani, nem kell feltétlenül tesszellációt használni... De igazság szerint ott elakadtam, hogy kocka sarkaira ráfeszítem a textúrát, az még egyszerű volt.
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Namost, a gömb pontját leírhatod földrajzi szélességgel és magassággal, az két paraméter [0,2Π] és [0,Π] intervallumon. Felosztod mindkettőt mondjuk 100 részre, és akkor 100x100 ponttal leírtad a gömbfelszínt, közéjük meg kis háromszögeket feszítesz, és innentől ugyanaz, mint a kocka. A két paraméter pedig jó textúra koordinátáknak is, esetleg felszorozva kicsit vagy valami.

De ha az automatikust akarod használni, google ezt dobta ki:
http://jerome.jouvie.free.fr/OpenGl/Tutorials/Tutorial11.php
Az alján az animáció jól megmutatja, melyik paraméter mi.

Lt. Simoan Blarke

Quote from: Próféta on 2008-04-27, 19:51:31közéjük meg kis háromszögeket feszítesz
Ezzel nekem csak egy elvi problémám van: nem tudom egyféle textúrával megcsinálni, azt is fel kell darabolnom háromszögekre. Nem? Kocka az egyszerű volt, négyzetekre rádobom a chesstable-mintázatot, aztán találkoznak és hawaii...
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Quote from: Lt. Simoan Blarke on 2008-04-27, 20:00:52
Quote from: Próféta on 2008-04-27, 19:51:31közéjük meg kis háromszögeket feszítesz
Ezzel nekem csak egy elvi problémám van: nem tudom egyféle textúrával megcsinálni, azt is fel kell darabolnom háromszögekre. Nem? Kocka az egyszerű volt, négyzetekre rádobom a chesstable-mintázatot, aztán találkoznak és hawaii...
Pont ezt magyarázom, hogy a gömb két paramétere (szélesség és hosszúság) jellemezni fogja a vertexeket, és akkor interpolációval a köztük lévő háromszöget is. Nem kell sehogy felbontanod a képet, egyszerűen az egyik tengelye lesz a szélesség, a másik a hosszúság. Lásd:

A háromszögeid pedig ezek a kis négyzetek lesznek, egy átlóval felbontva. Vagy felőlem csinálhatsz quadot is.

Lt. Simoan Blarke

#116
Na. Hülyekérdésn+1: QUADS-zal akarom csinálni, de ennek ellenére háromszögeket rajzol (és így nagyszerűen hiányzik mindegyik négyszögnek kb. a fele).


             glBindTexture(GL_TEXTURE_2D, textureID1);
glBegin(GL_QUADS);

for (int i = 0; i < qualitySet; i++) {
for (int j = 0; j < qualitySet; j++)  {
//bal felső:
glTexCoord2f(0.0f, 1.0f);
coordX = r1 * sin (pi * j / qualitySet) * cos (2 * i * pi / qualitySet) - 1;
coordY = r1 * sin (pi * j / qualitySet) * sin (2 * i * pi / qualitySet);
coordZ = r1 * cos (pi * j / qualitySet);
glVertex3f(coordX, coordY, coordZ);
//jobb felső:
glTexCoord2f(1.0f, 1.0f);
coordX = r1 * sin (pi * j / qualitySet) * cos (2 * (i+1) * pi / qualitySet) - 1;
coordY = r1 * sin (pi * j / qualitySet) * sin (2 * (i+1) * pi / qualitySet);
coordZ = r1 * cos (pi * j / qualitySet);
glVertex3f(coordX, coordY, coordZ);
//bal alsó:
glTexCoord2f(0.0f, 0.0f);
coordX = r1 * sin (pi * (j+1) / qualitySet) * cos (2 * i * pi / qualitySet) - 1;
coordY = r1 * sin (pi * (j+1) / qualitySet) * sin (2 * i * pi / qualitySet);
coordZ = r1 * cos (pi * (j+1) / qualitySet);
glVertex3f(coordX, coordY, coordZ);
//jobb alsó:
glTexCoord2f(1.0f, 0.0f);
coordX = r1 * sin (pi * (j+1) / qualitySet) * cos (2 * (i+1) * pi / qualitySet) - 1;
coordY = r1 * sin (pi * (j+1) / qualitySet) * sin (2 * (i+1) * pi / qualitySet);
coordZ = r1 * cos (pi * (j+1) / qualitySet);
glVertex3f(coordX, coordY, coordZ);
}
}

glEnd();
(A theta-fí 0..pi 0..2pi felosztás szerint iterálok a gömbön, és kiszámolom a 4 vertex-koordinátát hozzá, de a jobb felső koordinátát letojja a búsba.)

:confused:

Edit: iterálást kijavítottam, mert logikai hibás volt, de ugyanaz a hiba megmaradt.
In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

Úgy se jó, ha az alsó kettő vertex sorrendjét megcseréled? Csak hogy körüljárás legyen. Mert így mintha egy háromszöget csinálnál, megy egy másik háromszöget a gömb belseje felé nézve, most nem rajzolom le, de remélem érted.
Más: remélem úgy gondoltad, hogy majd a texCoord is függni fog az i-től és j-től...

Lt. Simoan Blarke

Quote from: Próféta on 2008-04-27, 21:35:04Más: remélem úgy gondoltad, hogy majd a texCoord is függni fog az i-től és j-től...
Nem. A texCoord2f az utána következő glVertex3f-hez rendeli a quad megfelelő sarkát. (Kockakirajzolásnál is működött, és most is működik, csak az egyik sarok hiányzik; ettől függetlenül körbemegy a gömbön.)

Kicseréltem, működik :merci:


Edit: talán érdekelni fog, hogy milyen lett, meg örömmel várnék kommentet a végén feltett kérdésemre (attached).

//========================================================
// Hazi feladat keret.         
// A //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// sorokon beluli reszben celszeru garazdalkodni, mert
// a tobbit ugyis toroljuk.
// A Hazi feladat csak ebben a fajlban lehet
// Tilos:
// - mast "beincludolni", illetve mas konyvtarat hasznalni
// - faljmuveleteket vegezni
//========================================================

#include <math.h>
#include <stdlib.h>
#ifdef WIN32
#include <windows.h>     // MsWindows-on ez is kell
#endif
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>     // Ezt le kell tolteni: http://www.opengl.org/resources/libraries/glut/ 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Nev: Szöllősi Gábor   
// Neptun: GD9LKS
//--------------------------------------------------------

// the textures for the two spheres
GLuint textureID1;
GLuint textureID2;

// rotating variable
float rotquad = 30.0;

// coordinates
float coordX, coordY, coordZ;

// variables for drawing the spheres
float r1 = 1.2;
float r2 = 0.8;
float pi = 3.14159265;

// variables for the light
GLfloat lightPos[] = { 5.0f, 0.0f, 0.0f, 0.0f };
GLfloat ambientColor[] = { 0.0f, 0.0f, 0.0f, 0.5f };
GLfloat specColor[] = { 0.2f, 0.2f, 0.2f, 0.2f };
GLfloat diffColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };

// the higher this is set, the more quads will make a sphere, thus quality becomes better
int qualitySet = 30;

GLuint SetTextureSpaghetti() { // sets the texture for the first sphere
    GLuint texture;
    int width, height;
    char* data;

    // allocate buffer
    width = 256;
    height = 256;
    data = (char *)malloc( width * height * 3 );
    //memset( data, 0, width * height * 3 );

// this should result a creamy, spaghetti-like texture
    for( int i = 0; i < width; i++ ) {
for( int j = 0; j < height; j++ ) {
if ( ( i + j ) % 2 == 0 ) {
data[3*(j*width) + 3*i] = 205;
data[3*(j*width) + 3*i + 1] = 102;
data[3*(j*width) + 3*i + 2] = 29;
}
else {
data[3*(j*width) + 3*i] = 0;
data[3*(j*width) + 3*i + 1] = 0;
data[3*(j*width) + 3*i + 2] = 0;
}
}
}

    // allocate a texture name
    glGenTextures( 1, &texture );

    // select our current texture
   glBindTexture( GL_TEXTURE_2D, texture );

    // select modulate to mix texture with color for shading
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // build our texture mipmaps
glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data );
//gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data );

    // free buffer
    free( data );

    return texture;
}

GLuint SetTextureMatt() { // sets the texture for the second sphere
    GLuint texture;
    int width, height;
    char* data;

    // allocate buffer
    width = 2;
    height = 2;
    data = (char *)malloc( width * height * 3 );
    //memset( data, 0, width * height * 3 );

// this makes something like a green-black chessboard
    for( int i = 0; i < width * height; i++ ) {
if (i % 2 == 0) {
data[3*i] = 69;
data[3*i + 1] = 139;
data[3*i + 2] = 116;
}
else {
data[3*i] = 0;
data[3*i + 1] = 0;
data[3*i + 2] = 0;
}
}

// allocate a texture name
    glGenTextures( 1, &texture );

    // select our current texture
   glBindTexture( GL_TEXTURE_2D, texture );

    // select modulate to mix texture with color for shading
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

    // build our texture mipmaps
//glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data );
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data );

    // free buffer
    free( data );

    return texture;
}

void Init( ) { // inicializalasok
    textureID1 = SetTextureSpaghetti();
textureID2 = SetTextureMatt();

//glLightfv( GL_LIGHT1, GL_AMBIENT, ambientColor );
//glLightfv( GL_LIGHT1, GL_SPECULAR, specColor );
glLightfv( GL_LIGHT1, GL_DIFFUSE, diffColor );
glLightfv( GL_LIGHT1, GL_POSITION, lightPos );
glShadeModel( GL_SMOOTH );// Enable Smooth Shading
glClearColor( 0.545f, 0.482f, 0.545f, 0.5f ); //background
glClearDepth( 1.0f );// Depth Buffer Setup

glEnable( GL_DEPTH_TEST );// Enables Depth Testing
glEnable( GL_TEXTURE_2D );
glEnable( GL_LIGHT1 );
glEnable( GL_LIGHTING );

glDepthFunc( GL_LEQUAL );// The Type Of Depth Testing To Do
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
}

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)// Resize And Initialize The GL Window
{
if ( height == 0 )// Prevent A Divide By Zero By
{
height = 1; // Making Height Equal One
}

glViewport( 0, 0, width, height );// Reset The Current Viewport

glMatrixMode( GL_PROJECTION );// Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective( 45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f );

glMatrixMode( GL_MODELVIEW );// Select The Modelview Matrix
glLoadIdentity();// Reset The Modelview Matrix
}

void onDisplay( ) {
ReSizeGLScene( 600,600 );

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );// Clear Screen And Depth Buffer
glLoadIdentity(); // Reset The Current Modelview Matrix

glTranslatef( 0.0f, 0.0f, -7.0f ); // Translate Into The Screen 7.0 Units
glRotatef( rotquad, 0.0f, 1.0f, 0.0f );
glRotatef( rotquad, 1.0f, 1.0f, 1.0f );
glColor3f( 1,1,1 );

// draw the first sphere
glBindTexture( GL_TEXTURE_2D, textureID1 );
glBegin( GL_QUADS );

for ( int i = 0; i < qualitySet; i++ ) {
for ( int j = 0; j < qualitySet; j++ )  {
//upper left:
glTexCoord2f(0.0f, 1.0f);
coordX = r1 * sin (pi * j / qualitySet) * cos (2 * i * pi / qualitySet) - 1;
coordY = r1 * sin (pi * j / qualitySet) * sin (2 * i * pi / qualitySet);
coordZ = r1 * cos (pi * j / qualitySet);
glVertex3f(coordX, coordY, coordZ);
//upper right:
glTexCoord2f(1.0f, 1.0f);
coordX = r1 * sin (pi * j / qualitySet) * cos (2 * (i+1) * pi / qualitySet) - 1;
coordY = r1 * sin (pi * j / qualitySet) * sin (2 * (i+1) * pi / qualitySet);
coordZ = r1 * cos (pi * j / qualitySet);
glVertex3f(coordX, coordY, coordZ);
//lower right:
glTexCoord2f(1.0f, 0.0f);
coordX = r1 * sin (pi * (j+1) / qualitySet) * cos (2 * (i+1) * pi / qualitySet) - 1;
coordY = r1 * sin (pi * (j+1) / qualitySet) * sin (2 * (i+1) * pi / qualitySet);
coordZ = r1 * cos (pi * (j+1) / qualitySet);
glVertex3f(coordX, coordY, coordZ);
//lower left:
glTexCoord2f(0.0f, 0.0f);
coordX = r1 * sin (pi * (j+1) / qualitySet) * cos (2 * i * pi / qualitySet) - 1;
coordY = r1 * sin (pi * (j+1) / qualitySet) * sin (2 * i * pi / qualitySet);
coordZ = r1 * cos (pi * (j+1) / qualitySet);
glVertex3f(coordX, coordY, coordZ);
}
}

glEnd();


// draw the second sphere
glBindTexture(GL_TEXTURE_2D, textureID2);
glBegin(GL_QUADS);

for ( int i = 0; i < qualitySet; i++ ) {
for ( int j = 0; j < qualitySet; j++ )  {
//upper left:
glTexCoord2f(0.0f, 1.0f);
coordX = r1 * sin (pi * j / qualitySet) * cos (2 * i * pi / qualitySet) + 0.5;
coordY = r1 * sin (pi * j / qualitySet) * sin (2 * i * pi / qualitySet) + 1;
coordZ = r1 * cos (pi * j / qualitySet) - 2.5;
glVertex3f(coordX, coordY, coordZ);
//upper right:
glTexCoord2f(1.0f, 1.0f);
coordX = r1 * sin (pi * j / qualitySet) * cos (2 * (i+1) * pi / qualitySet) + 0.5;
coordY = r1 * sin (pi * j / qualitySet) * sin (2 * (i+1) * pi / qualitySet) + 1;
coordZ = r1 * cos (pi * j / qualitySet) - 2.5;
glVertex3f(coordX, coordY, coordZ);
//lower right:
glTexCoord2f(1.0f, 0.0f);
coordX = r1 * sin (pi * (j+1) / qualitySet) * cos (2 * (i+1) * pi / qualitySet) + 0.5;
coordY = r1 * sin (pi * (j+1) / qualitySet) * sin (2 * (i+1) * pi / qualitySet) + 1;
coordZ = r1 * cos (pi * (j+1) / qualitySet) - 2.5;
glVertex3f(coordX, coordY, coordZ);
//lower left:
glTexCoord2f(0.0f, 0.0f);
coordX = r1 * sin (pi * (j+1) / qualitySet) * cos (2 * i * pi / qualitySet) + 0.5;
coordY = r1 * sin (pi * (j+1) / qualitySet) * sin (2 * i * pi / qualitySet) + 1;
coordZ = r1 * cos (pi * (j+1) / qualitySet) - 2.5;
glVertex3f(coordX, coordY, coordZ);
}
}

glEnd();

glFlush();
    // Buffercsere: rajzolas vege
    glutSwapBuffers();
}

void onMousePress(int button, int state, int x, int y) {

// rotate east
if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ) { rotquad+= 2.0f; }

// rotate west
if ( button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN ) { rotquad-= 2.0f; }

onDisplay();
}

void onIdle( ) {
}

void onKeyboard(unsigned char key, int x, int y) {
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


void main(int argc, char * argv[]) {
glutInit(&argc, argv);
glutInitWindowSize(600, 600);
glutInitWindowPosition(100, 100);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Grafika hazi feladat");
Init();
glutDisplayFunc(onDisplay);
glutMouseFunc(onMousePress);
glutIdleFunc(onIdle);
glutKeyboardFunc(onKeyboard);
glutMainLoop();
}


És a kérdés: ha forgatom, akkor változik ugyan a fény függvényében a fényessége a gömböknek - de mindig a legsötétebb pontot apply-olja a TELJES belátható felületre. Azaz gyakorlatilag nincs árnyékolás :confused: Ez mitől van?

In Raid_0 the zero stands for how many files you are going to get back if something goes wrong.

"It's easy to kill someone. Just forget the taste of sugar." - Monster

Próféta

#119
Bocs, most nincs időm-kedvem beleásni magam a kódodba, de az árnyalást tipikusan két helyen szokás elbukni:
1. Az árnyaláshoz kellenek árnyaló normálisok. A normálvektorokat vagy kézzel viszed fel (pl. gömb sugara meghosszabbítva), vagy valahogyan okosan számolod (pl. csúcs normálvektora = találkozó lapok normálvektorának átlaga?).
2. Be kell kapcsolni, hogy legyen textúra és diffúz felület és diffúz fényforrás (irányított / pontszerű) és a textúra modulálódjon rá a felületre (ne csapja felül az árnyalást). Ez mind megvolt?

Ha meg félreértelek, és nem árnyalás, hanem árnyékvetés hiányzik (egyik alakzat árnyékot vet a másikra), akkor csak hajrá :)

Viszont szép munka, grat a BlarkeEngineTM-hez, reszkessen a Quake4, és grat az aláíráshoz is :)