OpenGL 3D svět a textury – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

OpenGL 3D svět a textury – C / C++ – Fórum – Programujte.comOpenGL 3D svět a textury – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Doomista+1
Stálý člen
11. 2. 2012   #1
-
0
-

Zdar,

řekl jsem si, že se konečně dám cestou 3D programování a po chvilce hledání jsem našel výtečné tutoriály přesně pro mě - NeHeho pro OpenGL, tak jsem se poté, co jsem nenašel absolutně nic pro 3D přes Allegro :D
Nicméně jsem narazil na větší/menší problémek. U tutoriálu č. 10 http://nehe.ceske-hry.cz/tut_10.php je vysvětleno jak naprogramovat jednoduchý engine, který, pokud mu dodáme grafiku a data "světa" je schopen vykreslit 3D svět polepený grafikami. V tutoriálu však není vysvětleno, jak vytvořit onen svět. Pochopil jsem, jak poskládat trojúhelníky, aby dávaly smysl, rovněž jak třeba namapovat různé textury na zdi a na podlahy. Nicméně jsem nepochopil jak správně namapovat textury na zdi a podlahy (hrátky s různými texturami jsem totiž prováděl na světě kterej byl v rámci zdrojáku ke stažení, ale jakmile jsem začal dělat svůj, nastaly problémy), lépeřečeno nepochopil jsem to vůbec. Můžete mi někdo poradit? Moc díky předem.

PS: když mi napíšete jak do programu nainstalovat myš a získat její XY koordináty vzhledem k oknu aplikace, budu vděčen ;)

Nahlásit jako SPAM
IP: 90.177.128.–
Na vše stačí iostream...
zlz
~ Anonymní uživatel
634 příspěvků
12. 2. 2012   #2
-
0
-

Ty trojúhelníky máš definované třemi vrcholy. Pro každý vrchol máš jeho souřadnice v prostoru (x,y,z) a souřadnice v textuře (u,v). Nechápu v čem je problém.

Co se týče té myši, tak pokud používáš tu verzi, jak se ve WndProc zpracovávají zprávy WM_KEYDOWN atd., tak by mělo stačit přidat zpracování WM_MOUSEMOVE.

Nahlásit jako SPAM
IP: 213.211.51.–
Doomista+1
Stálý člen
12. 2. 2012   #3
-
0
-

Problém byl  například v tom, vůči kterému bodu se souřadnice u,v inkrementují, metodou pokus-omyl se mi ten bod podařilo stanovit na levý spodní (přičemž vykresluju z levého horního).
Díky za odkaz na WM_MOUSEMOVE, bohužel se mi ho nepodařilo zprovoznit, definoval jsem WM_MOUSEMOVE, includnul jsem windowsx.h, vytvořil si GLuint MouseX; a pak jsem do kódu, který zjištuje jaká klávesa byla stisknuta dopsal tento kód:

if(MouseX!=GET_X_LPARAM(640)){
     if(MouseX>GET_X_LPARAM(640))
     heading-=0.1f;
     else
     heading+=0.1f;
    yrot=heading;
    MouseX=GET_X_LPARAM(640);

}

kterýžto sice prošel kompilátorem, ale nic nedělá

Nahlásit jako SPAM
IP: 90.177.128.–
Na vše stačí iostream...
yaqwsx+9
Posthunter
12. 2. 2012   #4
-
0
-
Nahlásit jako SPAM
IP: 85.160.57.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
zlz
~ Anonymní uživatel
634 příspěvků
12. 2. 2012   #5
-
0
-

#3 Doomista
V lParam dostaneš ty souřadnice a GET_X/Y_LPARAM použiješ jen na to abys je z něj vytáhl.

int MouseX, MouseY;
...
MouseX = GET_X_LPARAM(lParam);
MouseY = GET_Y_LPARAM(lParam);
...
if (MouseX > 640) ...
Nahlásit jako SPAM
IP: 213.211.51.–
Doomista+1
Stálý člen
12. 2. 2012   #6
-
0
-

#5 zlz
kompilátor mi říká, že nezná lParam, jak ho můžu deklarovat?

Nahlásit jako SPAM
IP: 90.177.128.–
Na vše stačí iostream...
yaqwsx+9
Posthunter
12. 2. 2012   #7
-
+1
-
Zajímavé

#6 Doomista
Nevidím tvůj kód, ale už z výroku "definoval jsem WM_MOUSEMOVE" usuzuji, že trochu tápeš.

