[Tutorial] Izrada 3D/scenegraph enginea

poruka: 66
|
čitano: 20.021
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
odjavljen
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
Deus ex machina kaže...

Eh da, skoro sam zaboravio, pa cu zaspamati s doublepostom zbog ovoga:

 

 

S R E T A N    N A M   S V I M A   D A N    P R O G R A M E R A !!!!

 

Hugs & kisses and succesfull compiles, everyone :-)

http://en.wikipedia.org/wiki/Programmers%27_Day

Console.Write ("Takoder sve naj naj bolje!!!")

One death is tragedy, but million deaths is statistics - Joseph Staljin [One to all Units Let's toast some russians - By James Gastovski ] // OFP Fan
Poruka je uređivana zadnji put pon 13.9.2010 17:38 (Weky).
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
Svaka čast na tutu... predobro....

samo ja tako ne volim raditi s klasama...
Sto ces... ja sam ipak "starudija" :) C :)
In Control
16 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea

Ne znam na čemu možeš raditi bez klasa? Postoji li nešto danas bez OOP-a?

Pravi znak inteligencije nije znanje, već mašta - Albert Einstein
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
naxeem kaže...

Ne znam na čemu možeš raditi bez klasa? Postoji li nešto danas bez OOP-a?

  Pa cjelokupni moj projekt je u c-u radjen... mozda je malkice teze, ali sve to mozes lijepo srediti...

In Control
16 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
EnlightenedPhoenix kaže...
naxeem kaže...

Ne znam na čemu možeš raditi bez klasa? Postoji li nešto danas bez OOP-a?

  Pa cjelokupni moj projekt je u c-u radjen... mozda je malkice teze, ali sve to mozes lijepo srediti...

Ovisi i čemu se radi, ali stvarni, komercijalni programi, ne rade se tako. Rade se najbržom tj. najefikasnijom tehnologijom.

Za hobi, možeš raditi i u x86 asembleru.

Pravi znak inteligencije nije znanje, već mašta - Albert Einstein
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
naxeem kaže...
EnlightenedPhoenix kaže...
naxeem kaže...

Ne znam na čemu možeš raditi bez klasa? Postoji li nešto danas bez OOP-a?

  Pa cjelokupni moj projekt je u c-u radjen... mozda je malkice teze, ali sve to mozes lijepo srediti...

Ovisi i čemu se radi, ali stvarni, komercijalni programi, ne rade se tako. Rade se najbržom tj. najefikasnijom tehnologijom.

Za hobi, možeš raditi i u x86 asembleru.

  Pa ne bih se baš slozio s tobom... ali dobro... to je tvoje misljenje, a ako "aplikacija" u koju je ulozeno nesto vise od 2 mil eura nije ozbiljan projekt onda ne znam...

 

:)

 

Pozdrav i jos jednom DEUS, oprosti za ovaj offtopic i predobar thread...

In Control
16 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea

Sve ovisi što radiš. Iako se radi o visokoj cifri, cijena me ne impresionira, s obzirom da sam radio na skupljem, ali i jeftinijem i vjerojatno važnijem. Eno, i eMatica je koštala 7 milijuna kuna, pa se čini da je to pisala skupina osnovnoškolskih polaznika vikend-informatike. (barem je takav utisak ostavljen na medije, korisnike i javnost).

 

Ono što je bitno je, što radiš i za što. U sferi 3D grafike, apsolutno ne postoji nikakva potreba za C jezikom, kao ni u 95% drugih mogućih projekata.

C je eventualno koristan tamo gdje ne možeš koristiti C++ zbog memorijskih ograničenja ili rada na nekoj legacy aplikaciji (gdje trebaš asm kod koji je nešto kompliciraniji u C++u), ali C je također koristan u slučajevima kada je OOP/C++ edukacija programera nedostupna, preduga ili preskupa (neznanje) ili kada vodstvo ne vjeruje u sposobnosti tima i ne želi im dati moćniji alat s "previše" funkcija.

5% mogućih stvari su kompajleri, FBW sustav za Airbus i NASA-ini kontrolni programi za Rovera (novi je pisan u C++u). I naravno, paranoična skupina na GNU platformi (uglavnom bespotrebno puhanje kako je C bliži hardveru).

 

Naravno, kao i u seksu, sado-mazohizam također može biti uzrok.

 

Igre raditi u C-u je smiješno. Velikim projektima nužni su moderniji alati, inače dolazi do preskupog razvoja u pogledu vremena i ljudstva, a odabir C-a češće je uzrok neiskustva i neznanja vodstva, nego potrebe. Vidio sam takve slučajeve u posljednjih 7 godina koliko radim i uglavnom završe smiješno.

 

Nadam se da Deus ne zamjera na komentaru, s obzirom da ga smatram vrlo bitnim, jer je odabir pogrešnog jezika, kompliciranje i izmišljanje tople vode, glavni uzrok neuspjeha većine amatera i mnogih profesionalaca.

Uostalom, i Deus zna za ekipu koja je sve radila ručno i toliko pretjerala s "optimizacijama", da su kod doveli do kaosa i katastrofe. :)

Pravi znak inteligencije nije znanje, već mašta - Albert Einstein
15 godina
neaktivan
offline
Bazicni mesh

Entaro Adun,

danas pocinjemo sa scenegraphom.
Scenegraph, kako mu samo ime govori, je podatkovna struktura koja predstavlja nasu scenu u formi grafa. Graf je vrlo korisna matematicka struktura koja predstavlja kolekciju objekata i definira njihove medjusobne veze, no unatoc (pogresnom) imenu, podatkovna struktura koja najefikasnije predstavlja scenu je stablo. Graf, za razliku od stabla, ne poznaje koncept parent/child vec samo svoje 'susjede' (o boze kako mrzim hrvatske nazive za ovo). Stablasta struktura je odlicno rijesenje za 3D engine, iz vise razloga:
1. 'kompresija' podataka. Djeca normalno nasljedjuju svojstva svojih roditelja.
2. jednostavnije optimiziranje necega sto se zove 'state change'
3. u buducnosti, jednostavniji streaming podataka
4. jeftiniji occlusion
5. jednostavno segmentiranje kalkulacija, odnosno, kalkuliranja unutar lokalnih dijelova stabla da bi se sacuvala preciznost
6. ... dosadilo mi je razmisljati o dodatnim razlozima....

