Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 19:12

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Selection oder berechnen?
BeitragVerfasst: So Dez 26, 2004 16:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo.

Ich habe jetzt mir per Random ein PlanetenSystem erstellt. (C#)
Diese Render ich (momentan als Punkt)

Jetzt möchte ich sie anklicken können.
Die Frage ist, mit Selection oder lieber berechnen?

Das muss doch zu berechnen sein, wenn der Planet ja rund ist?

Habe:
x,y,z Position
Durchmesser

Wie kann ich das dann berechnen ob ich mit der Maus da drauf geklickt habe?
Oder meint ihr einfach den Selektions Modus nehmen?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Selektion ist vermutlich weniger Denkarbeit.
Bei Verwendung des Selektionsmodus unter .Net muß man beachten, dass man das Array vor der Übergabe an glSelectBuffer festhält, damit der Garbage Collector es nicht während des Renderns verschiebt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 20:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Endschuldige, aber ich verstehe das nicht.
Habe bisher noch kein Buch über C# .NET
kannst mir also jetzt erzählen was de willst ;)

Habe ja auch noch net lange angefangen mit C#, deshalb, so schnell geht das net mit Buch suchen/Geld haben/Kaufen.
Und Tutorials sind net so nice :-/
Ich les das lieber im Bett liegend ;)

...

Bisher versucht es in C# zu übertragen den Selection Source, bis auf die GLUint ist der Rest gemacht (weiß nur net obs geht)
Aber das mit dem GLUint ist doof, wie heisst das in deinem "Header"? GLU.int net ... gl.uint auch net ... GLUint auch net?!

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 21:01 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man braucht ja wie in Delphi ein Array in das das Ergebnis geschrieben wird.
Da kann man einfach ein Array vom Type uint[] nehmen.

uint[] Puffer=new uint[256];


Vor dem Rendern im Selection Modus erzeugt man ein GCHandle mit dem Parameter pinned, damit das Array während des Renderns nicht verschoben werden darf.

GCHandle h=GCHandle.Alloc(Puffer,GCHandleType.Pinned);

An glSelectBuffer übergibt man dann die Addresse des Arrays
gl.SelectBuffer(256,h.AddrOfPinnedObject());

....

Nach dem Aufruf von glRenderMode, wenn man sichergehen kann, dass die ausgewählten Objekte in dem Array stehen, gibt man das Handle dann wieder frei.

h.Free();

Danach liest man das Array ganz normal aus und der Rest funktioniert genauso, wie im Selection Tutorial für Delphi. Der einzige Unterschied ist das fixieren des Arrays, da der Garbage Collector in einem eigenen Thread läuft und theoretisch das Objekt verschieben kann, nachdem die Referenz an OpenGL übergeben wurde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 22:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
und was ist in deinem Header GLUint ? Also wie heisst des bei dir?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 22:18 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das heißt einfach uint in C#. Man kann in C# keine neuen Namen für Typen wie in Delphi mit z.B. GLUint=Cardinal deklarieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 22:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Dann gibts nur ein kleines Prob meinerseits.

Code:
  1.             getroffen = high(GLUint);                 //Höchsten möglichen Wert annehmen
  2.             zwert = high(GLUint);                     //Höchsten Z - Wert


muss ja dann

Code:
  1.             getroffen = high(uint);                 //Höchsten möglichen Wert annehmen
  2.             zwert = high(uint);                     //Höchsten Z - Wert


heissen.

Aber wie muss high heißen?
Wüsste jetzt auch net nach was ich bei google oder in der hilfe suchen solle.

EDIT: sorry, im zweiten Abschnitt nen fehler ...

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 22:33 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
high(gluint) ist in .Net uint.MaxValue .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 23:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Joa, das geht,
wollte dich das eigtl. net übersetzen lassen, aber:

gl.SelectBuffer(256, h.AddrOfPinnedObject());

Da gibts auch nen Error :-/

Error 1 The best overloaded method match for 'OpenGL.gl.SelectBuffer(int, uint[])' has some invalid arguments D:\C#\WindowsApplication2\WindowsApplication2\WindowsApplication2\Form1.cs 53 12

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 26, 2004 23:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ach ja,das habe ich später noch hinzugefügt. Lade dir mal die neuere Version oder füge einfach

Code:
  1.         [DllImport(DLLName, EntryPoint = "glSelectBuffer")]
  2.         public static extern void SelectBuffer(int size, IntPtr buffer);


