|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 10.07.2003, 15:23 Titel: 2D Ansicht im Level-Editor |
|
|
Hi!
Ich arbeite ja derzeit an dem 3D Level Editor für CW und habs auch schon soweit, dass man Quader erstellen und auch in einer 3D Ansicht sehen kann. Ich habe aber ein paar kleinere Probleme mit den 2D Ansichten des Editors:
- Ich kann erstellte Blöcke in ihnen nicht sehen, bzw. muss erstmal die Kamera auf gut Glück verschieben um sie sehen zu können.
- Mit einer Orthogonalen Projektionsmatrix sehe ich überhaupt nichts mehr (oder es ist das erste Problem und ich hab nur die Quader nicht gefunden )
Ich denke das erste Problem liegt daran, dass ich die Quader wie folgt erstelle:
- Bei einem Mausklick mit der Linken Taste, wird die Position des Mauszeigers (in Client Koordinaten des 2D Viewports, in den geklickt wurde) in einen 3D Start Vektor gespeichert.
- Wird die Maustaste losgelassen, so wird die Position der Maus in einen 3D End Vektor gespeichert.
- Dann werden aus diesen 2 Vektoren die 8 Vertices des Quaders berechnet.
Ich denke man muss die Client Koordinaten vieleicht noch irgendwie in die Koordinaten des 3D Raums umwandeln, weis aber nicht wie genau.
Ich weis nicht genau welche Informationen ihr noch braucht, deswegen schreib ich vorerst mal noch keine weiteren hin und warte dann auf "Informations-Anforderungen"
Cu,
VH |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 10.07.2003, 20:07 Titel: |
|
|
Ich habs bei meinem Leveleditor mit zwei Scrollvariablen gemacht(falls dein Level größer ,als ein Bildschirm ist).
ScrollingX und ScrollingY
Am Anfang stehen die beiden auf 0.
Wenn man nun z.B. die rechte Cursortasten drückt, dann wird ScrollingX erweitert und das gesamte Bild nach links bzw. die Kamera nach rechts verschoben.
Bei einem Mausklick nimmst du dann die Koordinaten und addierst die beiden Scrolling-variablen. Dann hast du die korrekte Position im Level. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 11.07.2003, 11:10 Titel: |
|
|
Bei mir sieht das so aus (bei der 2D Top Ansicht):
Ich setze erstmal die Position der Kamera, so dass sie 100 Einheiten über dem Boden "schwebt" und dann die Koordinaten des Looking Points (wo die kamera hinguckt), sodass sie direkt nach unten auf den Ursprung guckt.
Code: |
//Top ansicht [1] Kamera Position [0]
vcCameras[1][0].x = 0.0f;
vcCameras[1][0].y = 100.0f;
vcCameras[1][0].z = 0.0f;
//Top ansicht [1] Kamera LP [1]
vcCameras[1][1].x = 0.0f;
vcCameras[1][1].y = 0.0f;
vcCameras[1][1].z = 0.0f;
|
Dann speichere ich den OffsetX und OffsetY der Kamera position im Bezug auf den Linken oberen Fensterrand des 2D Top Viewports (0,0):
Code: |
//Top Offset: (hier der Index Null, da der Perspective VP nich mitgezählt wird
iOffset[0][0] = (int)(VP_Top->ClientWidth /2); //X-Offset = Breite / 2
iOffset[0][1] = (int)(VP_Top->ClientHeight/2); //Y-Offset = Hoehe / 2
|
Die Kamera soll sich also im Fenster Mittelpunkt befinden. Wenn ich nun einen Punkt erzeuge (Beispielsweise bei dem linken Mausklick in den Viewport) dann mach ich das so:
Code: |
vcStart.x = X - iOffset[0][1]; //Mausposition (Client) X - OffsetX = PunktX
vcStart.y = 5.0f; //Standart Hoehe des Quaders = 5 Einheiten
vcStart.z = Y - iOffset[0][0]; // Mausposition (Client) Y - OffsetY = PunktY
|
Das sollte doch eigentlich funktionieren? |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 15.07.2003, 10:13 Titel: |
|
|
Hi Leuts!
Ich hab das mit den 2D Side und 2D Top Viewports jetzt hinbekommen, läuft pefekt. Top Läuft aber nicht, und ich habe eine Vermutung woran das liegen kann, dass ich dort ÜBERHAUPT nichts sehe. Die Kamera und der Looking Point wurden ja wie im letzten post gezeigt positioniert. Aber ich denke man muss beim erstellen der Viewmatritze was verändern.
Code: |
D3DXMATRIX *D3DXMatrixLookAtLH( D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pEye,
CONST D3DXVECTOR3 *pAt,
CONST D3DXVECTOR3 *pUp
);
|
Das ist ja die Funktion aus den D3D Extensions. Der dritte Parameter gibt ja die Weltausrichtung an. Um ganz ehrlich zu sein Raff ich den Parameter nich ganz und hab bis jetzt immer (0,1,0) übergeben. Kann es sein, dass ich für meinen Top Viewport was anderes Übergeben muss?
Oder habt ihr eine andere Idee, warum das dort nicht funktioniert?
Wollt ihr das anschaulicher haben? dann kann ich euch die derzeitige editor version schicken.
Thx |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 15.07.2003, 10:24 Titel: |
|
|
Hallo,
der Parameter gibt an in welche Richtung du guckst. Bei (0,1,0) guckst du nach oben, wenn mich nicht alles täuscht.
Christian |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 15.07.2003, 10:42 Titel: |
|
|
Ich denke da irrst du dich (bin mir aber auch nich sicher ). Folgendes steht im DX9 SDK:
DX-SDK hat Folgendes geschrieben: | Pointer to the D3DXVECTOR3 structure that defines the current world's up, usually [0, 1, 0]. |
Was soviel heist wie:
"Zeiger auf die D3DXVECTOR3 Struktur, welche den aktuellen Welt-Hoch-Vektor beinhaltet. Normalerweise [0, 1, 0]"
Aber ich kann mich da auch irren. Denkt ihr das es an dem Parameter liegt, dass ich da nichts sehe, oder habt ihr andere vermutungen? |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 15.07.2003, 10:42 Titel: |
|
|
Ich denke da irrst du dich (bin mir aber auch nich sicher ). Folgendes steht im DX9 SDK:
DX-SDK hat Folgendes geschrieben: | Pointer to the D3DXVECTOR3 structure that defines the current world's up, usually [0, 1, 0]. |
Was soviel heist wie:
"Zeiger auf die D3DXVECTOR3 Struktur, welche den aktuellen Welt-Hoch-Vektor beinhaltet. Normalerweise [0, 1, 0]"
Aber ich kann mich da auch irren. Denkt ihr das es an dem Parameter liegt, dass ich da nichts sehe, oder habt ihr andere vermutungen? |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 15.07.2003, 11:39 Titel: |
|
|
Ja, das ist aber der 4. und nicht der 3. Parameter..... |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 15.07.2003, 11:47 Titel: |
|
|
1, 2, 3, 4... naja... stimmt, du hast recht das hab ich alles in der Grundschule gelernt und die ist sooo lange her, muss ich nich mehr wissen
Naja, als dritten Parameter hab ich, wie auch bei den Perspective-, Side- und Top Viewports den Looking Point der jeweiligen Kamera angegeben. Bei allen anderen sehe ich alles Perfekt. |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 15.07.2003, 11:50 Titel: |
|
|
Hast du mal als LookAt Vektor (0,-1,0) probiert? Wie sind denn die anderen Parameter der Funktion? |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 15.07.2003, 11:54 Titel: |
|
|
Ich habe folgenden Code:
Code: |
D3DXMatrixLookAtLH( &matViewT, //View matritze für den Top VP
&vcCameras[1][0], //Top VP Kamera position
&vcCameras[1][1], //Top VP kamera Looking point
&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); //Welt UP Vektor
|
Es geht auch mit (0, -1, 0) nicht |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 15.07.2003, 11:59 Titel: |
|
|
Verrate doch mal was in den Feldern für Werte stehen... |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 15.07.2003, 12:02 Titel: |
|
|
wie oben angegeben:
Code: |
//Top ansicht [1] Kamera Position [0]
vcCameras[1][0].x = 0.0f;
vcCameras[1][0].y = 100.0f;
vcCameras[1][0].z = 0.0f;
//Top ansicht [1] Kamera LP [1]
vcCameras[1][1].x = 0.0f;
vcCameras[1][1].y = 0.0f;
vcCameras[1][1].z = 0.0f;
|
Für den Perspective Viewport sieht das dann so aus:
Code: |
vcCameras[0][0].x = 0.0f;
vcCameras[0][0].y = 0.0f;
vcCameras[0][0].z = -100.0f;
vcCameras[0][1].x = 0.0f;
vcCameras[0][1].y = 0.0f;
vcCameras[0][1].z = 0.0f;
|
|
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 15.07.2003, 12:18 Titel: |
|
|
Ich habe es gerade mal ausprobiert. Ich bekomme so einen Blick von oben in die Szene. Die Matrix setzt du ja (->SetTransform(::) ?
Christian |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 15.07.2003, 12:27 Titel: |
|
|
Ja, ich setze die Matrix:
Code: |
lpDevice[ 1 ]->SetTransform( D3DTS_VIEW, &matViewT );
lpDevice[ 1 ]->SetTransform( D3DTS_PROJECTION, &matProjectionT );
|
Dann kann es schonmal nicht an der Matrix liegen, an der Projektionsmatrix übrigens auch nicht, da ich sie genau so setze und erzeuge, wie auch bei Side und Front und dort klappt alles wie gewollt. Auch die Renderfunktion ist identisch mit denen von Side und Front:
Code: |
/*
lokale variablen:
*/
D3DXMATRIX matWorld;
HRESULT hr = 0;
/*
los gehts!
*/
lpDevice[1]->BeginScene();
D3DXMatrixTranslation( &matWorld,
vcCameras[1][1].x,
vcCameras[1][1].y,
vcCameras[1][1].z );
lpDevice[ 1 ]->SetTransform( D3DTS_WORLD, &matWorld );
hr = lpDevice[ 1 ]->SetStreamSource( 0, lpVB[1], 0, sizeof(CVertex) );
hr = lpDevice[ 1 ]->SetIndices( lpIB[1] );
if(FAILED( hr=lpDevice[ 1 ]->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,
0, 0,
iNum_Verts,
0, iNum_Tris ) ) )
{
return;
}
lpDevice[ 1 ]->EndScene();
lpDevice[ 1 ]->Present( NULL, NULL, NULL, NULL );
|
Alles wird erfolgreich ausgeführt. Nur man sieht halt nichts
Was anderes mach ich gar nicht.
Alle Renderstates sind genauso gesetzt wie bei Side und Front, ich erzeuge das Device für das richtige Fenster, etc.
willste mal ne kleine Version vom Editor haben, damit du das mal life miterleben kannst? |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|