Ideja naseg scenegrapha sastoji se od tri komponente:
1. Geometrija, tj. Mesh, tj. klasa koja sadrzi stvarne lokalne podatke o nekoj geometriji - vertexe, normale, UV, indekse, etc etc etc...
2. Parametri, odnosno klase s kojima opisujemo kako ce se neki mesh renderirati - tekstura, materijal, shader, blending, etc etc etc...
3. Node, genericki clan stabla koji moze imati parent-a i moze imati djecu, te moze biti anotiran parametrima

Danas cemo srediti rudimentarni Mesh, koji cemo s vremenom obogacivati. Nas bazicni Mesh mora prije svega sadrzavati:
- pozicije vertexa u lokalnom prostoru mesha
- lokalnu translaciju samog mesha u odnosu na svoj parent u scenegraphu (tj. tretirajuci parenta kao izvoriste koordinatnog sistema)
- rotaciju u odnosu --||--
- skaliranje u odnosu --||--

Vertex je skup 3 koordinate. S obzirom da nad vertexima planiramo izvoditi razne operacije - rotiranje, skaliranje, projiciranje, i sto god jos ne, nasa Vector klasa je savrsen kandidat za opisivanje vertexa. Lokalna translacija je sama po sebi skup od 3 koordinate, i takodjer, Vector je savrsen kandidat. Skaliranje se izvodi u 3 osi, dakle, opet Vector. Rotacija je malo zeznutija stvar.
Za pocetak, potrebno je znati da se sve ove tri transformacije unutar konkretno OpenGL-a pretvaraju u matrice (jednostavno se na wikipediji pronadju matrice za translaciju, sve 3 osi rotacije i skaliranje). Multiplikacijom tih transformativnih matrica dobijamo finalnu matricu transformacije, te onda mnozimo svaki vertex unutar mesha s njom, da bi izracunali finalnu poziciju vertexa. Mnozenje matrice i vertexa je u nasem engineu predstavljeno, logicno, kao mnozenje matrice i vektora, jednostavna (i za procesor podosta jeftina, mnozenje i zbrajanje) matematicka operacija.
E sad, u cemu je problem s rotacijom? Postoji problem koji se zove 'gimbal lock', odnosno, koristeci eulerove kuteve, gubi se transformacija po jednoj osi. Ovo ne moze doci do izrazaja u ne-stablastoj strukturi jer ne postoji koncept nasljedjivanja rotacije. Sad, iako vam se moze ciniti da je stablasta struktura onda problem sam po sebi, dovoljno je zamisliti 'rig' - stablastu strukturu jointova koji opisuju neki skelet za animaciju. Primjerice, zamislite ruku - ona se sastoji od ramena, lakta i zgloba sake. Koristeci eulerove kuteve, moguce je postaviti rotaciju ramena na taj nacin da se lakat ogranici na rotaciju po samo dvije osi, to je nusprodukt kalkulacije rotacijskih matrica.
Tom problemu se moze pristupiti na vise nacina, u zadnje vrijeme, popularano je koristiti Quaternion, odnosno skup brojeva koji prosiruje imaginarni skup. Na rotaciju quaterniona moze se gledati kao na 3D ravninu smjestenu u 4D hiperprostor - dakle, komplicirano :-D
Ono sto je nama bitno su ove cinjenice:
- jedan quaternion (4 floata) predstavlja punu 3D rotaciju
- quaternione mozemo bez problema mnoziti bez bojazni od gimbal-locka i kao rezultat dobiti quaternion
- SLERP (sfericna linearna interpolacija) je jeftina operacija sa quaternionima


Sad, nakon sto sam sve ovo ispisao (tudum), maknut cemo se od quaterniona cisto da se mrvicu udaljimo od matisa, i predstaviti nase kuteve na nacin na koji ih OpenGL moze prihvatiti, a to je jedan malo intuitivniji prikaz rotacije - os i kut oko te osi. Dakle, iskoristit cemo jedan vektor za definiciju osi, te jedan float za definiciju kuta (u radijanima, naravno) oko te osi.

Takodjer, obavezno cemo rastaviti Mesh na header i implementaciju, jer ga necemo cesto mijenjati, ali cemo ga koristiti na mjestima koja ce se cesto mijenjati.

Pocnimo s novim namespaceom, i posljedicno, novim direktorijem u nasem projectu - model, te dodajmo Mesh.hpp i Mesh.cpp. S obzirom da je nasa cmake build skripta 'pametna', ne moramo podesavati apsolutno nista:
.
|-- CMakeLists.txt
`-- src
    |-- main
    |   `-- cpp
    |       |-- Tutorial1.cpp
    |       |-- general
    |       |   |-- Object.cpp
    |       |   |-- Object.hpp
    |       |-- math
    |       |   `-- Vector.hpp
    |       `-- model
    |           |-- Mesh.cpp
    |           `-- Mesh.hpp
    `-- test
        `-- cpp
            |-- TestSuite.cpp
            |-- math
            |   `-- VectorTest.hpp
            `-- skunkworks
               `-- BaseTest.cpp

