PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Manipulatoren in OPENGL ???


Phane01
05.03.2004, 08:35
Servus,
ich habe eine Frage. Ich möchte eine Anwendung (mit OPENGL Grafikbibliothek) entwickeln, mit welcher es möglich ist ein Objekt zu drehen (kein Problem), zu verschieben (auch kein Problem) und auf Mausklick entsprechen zu skalieren (vergrößern, verkleibnen u.s.w) --> GROSSES PROBLEM. Ich habe schon diverse Tools gefunden, wie z.B. Open Inventor, in welchen das ganze recht gut umgesetzt wurde. Jetzt meine Frage. Gibt es bereits in OPENGL eine oder mehrere Funktionen, mit denen sich so etwas umsetzen lässt???

Thank's Stephan


Scavi
05.03.2004, 13:50
glScalef(x,y,z); - damit kannste skalieren oder willste wissen, wie man Mausklicks abfängt ? Das geht leicht mit der WinAPI.

Phane01
08.03.2004, 13:32
Servus,
ja das mit den Mausklicks würde mir gleube ich weiterhelfen. Wichtig wie kann ich die Informationen zu einem bestimmten Objekt abrufen. Ich habe z.B. nen Würfel und ein Dreieck und möchte den Würfel skalieren.

Stephan

Scavi
08.03.2004, 13:41
Du solltest wahrscheinlich erstmal die Pipeline verstehen.
Du musst die Objekte nacheinander abarbeiten. Bsp:

glPushMatrix();
glRotatef(...);
glTranslatef(...);
glScalef(...);
//HIER JETZT DEN WÜRFEL MALEN
glPopMatrix();

glPushMatrix();
glRotatef(...);
glTranslatef(...);
glScalef(...);
//HIER JETZT DAS DREIECK MALEN
glPopMatrix();

Aber alles kann ich hier nicht erklären, guck mal auf http://www.opengl.org für weitere Infos. Weisst du wie man in Windows Nachrichten abfängt ?

Phane01
08.03.2004, 14:38
public void drawTriangle()
{
Gl.glLoadIdentity(); // zurücksetzen
Gl.glTranslatef(-0.8f,0.0f,0.0f); // Position
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glColor3f(1.0f,0.0f,0.0f); // Red
Gl.glVertex3f(0.5f, 1.0f, 0.0f);
Gl.glColor3f(0.0f,1.0f,0.0f); // Green
Gl.glVertex3f(0.0f, 0.0f, 0.0f);
Gl.glColor3f(0.0f,0.0f,1.0f); // Blue
Gl.glVertex3f(1.0f, 0.0f, 0.0f);
Gl.glEnd();
}

public void drawQuad()
{
Gl.glLoadIdentity(); // zurücksetzen
Gl.glTranslatef(-0.5f,-0.8f,0.0f);
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0.0f,1.0f,0.0f);
Gl.glVertex3f(0.0f, 0.0f, 0.0f);
Gl.glColor3f(0.0f,0.0f,1.0f);
Gl.glVertex3f(0.5f, 0.0f, 0.0f);
Gl.glColor3f(1.0f,0.0f,0.0f);
Gl.glVertex3f(0.5f, 0.5f, 0.0f);
Gl.glVertex3f(0.0f, 0.5f, 0.0f);
Gl.glEnd();
}

public void RenderScene()
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();

Glu.gluLookAt(0, 3, 6, 0, 0, 0, 0, 1, 0);
Gl.glInitNames();
Gl.glPushName(TRIANGLE);
Gl.glPushMatrix();
Gl.glTranslatef(-0.8f,0.0f,0.0f);
drawTriangle();
Gl.glPopMatrix();
Gl.glPopName();
Gl.glPushName(QUAD);
Gl.glPushMatrix();
Gl.glTranslatef(-0.5f,-0.8f,0.0f);
drawQuad();
Gl.glPopMatrix();
Gl.glPopName();
}

int RetrieveObjectID(int x, int y)
{
int objectsFound = 0;
int[]viewportCoords = new int[4];
int[] selectBuffer = new int[32];

Gl.glSelectBuffer(32, selectBuffer);
Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewportCoords);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glPushMatrix();
Gl.glRenderMode(Gl.GL_SELECT);
Gl.glLoadIdentity();
Glu.gluPickMatrix(x, viewportCoords[3] - y, 2, 2, viewportCoords);
Glu.gluPerspective(45.0f,(float)this.simpleOpenGlControl1.Right/(float)this.simpleOpenGlControl1.Bottom,0.1f,150.0f);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
RenderScene();
objectsFound = Gl.glRenderMode(Gl.GL_RENDER);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glPopMatrix();
Gl.glMatrixMode(Gl.GL_MODELVIEW); .
if (objectsFound > 0)
{
int lowestDepth = selectBuffer[1];
int selectedObject = selectBuffer[3];

for(int i = 1; i < objectsFound; i++)
{
if(selectBuffer[(i * 4) + 1] < lowestDepth)
{
lowestDepth = selectBuffer[(i * 4) + 1];
selectedObject = selectBuffer[(i * 4) + 3];
}
}

return selectedObject;
}
return 0;
}

private void simpleOpenGlControl1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
int objectID = 0;
objectID = RetrieveObjectID(e.X, e.Y);

switch(objectID)
{
case TRIANGLE:
System.Windows.Forms.MessageBox.Show ("TRIANGLE");
break;

case QUAD:
System.Windows.Forms.MessageBox.Show("Quad");
break;
}
}

****************************************************
Ich reagiere also auf MouseEvents und übergebe die x, bzw. y Koordinate and die Fkt. int RetrieveObjectID(int x, int y) welche mir die Anzahl der Objekt zurückgeben soll. Leider finde ich kein Objekt. Siehst Du auf Anhieb wo ich einen Fehler mache ???

Scavi
08.03.2004, 14:48
Wieso sprichst du alle OpenGL Befehle über ein Objekt Gl an ?


Ach: Nutzt du .NET ?


Guck dir mal das (http://nehe.gamedev.net/data/downloads/0-9/3ddragging.zip) an !

Phane01
08.03.2004, 15:09
Yipp, benutze C# (Visual Studio 2003), habe mir das Progg mal runtergeladen und werd's mir mal anschauen. Mit der TAO Bibliothek http://www.randyridge.com/Tao/Tutorials/Default.aspx

Stephan

Scavi
08.03.2004, 15:18
Iss die Implementation gut ? Ich wollte nämlich jetzt auch anfangen OpenGL unter .NET zu nutzen.

Phane01
09.03.2004, 08:31
Bin in Sachen OPENGL ein Frischling aber was ich bis jetzt damit genutzt und programmiert habe war schon recht gut.
Sach mal in der Funktion LRESULT CALLBACK WndProc( HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam )
sind doch wParam (x) und lParam (y) die Mauskoordinaten oder ???

Scavi
09.03.2004, 15:05
Nein ! So müsste es funktionieren:


switch(uMsg) {
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
SetCapture(hWnd);
m_x = LOWORD(lParam);
m_y = HIWORD(lParam);
break;

case WM_LBUTTONUP:
case WM_RBUTTONUP:
ReleaseCapture();
break;

case WM_MOUSEMOVE:
m_x = LOWORD(lParam);
m_y = HIWORD(lParam);
if(m_x & 1 << 15) m_x -= (1 << 16);
if(m_y & 1 << 15) m_y -= (1 << 16);
break;
}