ein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 27, 2004 18:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
:D

Warum meckert der bei dem Pointer?
In Delphi ist ein Pointer ja mit @ und in C# doch mit &, gell.

Code:
  1.             gl.GetIntegerv(gl.VIEWPORT, &viewport);      //Die Sicht speichern
  2.  
  3.             glu.PickMatrix(xs, viewport[3]-ys, 1.0, 1.0, &viewport);


in den beiden Zeilen kommt:

Error 1 Pointers and fixed buffers may only be used in an unsafe context D:\C#\WindowsApplication2\WindowsApplication2\WindowsApplication2\Form1.cs 52 40

Was soll das :-(

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 27, 2004 18:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
C# ist managed, d.h. eigentlich gibt es gar keine Pointer in bekanntem Sinne. Wenn man Zeiger nutzen will, dann muss man das in einem unsicheren Kontext machen (sagt dir der Kompiler ja auch). Also Anwendung unsafe kompilieren und auch dann entsprechend unsafe Namespace/Klasse/was auch immer nutzen.

Gehört aber zu den Grundlagen von C#, evtl. solltest du dir da mal ein passendes Buch besorgen (z.B. O'Reilly - C# Net In A Nutshell, gibts auch in Deutsch).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 27, 2004 21:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Statt den Zeigern nimmt man beim Viewport am besten ein int[] Array. Arrays werden nämlich als Zeiger übergeben und sind in C# immer Referenztypen wie in Delphi die dynamischen Arrays. Dafür gibt's auch extra eine Überladung von gl.GetIntegerv:

int[] viewport=gl.GetIntegerv(gl.VIEWPORT, 4);

Der letzte Parameter bei glu.PickMatrix ist deshalb auch extra ein int[] Array und daher paßt es dann.
glu.PickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 28, 2004 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Sodele.

Ich muss noch drann knappern.
Wobei Selektion immer schon so nen Thema war :-/

ich habe mal select auskommentiert und den MatrixMode auf MODELVIEW gestellt um zu sehen was da ab geht.
So sehe ich garnichts, anstatt 10 points mit size=6 aufem Schirm.
Wenn ich LoadIdentity wegmache und PickMatrix auch, dann sieht man punkte.
Aber im falschen Abstand (oder ich bin weiter rausgezoomt ?!)
Versteh ich aber net.
Dachte erst, liegt an meinen Mauskoordinaten, aber wenn die punkte netmal richtig angezeigt werden.

Code:
  1.         public uint Selection(int xs , int ys)
  2.         {
  3.  
  4.             uint[] puffer = new uint[256];
  5.             int[] viewport = gl.GetIntegerv(gl.VIEWPORT, 4);
  6.             int treffer;
  7.             uint getroffen;
  8.             uint zwert;
  9.  
  10.             GCHandle h = GCHandle.Alloc(puffer, GCHandleType.Pinned);
  11.             gl.GetIntegerv(gl.VIEWPORT, viewport);  
  12.             gl.SelectBuffer(256, h.AddrOfPinnedObject());
  13.  
  14.             //gl.RenderMode(gl.SELECT);            
  15.             gl.MatrixMode(gl.MODELVIEW);          
  16.             gl.PushMatrix();                                      
  17.             gl.LoadIdentity();                
  18.  
  19.             glu.PickMatrix(xs, viewport[3] - ys, 1.0, 1.0, viewport);
  20.             glu.Perspective(90, 1, 0.1, 100);
  21.  
  22.             renderer.RenderPlanetsForSelection();  
  23.            
  24.             //gl.MatrixMode(gl.PROJECTION);      
  25.             gl.PopMatrix();                          
  26.  
  27.             treffer = gl.RenderMode(gl.RENDER);      
  28.  
  29.             getroffen = uint.MaxValue;          
  30.             zwert = uint.MaxValue;                  
  31.             for (int i = 0 ; treffer < i ; i++ )
  32.             {
  33.                 if (puffer[(i * 4) + 1] < zwert)
  34.                 {
  35.                     getroffen       = puffer[(i*4)+3];
  36.                     zwert = puffer[(i * 4) + 1];
  37.                 }
  38.             }
  39.  
  40.             h.Free();
  41.             return getroffen;
  42.         }

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 02, 2005 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
weiß keiner was?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.023s | 16 Queries | GZIP : On ]