E sad, jedna 'arhitekturalna' odluka :-)
Ono sto znamo za cinjenicu jest da ce Mesh pristupati svojim podacima cesto (tj. na svaki 'render'), no ti podaci se nece cesto mijenjati - jednom ucitan mesh generalno _nece_ mijenjati broj svojih vertexa, UV mapping i slicno. To znaci da bi bilo idealno spremiti podatke tocno tamo gdje se Mesh alocira, sto znaci da unutar Mesh-a _necemo_ spremati pokazivace na nase vektore, vec kopije vektora koje predajemo kroz konstruktor.
Takodjer, s obzirom da se podaci nece cesto mijenjati i da cemo im vrlo cesto pristupati at random (tj. kod svakog rendera :-)), std::vector je odlican izbor za kolekciju.
Takodjer, ne zaboravimo da smo implementirali zanimljive stvari unutar Object.hpp, pa bi bilo korisno naslijediti tu klasu.

Nakon sto smo sve to odlucili, krenimo prvo sa interfaceom:
#ifndef MODEL_MESH_HPP_
#define MODEL_MESH_HPP_

#include <general/Object.hpp>
#include <math/Vector.hpp>
#include <vector>

namespace model {

class Mesh: public general::Object {
private:
    std::vector<math::Vector3f> vertices;
   
    std::string name;
    math::Vector3f localTranslation;
    math::Vector3f rotationAxis;
    float rotationAngle;
    math::Vector3f scale;
   
    math::ColorRGBA defaultColor;

    void ApplyTransforms() const;
    void ApplyDefaultColor() const;

public:
    Mesh();
    Mesh(const std::vector<math::Vector3f>& vertices);
    virtual ~Mesh();

    std::vector<math::Vector3f> GetVertices() const;
    void SetVertices(const std::vector<math::Vector3f>& vertices);

    virtual void Render() const;

    std::string GetName() const;
    math::Vector3f GetLocalTranslation() const;
    math::Vector3f GetRotationAxis() const;
    float GetRotationAngle() const;
    math::Vector3f GetScale() const;
    math::ColorRGBA GetDefaultColor() const;

    void SetName(const std::string& name);
    void SetLocalTranslation(const math::Vector3f& localTranslation);
    void SetRotation(const math::Vector3f& axis, const float angle);
    void SetRotationAxis(const math::Vector3f& axis);
    void SetRotationAngle(const float angle);
    void SetScale(const math::Vector3f& scale);
    void SetDefaultColor(const math::ColorRGBA& color);

    virtual std::string GetClassName() const;
    virtual std::string ToString() const;
};
}

#endif

U startu se vidi da ova klasa ima gomilu koda. Imajuci na umu da cemo kasnije prosirivati nas model scenegrapha, ovaj kod se moze izvuci u superklasu, ali _necemo_ to raditi _sada_. Ova odluka je bitna: uvijek prvo krenite s necim JEDNOSTAVNIM, a onda kompliciranim. Izvlacenje superklase iskljucivo zato da bi imaginarno ustedjeli na citljivosti koda je LOS potez, zato jer ta superklasa nema osnova za svoje postojanje. Tek onda, iskljucivo, kad se pokaze da dvije klase unutar iste logicke domene zatrebaju jednake mogucnosti, ONDA treba pristupiti refactoriranju. Zasada, mi cemo se drzati jednostavnosti i ostaviti to ovako.
Dodali smo, takodjer, ime objekta - obican string, koristan parametar.
Mislim da od gornjeg koda jedino metode ApplyTransforms() i ApplyDefaultColor(), te polje defaultColor (oznaceno kao hack) nisu razumljivi.
Dakle, ApplyTransforms je privatna metoda koja ce aplicirati transformacije u OpenGL (ili kasnije u neki drugi renderer), prije nego ispisemo vertexe. Default color je boja s kojom cemo obojati nagurane vertexe, cisto da vidimo da smo nesto uopce napravili. Oznacena je kao hack jer obicno, ukoliko zelimo boje, trebali bi procitati boje za svaki vertex, no to znaci da nas parser u startu postaje kompleksniji - zelimo se pokusati ograniciti na parsiranje sto je moguce manjeg skupa podataka, i cim prije prikazati nesto u prozoru.

Render metoda ce jednostavno aplicirati transformacije da bi modificirala OpenGL matrice, te potom unutar loopa naizmjenicno aplicirati boju i 'gurnuti' vertex u OpenGL.
Kasnije, obogatiti cemo render metodu postavljanjem normala, shadera, ili cime god drugim. Takodjer, u buducnosti render metoda morat ce primiti Renderer interface, koji ce biti nas apstraktni prikaz rendering API-ja.
Dakle, od svih ovih silnih mutatora i accessora, najzanimljiviji dijelovi (ie. OpenGL) se nalaze unutar ApplyTransforms, ApplyDefaultColor i Render metoda.

Primjetite jos jednu dobru praksu - bilo koji mutator _kopira_ podatke u mesh.
Ovo ce se mozda ciniti kao trosenje prostora ili sporost, ali postoji argument koji ubrzano dobiva na vaznosti, koji pobija te obje premature optimizacije - multithreading ;-)

Evo napokon i implementacije:
#include "Mesh.hpp"
#include <algorithm>
#include <GL/gl.h>
#include <sstream>

using namespace std;
using namespace math;
using namespace model;

Mesh::Mesh() :
    name("UNNAMED_OBJECT"),
    localTranslation(0.0F, 0.0F, 0.0F),
    rotationAxis(0.0F, 1.0F, 0.0F),
    rotationAngle(0.0F),
    scale(1.0F, 1.0F, 1.0F),
    defaultColor(1.0F, 0.0F, 0.0F, 1.0F) {
}

Mesh::Mesh(const vector<Vector3f>& vertices) :
       name("UNNAMED_OBJECT"),
       localTranslation(0.0F, 0.0F, 0.0F),
       rotationAxis(0.0F, 1.0F, 0.0F),
       rotationAngle(0.0F),
       scale(1.0F, 1.0F, 1.0F),
       defaultColor(1.0F, 0.0F, 0.0F, 1.0F),
       vertices(vertices) {
}

Mesh::~Mesh() {
}

string Mesh::GetName() const {
    return name;
}