WinAPI je založeno na zprávách, které si jednotlivá okna (komponenty) navzájem posílají. Jednou z těchto zpráv je i WM_MOUSEMOVE, která nese informaci o pozici kurzoru. Tyto zprávy se zpracovávají v tzv. smyčce okna, což je funkce, která byla předána při inicializaci okna. Tato funkce přebírá 2 argminety, běžně označované jako lParam a wParam. Tudíž lParam si nemůžeš "jen tak" deklarovat. Jak by se do něj dostala požadovaná data?

Toť trocha teorie, která není příliš podstatná. Předpokládám, že kód máš zkopírovaný z nějakého tutoriálu a moc se v něm neorientuješ. Jak jsem psal výše, než upravovat smyčku okna, bude pro tebe lepší použít funkci GetCursorPosition, kterou můžeš volat kdykoliv a kdekoliv a vrátí ti pozici kurzoru na obrazovce (nikoliv v okně). Použití je následující:

POINT point;
GetCursorPos(&point);
//struktura point nyní obsahuje pozici kurzoru.
//souřadnici x získáš voláním point.x
//součadnici y získáš voláním point.y
Nahlásit jako SPAM
IP: 85.160.57.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
yaqwsx+9
Posthunter
12. 2. 2012   #8
-
+1
-
Zajímavé

Bohužel můj předchozí příspěvek již nejde upravit a uvědomil jsem si jednu mou chybu. Zapomněl jsem ti napsat, jak tyto souřadnice vzhledek k obrazovce převedeš na souřadnice v rámci okna.

K tomu slouží funkce ScreenToClient (http://msdn.microsoft.com/en-us/library/dd162952%28v=VS.85%29.aspx), která předané souřadnice převede. Jako argument jí musíš předat handle okna, vůči kterému chceš souřadnice vztáhnout. Jak jsem se zběžně mrkl do NeHe, tak tam je definován jako hWnd. Volání tudíž bude vypadat následovně:

POINT point;
GetCursorPos(&point);
//struktura point nyní obsahuje pozici kurzoru v rámci obrazovky
ScreenToClient(hWnd, &point);
//struktura point nyní obsahuje pozici kurzoru v rámci okna
//souřadnici x získáš voláním point.x
//součadnici y získáš voláním point.y

EDIT: Tak jsem se ještě mrkl do zdrojáků toho tutoriálu. Smyčka ona je definována na řídku 471 a jmenuje se WndProc. V něm můžeš vidět switch, který určuje chování podle typu přijaté zprávy (uMsg). Aby jsi mohl použít radu od zlz, musel by jsi do tohoto switche přidat case WM_MOUSEMOVE: a zde ošetřit zpracování pohybu myši.

Doufám, že jsi nyní o něco chytřejší.

Nahlásit jako SPAM
IP: 85.160.57.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Doomista+1
Stálý člen
12. 2. 2012   #9
-
0
-

#8 yaqwsx
Díky, podmínka už funguje, ještě by byla fajn funkce, která by mi umožnila nastavit pozici kurzoru. Jinak máš pravdu, tápu a to víc než málo. K NeHemu jsem přešel prakticky rovnou od CMD s tím, že jsem se API ani nesnažil pochopit. Uznávám, asi je to dost stupidní

Nahlásit jako SPAM
IP: 90.177.128.–
Na vše stačí iostream...
yaqwsx+9
Posthunter
12. 2. 2012   #10
-
+1
-
Zajímavé
Nahlásit jako SPAM
IP: 85.160.57.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Doomista+1
Stálý člen
12. 2. 2012   #11
-
0
-

#8 yaqwsx
Co se týče toho switche, všiml jsem si ho, ale myslel jsem si, že je využitelný pouze pokud chci zjišťovat stisk levého/pravého myšítka

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
Doomista+1
Stálý člen
12. 2. 2012   #12
-
0
-

#10 yaqwsx
Díky, konečně mi to funguje tak jak má. Výsledný kód pro otáčení:

POINT point;

....
GetCursorPos(&point);
    ScreenToClient(hWnd,&point);
    if(320!=point.x){
     if(320>point.x)
     heading+=1.0f;
     else
     heading-=1.0f;
    yrot=heading;
    point.x=320;
    ClientToScreen(hWnd,&point);
    SetCursorPos(point.x,point.y);
    }

ještě si to nastavím na rozhlížení nahoru/dolů, což už by měla být brnkačka. díky všem za příspěvky, jsem vám moc vděčen a taky o něco chytřejší ;)

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
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, 18 hostů

Podobná vlákna

OpenGL a textury — založil GeryEmreis

OpenGL textury — založil Zelenáč

Textury — založil A-dy

Textury — založil Luko8525

Moderátoři diskuze

 

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