3D Voxel Modell darstellen
-
das sollte mit wenig overhead gehen.
schnapp dir z.B. pixeltoaster, damit kannst du pixel auf dem bildschirm darstellen.als naechstes zechnest du einfach einen layer. das ist so einfach die fuer y und x je einem loop der durch das bild durchgehen und pro pixel dann ein voxels eines layers ausliest und auf den bildschrim darstellst.
naechster schritt ist das du dir einen offset fuer die camera in x|y speicherst mit dem du die voxel ausliest.
und zuletzt legst du dir noch eine skalierung mit der du x|y multiplizierst bevor du den offset subtrahierst und ein voxel ausliest.
-
Hi rapso,
danke für deine Tipps!
Also ich habe es jetzt einen 3D Array ausgelesen und habe es geschafft eine x/z Schicht auszulesen und sogar darzustellen !!! *JUUHHUU*
Das Darstellen habe ich allerdings noch sehr primitv gemacht. In OnDraw:fCellSize=2; //auflösung des Voxelmodells; for(int z = 0; z < m_NZ; ++z) { for(int x = 0; x < m_NX; ++x) { iWert=m_data_array[x][iFester_y_wert][z]; if(iWert==0) continue; int x_size = iFrameOffest[0]+(GLfloat)(-(m_NX*fCellSize)/2 + fCellSize*x); int z_size = iFrameOffest[2]+(GLfloat)(-(m_NZ*fCellSize)/2 + fCellSize*z); //weiss vorher welche Materialien es gibt und habe ein Array "colors" aus farben für alle Materialien angelegt CPen qCirclePen(PS_SOLID, 7, colors[iWert]); CPen* pqOrigPen = m_pDC->SelectObject(&qCirclePen); m_pDC->Rectangle(x_size,z_size,x_size+fCellSize,z_size+fCellSize); } }
Aber es dauert bis zu 7 Sek bis die Schicht dargestellt wird (wahrscheinlich weil ich das so ineffizient darstelle)
pixeltoaster -> gibt es irgendwo eine doku oder so - habe auf github nicht sehr viel erklärung gefunden
Läuft es nur mit directx oder kann man auch ohne dx9 auskommen?
Habe versucht ein Beispielsprojekt zu starten und habe nicht gebaut bekommen:
**
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppBuild.targets(1137,5): warning MSB8012: TargetPath(C:\ProjectTests\pixtoaster\PixelToaster\projects\Debug\ExampleFloatingPoint.exe) does not match the Linker's OutputFile property value (C:\ProjectTests\pixtoaster\PixelToaster\build\ExampleFloatingPoint-Debug.exe). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Link.OutputFile).
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppBuild.targets(1139,5): warning MSB8012: TargetName(ExampleFloatingPoint) does not match the Linker's OutputFile property value (ExampleFloatingPoint-Debug). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Link.OutputFile).
1>ExampleFloatingPoint.obj : error LNK2019: Verweis auf nicht aufgel÷stes externes Symbol ""class PixelToaster::DisplayInterface * __cdecl PixelToaster::createDisplay(void)" (?createDisplay@PixelToaster@@YAPAVDisplayInterface@1@XZ)" in Funktion ""public: __thiscall PixelToaster::Display::Display(char const * const,int,int,class PixelToaster::Output,class PixelToaster::Mode)" (??0Display@PixelToaster@@QAE@QBDHHVOutput@1@VMode@1@@Z)".
1>..\build\ExampleFloatingPoint-Debug.exe : fatal error LNK1120: 1 nicht aufgel÷ste Externe**Das mit der Camera habe ich auch verstanden - werde es so umsetzen.
Die Skalierung würde ich mit dem fCellSize machen. Hat bis jetzt ganz gut geklappt
-
hilft mir bitte, ich kriege piexeltoaster nicht zum laufen
-
- erstell dir ein neues projekt mit deiner programmierumgebung.
- kopiere ein pixeltoaster sample source
- baue
- falls <d3dx.h> nicht gefunden wird, kommentiere die zeile einfach aus in pixeltoaster
- falls eine andere header datei nicht gefunden wird von directX, musst du noch extra den path zum directX sdk setzen.
- baue nochmal
- starteich denke unter windows laeuft pixeltoaster nur mit directX.
7sekunden sind definitiv zu lang fuer ein bild, falls du nur das zeichnen misst und nicht auch noch das lesen der datei. hast du im debug gebaut?
-
HI - also ich habe ein neues Consolen-Projekt erstellt.
in der ConsoleApplication3.cpp:#include "stdafx.h" #include "PixelToaster.h" using namespace PixelToaster; int main() { const int width = 320; const int height = 240; Display display( "Fullscreen Example", width, height, Output::Fullscreen ); vector<Pixel> pixels( width * height ); while ( display.open() ) { unsigned int index = 0; for ( int y = 0; y < height; ++y ) { for ( int x = 0; x < width; ++x ) { pixels[index].r = 0.8f + y * 0.0015f; pixels[index].g = 0.2f + y * 0.00075f; pixels[index].b = 0.1f + y * 0.0005f; ++index; } } display.update( pixels ); } } int _tmain(int argc, _TCHAR* argv[]) { return 0; }
Die Externen Bibliotheken verlinkt.
und gebaut.Dann kommt sowas raus:
1>LINK : warning LNK4067: Mehrdeutiger Einstiegspunkt; "mainCRTStartup" ausgewählt.
1>ConsoleApplication3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""class PixelToaster::DisplayInterface * __cdecl PixelToaster::createDisplay(void)" (?createDisplay@PixelToaster@@YAPAVDisplayInterface@1@XZ)" in Funktion ""public: __thiscall PixelToaster::Display::Display(char const * const,int,int,class PixelToaster::Output,class PixelToaster::Mode)" (??0Display@PixelToaster@@QAE@QBDHHVOutput@1@VMode@1@@Z)".
1>C:\projects\ConsoleApplication3\Debug\ConsoleApplication3.exe : fatal error LNK1120: 1 nicht aufgelöste ExterneBin ich zu blöd um ein simples Beispiel einzufügen oder hängt es am Windows?
Bzgl. der 7 sek - ja ich baue alles im debug.
Danke
-
MishaP schrieb:
...
1>LINK : warning LNK4067: Mehrdeutiger Einstiegspunkt; "mainCRTStartup" ausgewählt.
...
Bin ich zu blöd um ein simples Beispiel einzufügen oder hängt es am Windows?fischen funktioniert folgender massen, du rufst die seiten www.google.com auf, dann kopierst du deine fehlermeldung rein und dann schaust du wie die vielen leute es geloest haben die vorher denselben fehler hatten.
Bzgl. der 7 sek - ja ich baue alles im debug.
debug benutzt man zum debuggen, nicht zum performance messen. sonst muesstest du ja im release debuggen(?).
-
vielen Dank - habe es jetzt hin gekriegt!
ich habe mir die Beispiele angeschaut und wie es aussieht wird hier immer das Display objekt zur Darstellung verwendet.
Ich habe gegoogelt aber leider nicht gefunden - wie müsste ich das konfigurieren (bzw. welch funktion müsste ich nutzen) um es bei MFC an ein Pane anzuwenden?
Oder ist es nur für die Konsolenprojekte gedacht?
Danke,
gRüsse - Mischa
-
ist es überhaupt möglich das im MFC zu nutzen?
...habs immer noch nicht hin geriegt
-
Willst du MFC als Framework nutzen oder eines empfohlen bekommen?
-
ich muss leider mfc nutzen
gehts damit nicht?