Vector3f Mesh::GetLocalTranslation() const {
    return localTranslation;
}

Vector3f Mesh::GetRotationAxis() const {
    return rotationAxis;
}

float Mesh::GetRotationAngle() const {
    return rotationAngle;
}

Vector3f Mesh::GetScale() const {
    return scale;
}

ColorRGBA Mesh::GetDefaultColor() const {
    return defaultColor;
}

void Mesh::SetName(const string& name) {
    this->name.assign(name);
}

void Mesh::SetLocalTranslation(const Vector3f& localTranslation) {
    this->localTranslation.Set(localTranslation);
}

void Mesh::SetRotation(const Vector3f& axis, const float angle) {
    this->rotationAxis.Set(axis);
    this->rotationAngle = angle;
}

void Mesh::SetRotationAxis(const Vector3f& rotation) {
    this->rotationAxis.Set(rotation);
}

void Mesh::SetRotationAngle(const float rads) {
    this->rotationAngle = rads;
}

void Mesh::SetScale(const Vector3f& scale) {
    this->scale.Set(scale);
}

void Mesh::SetDefaultColor(const ColorRGBA& color) {
    this->defaultColor.Set(color);
}

void Mesh::ApplyTransforms() const {
    glMatrixMode(GL_MODELVIEW);
    glRotatef(rotationAngle, rotationAxis[0], rotationAxis[1], rotationAxis[2]);
    glTranslatef(localTranslation[0], localTranslation[1], localTranslation[2]);
    glScalef(scale[0], scale[1], scale[2]);
}

void Mesh::ApplyDefaultColor() const {
    glColor3f(defaultColor[0], defaultColor[1], defaultColor[2]);
}


string Mesh::GetClassName() const {
    return "model::Mesh";
}

string Mesh::ToString() const {
    ostringstream oss;
    oss << GetClassName() << "{vertices={";

    vector<Vector3f>::const_iterator it = vertices.begin();
    vector<Vector3f>::const_iterator nextToLast = vertices.end();
    nextToLast--;

    for (; it < nextToLast; ++it)
       oss << it->ToDebugString() << ", ";

    vector<Vector3f>::const_iterator last = vertices.end();
    last--;

    oss << last->ToDebugString();
    oss << "}" << "}";
    return oss.str();
}

vector<Vector3f> Mesh::GetVertices() const {
    return vertices;
}

void Mesh::SetVertices(const vector<Vector3f>& vertices) {
    this->vertices.assign(vertices.begin(), vertices.end());
}

void Mesh::Render() const {
    ApplyTransforms();
    glBegin(GL_TRIANGLES);

    for (unsigned int i = 0; i < vertices.size(); ++i) {
       Vector3f vertex = vertices[i];
       ApplyDefaultColor();
       glVertex3f(vertex[0], vertex[1], vertex[2]);
    }

    glEnd();
}


Eto, to je to za danas.

Slijedeci put cemo (napokon!) probati iscrtati obican trokut na ekran, ja trenutno inicijaliziram XWindows prozor, ali probat cu srediti i Windows build. U medjuvremenu, za zabavu, mozete procitati http://rampantgames.com/blog/2004/10/black-triangle.html i mozete poceti razvijati zdravu mrznju prema managerima i njihovoj ignoranciji ;-)
Ako slucajno puca build, napisite ovdje jer sam morao malo secirati svoj kod da to mogu pomalo objasniti ovdje, te je moguce da mi je promakla neka greska.

Cheers!

I have got no money, I have got no power, I have got no fame... I have my strong beliefs...
Poruka je uređivana zadnji put pon 27.9.2010 19:42 (Deus ex machina).
 
1 0 hvala 2
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
naxeem kaže...

Nadam se da Deus ne zamjera na komentaru, s obzirom da ga smatram vrlo bitnim, jer je odabir pogrešnog jezika, kompliciranje i izmišljanje tople vode, glavni uzrok neuspjeha većine amatera i mnogih profesionalaca.

Ma naravno da ne zamjeram uopce, bilo bi dobro da ovaj thread ima i konverzacije umjesto monologa :-)

Sto se mene tice, ja bi najradije sve ovo piskarao u D-u, ali tko to koristi :-)

I have got no money, I have got no power, I have got no fame... I have my strong beliefs...
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
Mogu ti reci da si ti jedan od malobrojnih forumasa koje s uzitkom citam...

Normalno i naxeem spada tu...jednostacno elokvetno i prilicno argumentirano objasnjavate... Iako se nekada ne slažem, opet je lijepo pročitati :)
In Control
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
EnlightenedPhoenix kaže...
Mogu ti reci da si ti jedan od malobrojnih forumasa koje s uzitkom citam...

Normalno i naxeem spada tu...jednostacno elokvetno i prilicno argumentirano objasnjavate... Iako se nekada ne slažem, opet je lijepo pročitati :)

Ono sto mene pomalo zabrinjava je da mi se nakon ovih dugih postova osuse usta! Nasao sam se da pijem vode dok tipkam... svasta...

 

I have got no money, I have got no power, I have got no fame... I have my strong beliefs...
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
A gle... mozda dises na usta dok tipkas a to ni ne primjecujes...

Inace budem te uskoro malo konzultirao posto vidim da znas dosta o 3d enginima i slicno... posto mislim jedan mali pilot projetkic (entuzijasticni) napraviti... I mozda bi mi mogao pomoci u vidu tutova, clankova i slicno... Normalno oko svega se dogovorimo...
In Control
16 godina
protjeran
offline
[Tutorial] Izrada 3D/scenegraph enginea

Možda griješim al vidim nekoliko potencijalnih problema u Mesh klasi koji bi mogli isplivati u budučnosti. 1) Mislim da bi Render funkcija trebala biti izvan te klase, tako da se mogu implementirati i drugi grafički API-ji? 2) Mislim da bi trebali koristiti svoje klase za matrice tako da kod bude više reusable, tako da npr klasa Mesh ne ovisi o OpenGL funkcijama ?

Programko http://programko.bloger.hr
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea

S obzirom da je OGL x-platform, zašto uopće ići na neke druge API-je? DirectX je jedini još, a OGL radi i na Windowsu, pa...

Pravi znak inteligencije nije znanje, već mašta - Albert Einstein
16 godina
protjeran
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea

Netko je spomenuo raytrace rendering, ja osobno duže vrijeme razmišljam da napišen svoj software renderer (kad bih samo našao vremena). A i u početku tutorijala je rečeno da će se koristiti abstraktni renderer kao jedan od ciljeva, pa pretpostavljam da bi se RTTI trebao koristiti za idetifikaciju tipa objekta i njegovo renderiranje u abstraktnom renderu. A ne da djelova za renderiranje ima kroz cijeli projekt.

Programko http://programko.bloger.hr
14 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
Ovo ima logike Programko, recimo render ako ostane unutar mesh klase definitivno ograničava neke stvari, ima rješenja gdje se za svaki pojedini grafički api izvodi drugi mesh, tj render mesh-a . Sam API se detektira prije main-loop funkcije dal preko odabira korisnika ili preko detekcije grafičkog adaptera te na taj način odredi " najbolji" render API za mesh. recimo radio sam s jednim SDK-om koji je imao tako definirano DX mesš, GL mesh, zatim skinned mesh i solid mesh. Znaći ono što ja predlažem da se izvuće render klasa, koja preko verticesa mesha radi rednder nad meshom, jer manje više i DX i GL barataju kroz vertices arrayeve, ispravite me ak sam u krivom jer već dugo nisam radio direktno na razini Grafičkog API-a.
Znaći ukratko moja ideja je ostaviti mesh klasu kakva je umanjenu za render funkciju, napraviti klasu render , trenutno implementiranu za GL API , te menađer mesheva ili pretraživać stabla mesh-eva koji sadrži arry listu, na način da isti poziva prosljeđene pokazivaće na polja mesheva . S druge strane mislim da je ovo i brži način izvođenja koda. Drugo u mesh klasu ubaciti boolean vrijednost za render ili not render, tako recimo nam to može kasnije poslužiti za neke efekte ( OC ili LOD ) tipa da kada renderirat mesh, to recimo izvedemo preko super klase za slanje poruka, message sistem.
Kažem ispravite me ako sam u krivom.

http://graffiti-jam.blogspot.com/
16 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
naxeem kaže...

S obzirom da je OGL x-platform, zašto uopće ići na neke druge API-je? DirectX je jedini još, a OGL radi i na Windowsu, pa...

Ima ih još... Direct3D Mobile, OpenGL ES, softverski rendereri... OGL možda jest najrašireniji i najbolji izbor za tutorijal, i očito će tutorijal fino objasniti djelomično kreiranje enginea (osim low-level transformacija i samog crtanja koje će raditi ogl), ali definitivno zasad nije skroz portabilan i apstraktan.

 

16 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea

Mislio sam na bitne i one koji nekoga uopće interesiraju. OpenGL ES nije previše različit od "običnog" OpenGL-a.

Pravi znak inteligencije nije znanje, već mašta - Albert Einstein
14 godina
neaktivan
offline
[Tutorial] Izrada 3D/scenegraph enginea
Ovako skinuo sam DevC++ ( verziju sa MinGW/GCC kompajlerom ) te ga odabrao kao izbor IDE-a za ovaj projekt. Sve koje zanima kako uvuć resurse za OpenGL u DevC++ imate kratki priručnik ovdje : http://www.astahost.com/info.php/installing-glut-dev_t14192.html .
Za pokretanje osnovnog GLUT projekta izaberite File->Project->Kartica multimedia->GLUT .
Kod DevC++-a bitno je da prije run-anja projekta isti kompalirate, tek onda Run.
http://graffiti-jam.blogspot.com/
 
1 0 hvala 1
14 godina
neaktivan
offline
[Tutorial] Izrada 3D/scenegraph enginea

Ovo je izvrsno! Svaka čast. Smijeh

Jesi možda razmišljao da cijeli projekt pretvoriš u open-source engine i da mu daš neko ime, pa da bude konkurencija Irrlicht-u, OGRE-u ili OpenSceneGraph-u?

Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
woodgamesfx kaže...
Ovo ima logike Programko, recimo render ako ostane unutar mesh klase definitivno ograničava neke stvari, ima rješenja gdje se za svaki pojedini grafički api izvodi drugi mesh, tj render mesh-a . Sam API se detektira prije main-loop funkcije dal preko odabira korisnika ili preko detekcije grafičkog adaptera te na taj način odredi " najbolji" render API za mesh. recimo radio sam s jednim SDK-om koji je imao tako definirano DX mesš, GL mesh, zatim skinned mesh i solid mesh. Znaći ono što ja predlažem da se izvuće render klasa, koja preko verticesa mesha radi rednder nad meshom, jer manje više i DX i GL barataju kroz vertices arrayeve, ispravite me ak sam u krivom jer već dugo nisam radio direktno na razini Grafičkog API-a.
Znaći ukratko moja ideja je ostaviti mesh klasu kakva je umanjenu za render funkciju, napraviti klasu render , trenutno implementiranu za GL API , te menađer mesheva ili pretraživać stabla mesh-eva koji sadrži arry listu, na način da isti poziva prosljeđene pokazivaće na polja mesheva . S druge strane mislim da je ovo i brži način izvođenja koda. Drugo u mesh klasu ubaciti boolean vrijednost za render ili not render, tako recimo nam to može kasnije poslužiti za neke efekte ( OC ili LOD ) tipa da kada renderirat mesh, to recimo izvedemo preko super klase za slanje poruka, message sistem.
Kažem ispravite me ako sam u krivom.

 

 

Ha mislim da sam u krivom jer stvar če se reflektirati kroz tree, te ako još top of tree stavimo render moglo bi doć do zagušenja :) 

Sad pručavam  malo generička stabla u C++-u i vodim se primerima Billa Budge-a iz Electronic Arts-a i milsim da počinjem kužiti što Deus hoće napraviti, kažem mislim al nisam siguran, fali mi ona mala iskra da mi razbistri sliku.

 

PS.

Sorry svima na demantiranju samog sebe :)

 

 

 

http://graffiti-jam.blogspot.com/
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
Programko kaže...

Možda griješim al vidim nekoliko potencijalnih problema u Mesh klasi koji bi mogli isplivati u budučnosti. 1) Mislim da bi Render funkcija trebala biti izvan te klase, tako da se mogu implementirati i drugi grafički API-ji? 2) Mislim da bi trebali koristiti svoje klase za matrice tako da kod bude više reusable, tako da npr klasa Mesh ne ovisi o OpenGL funkcijama ?

woodgamesfx kaže...
Ovo ima logike Programko, recimo render ako ostane unutar mesh klase definitivno ograničava neke stvari, ima rješenja gdje se za svaki pojedini grafički api izvodi drugi mesh, tj render mesh-a . Sam API se detektira prije main-loop funkcije dal preko odabira korisnika ili preko detekcije grafičkog adaptera te na taj način odredi " najbolji" render API za mesh. recimo radio sam s jednim SDK-om koji je imao tako definirano DX mesš, GL mesh, zatim skinned mesh i solid mesh. Znaći ono što ja predlažem da se izvuće render klasa, koja preko verticesa mesha radi rednder nad meshom, jer manje više i DX i GL barataju kroz vertices arrayeve, ispravite me ak sam u krivom jer već dugo nisam radio direktno na razini Grafičkog API-a.

Dobra poanta od oboje, sve sam ja to razradio u tekstu tutoriala kroz nekoliko prakticnih naputaka:

- ne razmisljati unaprijed - tek kad se problem pojavi. Sad je primarni fokus iscrtati sto god na ekran.

- maleni naputak o tome kako ce Render metoda primati Renderer interface, tocno kako je woodgamesfx predlozio

 

Samo pogledajte tekst :-)

Crank1d kaže...

Ovo je izvrsno! Svaka čast. Smijeh

Jesi možda razmišljao da cijeli projekt pretvoriš u open-source engine i da mu daš neko ime, pa da bude konkurencija Irrlicht-u, OGRE-u ili OpenSceneGraph-u?

Ma, ne bas, jer razviti nesto sto bi bilo pandan tim engineima bi bio totalni overkill. Pazi, vec smo na lekciji 6, a nismo niti iscrtali nista na ekran. Do neke lekcije 100 bi mozda dosli na pola puta do nekog od tih enginea, tako da se stvarno ne isplati. Kod cu staviti na neki opensource repozitorij kako je Programko predlozio (na kraju krajeva copy pasteam ovdje sve :-D), no u praksi, cilj tutoriala je napraviti maleni, reusabilni, prosirivi framework za scenegraph, koji kasnije bilo tko moze prosirivati svojim idejama i funkcijama (i, uz dobru volju, postati u ovaj topic 'nastavak' tutoriala)

 

woodgamesfx kaže...

Ha mislim da sam u krivom jer stvar če se reflektirati kroz tree, te ako još top of tree stavimo render moglo bi doć do zagušenja :) 

Sad pručavam  malo generička stabla u C++-u i vodim se primerima Billa Budge-a iz Electronic Arts-a i milsim da počinjem kužiti što Deus hoće napraviti, kažem mislim al nisam siguran, fali mi ona mala iskra da mi razbistri sliku.

Zapravo, na vrhu hijerarhije ide vrlo jednostavni IRenderable interface, sa jednom metodom:

void Render(IRenderer& renderer) const;ali o to cemo dodati kad stignemo do dijela da trebamo virtualno rendati cijelo stablo :-)

 

 

Kao i uvijek, hvala na konstruktivnim komentarima, prijedlozima i idejama.

 

@Woodgamesfx,

hvala puno na WinMain cpp-u! Spasio si mi posla kopanja po WinAPI-u da sastavim nesto svoje :-D

 

Edit:

Um... nestalo. Mozes li dodati opet, molim te?

I have got no money, I have got no power, I have got no fame... I have my strong beliefs...
Poruka je uređivana zadnji put uto 14.9.2010 15:09 (Deus ex machina).
16 godina
neaktivan
offline
[Tutorial] Izrada 3D/scenegraph enginea

@Woodgamesfx: daj postaj iznova svoj kod. U trenutku brisanja, kada sam ga upitao zna li da drugi postaju tutoriale, DeusEx nije znao što piše, a ja sam krenuo obrisati, međutim, nakon što je promotrio kod i skužio da je koristan, već je bilo kasno.

 

Isprika. :)

Pravi znak inteligencije nije znanje, već mašta - Albert Einstein
Poruka je uređivana zadnji put uto 14.9.2010 15:16 (naxeem).
Moj PC  
3 0 hvala 0
14 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea

Nema problema, ali pošto sam sad na Mac-u ne mogu doć do koda , kod mi trenutno nije dostupan :( , nego ako nije kasno mogu sutra ujutro staviti kod. Mada nije ništa spektakularno več je rijeć o bazičnom GLUT templateu za Win forms . 

PS.

Kad uhvatiom vremena probat ču , naravno uz pomoć kolega s foruma, portat ovaj Deusov projekt na Objective C sa OpenGL ES API-jem jer osobno meni bi bio korisniji u tom obliku  :) , mada upozoravam u posljednje vrijeme ne radim direktno s C-om niti C++ tako da očekujte "glupa" pitanja. Kažem probat ču ali ne garantiram uspjeh jer jedino i zadnje što sam radio u Objective C-u je bila igra puzzle za iPhone, projekti na kojema trenutno radim koriste skriptne jezike JS i C# , i moje programiranje trenutno i zadnjih više pola godine je najviše vezano uz njih, što je svima jasno da je velika razlika od nativnog C++-a ili C-a.

 

 

http://graffiti-jam.blogspot.com/
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
Ako trebas pomoc u object c-u, samo se javi... ipak pisem u njem iPhone aplikacije i razumijem se dosta...
In Control
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
woodgamesfx kaže...

C++ tako da očekujte "glupa" pitanja. Kažem probat ču ali ne garantiram uspjeh jer jedino i zadnje što sam radio u Objective C-u je bila igra puzzle za iPhone, projekti na kojema trenutno radim koriste skriptne jezike JS i C# , i moje programiranje trenutno i zadnjih više pola godine je najviše vezano uz njih, što je svima jasno da je velika razlika od nativnog C++-a ili C-a.

Nema glupih pitanja!

 

EnlightenedPhoenix kaže...
Ako trebas pomoc u object c-u, samo se javi... ipak pisem u njem iPhone aplikacije i razumijem se dosta...

Ako moze neki topic ovdje na forumu, sa zanimanjem bi pratio jer nisam bas nikad radio s objective-c om.

I have got no money, I have got no power, I have got no fame... I have my strong beliefs...
14 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
EnlightenedPhoenix kaže...
Ako trebas pomoc u object c-u, samo se javi... ipak pisem u njem iPhone aplikacije i razumijem se dosta...

 

Prije svega ispričavam se ako je ovo oftopic što ču sada napisati, ovako ovdje me javiše brine , kada pričamo o objective c portu , je pravilno brisanje smeća i curenje memorije, jer to zna bit pain in the ass , recimo pošto je ovdje rijeć o gomili tj uskoro će doć do gomile isprepletanja u kodu nepravilno dealociranje memorije moglo bi bit katastrofično za samu aplikaciju. Ok C++ ima destruktore objekata, ali Objective C to ima malo "lošije" i nelelegantno riješeno. Kažem od pošetka treba brinuti brigu o memoriji kada je riječ o Objective C-u. Sve u svem treba probat pa vidjet. naravno moguće je isto prebaciti u C++ tj ostaviti izvorno ovako pošto je C++ izvorno podržan za XCode, te riješiti se gore možebitnih problema.

Treba probat pa vidjet :) , sve  u svem može ispast nešto korisno , i hvala na ponudi.

 

Sada da se vratim OnTopic :

 

Deus sorry ali dal možeš reć do koje razine namjeravaš ić s ovim projektom, pitam te ovo iz razloga jer koliko sam skužio za sada si napravio :

korisnički definirani tip Vertices , klasu objekt , definirao si mesh i definirao si aritmetiku , definirao si arhitekturu ( generičko stablo kao konstrukciju za pozivanje operacija nad elementom, tj verticesima, verticese sakupljaš preko array-a  ) , logično sada da ovome daš neki smiso krečeš na mesh format, te si se odlučio za Collada format za učitavanje vanjske strukture elemenata. Nakon toga dal češ krenuti na I/O sistem ili na proširavanje operacija nad elementima tipa ugrađivanje tj nadopunjavanje mesh-a sa informacijama o UV-ima . E sad što nakon  toga ? Neki ovdje predlažu da se izradi novi OGRE, što je po meni besmisleno , ne iz razloga što već postoji jedan OGRE već iz razloga što ljudi općenito ne kuže da je OGRE grafički framework a ne game engine i da bi se bilo što iz OGRE-a smisleno izvuklo treba mnogo posla, a razlika od jednog do drugog je ogromna. Moj prijedlog i konstatacija je da od ovoga napraviti nešto smisleno je jedino moguče ako se previše ne uđe u jedno područje npr. implementaciju grafičkog pipeline-a ( što koliko sam skužio mnogi jedva očekuju )  već da se fundamentalno te stvari ostave otvrorene i da se krene na kreiranje osnovne fizike ( collision sistema za prvu ruku raycast, pa onda bounding volumeni, te na kraju triggering system ), pa message sistema, I/O -ta , AI-a ( za početak napraviti bazu za neki FSM sistem ), zatim se vratiti opet na render dio, pa optimizaciju itd.... Eto zbilja bih voli vidjeti mesh over highmap na domaći način :) Kažem od ovoga može ispast nešto genijalno, i ako je netko u stanju to napraviti , a kasnije rukovoditi projektom to si onda zasigurno ti, jer način na koji barataš tehnikom je impresivan, te usput imaš smisla znanje prenjet drugima.

Eto možda ovo djeluje malo filozofski ali ne znam ja sam takav da prije bilo čega moram imat jasnu sliku o nečem i organizacijski posloženo. 

 

 

 

 

 

http://graffiti-jam.blogspot.com/
15 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
woodgamesfx kaže...

Deus sorry ali dal možeš reć do koje razine namjeravaš ić s ovim projektom, pitam te ovo iz razloga jer koliko sam skužio za sada si napravio :

korisnički definirani tip Vertices , klasu objekt , definirao si mesh i definirao si aritmetiku , definirao si arhitekturu ( generičko stablo kao konstrukciju za pozivanje operacija nad elementom, tj verticesima, verticese sakupljaš preko array-a  ) , logično sada da ovome daš neki smiso krečeš na mesh format, te si se odlučio za Collada format za učitavanje vanjske strukture elemenata. Nakon toga dal češ krenuti na I/O sistem ili na proširavanje operacija nad elementima tipa ugrađivanje tj nadopunjavanje mesh-a sa informacijama o UV-ima . E sad što nakon  toga ? Neki ovdje predlažu da se izradi novi OGRE, što je po meni besmisleno , ne iz razloga što već postoji jedan OGRE već iz razloga što ljudi općenito ne kuže da je OGRE grafički framework a ne game engine i da bi se bilo što iz OGRE-a smisleno izvuklo treba mnogo posla, a razlika od jednog do drugog je ogromna. Moj prijedlog i konstatacija je da od ovoga napraviti nešto smisleno je jedino moguče ako se previše ne uđe u jedno područje npr. implementaciju grafičkog pipeline-a ( što koliko sam skužio mnogi jedva očekuju )  već da se fundamentalno te stvari ostave otvrorene i da se krene na kreiranje osnovne fizike ( collision sistema za prvu ruku raycast, pa onda bounding volumeni, te na kraju triggering system ), pa message sistema, I/O -ta , AI-a ( za početak napraviti bazu za neki FSM sistem ), zatim se vratiti opet na render dio, pa optimizaciju itd.... Eto zbilja bih voli vidjeti mesh over highmap na domaći način :) Kažem od ovoga može ispast nešto genijalno, i ako je netko u stanju to napraviti , a kasnije rukovoditi projektom to si onda zasigurno ti, jer način na koji barataš tehnikom je impresivan, te usput imaš smisla znanje prenjet drugima.

Eto možda ovo djeluje malo filozofski ali ne znam ja sam takav da prije bilo čega moram imat jasnu sliku o nečem i organizacijski posloženo. 

U pravu si, nema smisla razvijati novi 3D engine, ima ih puno boljih vec gotovih i to u opensourceu.

 

Pa, prvi blizi fokus ce biti na prosirivanje samog scenegrapha da se dodaju osnovne mogucnosti teksturiranja, vertex-normala, blending, materijale i ostale stvari koje cine jedan fixed-pipeline renderer. Onda treba dodati kamere i svijetla.

Kad budemo mogli zrendati jedan model iz Collade ravno u engine, onda mozemo dalje jer je onda nekakva baza gotova.

Onda bi trebalo napraviti proof of concept i implementirati neki drugi renderer, spominjao se softwareski raytracer koji je meni zanimljiv iz vise razloga, primarno zato jer ne moram switchati u windowse, pa onda zato jer je softwareski (nema pilane s driverima), pa onda zato jer nije rasterizator nego drugacija tehnika.

 

Ima netko tko bi proucio photon mapping? :-D

 

Onda cemo to refactorirati tako da bude prijemcljivije shaderima. Pa onda malo prtljati sa shaderima, recimo dodati per-pixel lighting, uv parallax mapping... pa dynamic ambient occlusion (tako da lijepo ubijemo graficku na koljena :-D), pa onda deferred shading pa onda mozda deferred lighting (potonji nisam jos probao napraviti :-\), pa onda mozda screen space ambient occlusion.

 

Pa onda nesto postprocessing efekata, recimo HDR, tone mapping...

Ima materijala ko u prici, a u biti ono sto mene najvise interesira je proceduralna generacija (geometrija, animacija, teksture a i content) tako da brijem da cu jako brzo, nakon sto rijesimo osnovne shadere, odcijepiti novi topic u to...

 

Nisam planirao nista u vezi newtonian fizike, ali planirao sam 3D collision detection preko boundarya i preko triangleova.

I have got no money, I have got no power, I have got no fame... I have my strong beliefs...
16 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
woodgamesfx kaže...

projekti na kojema trenutno radim koriste skriptne jezike JS i C# , i moje programiranje trenutno i zadnjih više pola godine je najviše vezano uz njih, što je svima jasno da je velika razlika od nativnog C++-a ili C-a.

 

 

JavaScript je skriptni jezik, ali C# nije skriptni jezik. Ni blizu. Jesi li siguran da koristiš C#? - C# je jako sličan Javi - punokrvni objektni jezik na temeljima C++ sintakse, koji se JIT/FTC kompajlira u nativni kod iz svog asemblerolikog jezika po imenu CIL, a izvodi pod CLR-om.

 

S obzirom da mu je to posao i da ima visoku poziciju, nije ni čudno da barata odlično. Jedini je na ovom forumu profesionalac u tome.

Mislim da nije točno da je pogrešno ići na svoj renderer.

Naime, od same strukture enginea nije problem krenuti na renderer, jer se današnji rendereri ionako svode na shadere. Ne mora napisati tisuću shadera, ali postaviti renderer bazu nije prevelik problem i manji je posao od same jezgre enginea.

Pravi znak inteligencije nije znanje, već mašta - Albert Einstein
Poruka je uređivana zadnji put uto 14.9.2010 21:47 (naxeem).
14 godina
neaktivan
offline
RE: [Tutorial] Izrada 3D/scenegraph enginea
naxeem kaže...
woodgamesfx kaže...

projekti na kojema trenutno radim koriste skriptne jezike JS i C# , i moje programiranje trenutno i zadnjih više pola godine je najviše vezano uz njih, što je svima jasno da je velika razlika od nativnog C++-a ili C-a.

 

 

JavaScript je skriptni jezik, ali C# nije skriptni jezik. Ni blizu. Jesi li siguran da koristiš C#? - C# je jako sličan Javi - punokrvni objektni jezik na temeljima C++ sintakse, koji se JIT/FTC kompajlira u nativni kod iz svog asemblerolikog jezika po imenu CIL, a izvodi pod CLR-om.

 

S obzirom da mu je to posao i da ima visoku poziciju, nije ni čudno da barata odlično. Jedini je na ovom forumu profesionalac u tome.

Mislim da nije točno da je pogrešno ići na svoj renderer.

Naime, od same strukture enginea nije problem krenuti na renderer, jer se današnji rendereri ionako svode na shadere. Ne mora napisati tisuću shadera, ali postaviti renderer bazu nije prevelik problem i manji je posao od same jezgre enginea.

 

Da siguran sam da koristim sintaksu C# za skriptiranje :)

 

 

 

http://graffiti-jam.blogspot.com/
Nova poruka
E-mail:
Lozinka:
 
vrh stranice