Je n'arrive pas à définir une matrice de projection orthographique de dimensions 4x2 avec (0,0) étant au centre, (-2, -1) étant dans le coin inférieur gauche et (2, 1) étant en haut à droite coin.Définition d'une matrice de projection orthographique?
J'utilise glutInitWindowSize(600, 300);
pour initialiser la taille de la fenêtre. Dans ma fonction de remodelage, j'utilise glViewport(0, 0, w, h);
pour définir la fenêtre. Toujours dans ma fonction remodeler, j'utilise gluOrtho2D(-(float)w/h, (float)w/h, -2.0, 2.0);
pour définir l'ortho.
Cependant, lorsque je déplace ma souris pour voir les coordonnées du monde, le coin inférieur gauche est (-1, -1) et le coin supérieur droit est (1, 1). Y at-il quelque chose que je fais mal ici? Je suppose que puisque je mets bas et haut à -2 et 2 respectivement dans l'appel gluOrtho2D, il devrait me donner les bonnes coordonnées.
S'il vous plaît aidez-moi si vous voyez quelque chose qui pourrait être faux.
Voici mon code jusqu'à présent, veuillez ignorer les variables de bras et les fonctions de dessin.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#if 0 /*unix*/
#include <GL/glut.h>
#endif
#if 1 /*apple */
#include <GLUT/glut.h>
#include <OPENGL/gl.h>
#include <OPENGL/glext.h>
#endif
#if 0 /*windows*/
#include <io.h>
#include <fcntl.h>
#include <glut.h>
#endif
int GW, GH;
bool animfore, animupper;
float foreangle, upperangle;
using namespace std;
void drawShoulder();
void drawUpper();
void drawFore();
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
//draw shoulder
glPushMatrix();
drawShoulder();
//draw upper arm
glPushMatrix();
drawUpper();
//draw forearm
glPushMatrix();
drawFore();
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutPostRedisplay();
glutSwapBuffers();
}
void drawShoulder() {
//cout << "Enters" << endl;
glBegin(GL_POLYGON);
glColor3f((float)30/255, (float)0/255, (float)30/255);
glVertex2f(-2.0, -0.4);
glVertex2f(-2.0, -1.0);
glVertex2f(-1.0, -1.0);
glVertex2f(-1.0, -0.4);
glEnd();
}
void drawUpper() {
}
void drawFore() {
}
void reshape(GLsizei w, GLsizei h) {
GW = w;
GW = h;
glViewport(0, 0, w, h);
glLoadIdentity();
gluOrtho2D(-(float)w/h, (float)w/h, -1.0, 1.0);
cout << "Enters" << endl;
}
void keyboard(unsigned char key, int x, int y) {
switch(key) {
case 'q' : case 'Q' :
exit(EXIT_SUCCESS);
break;
}
}
//control arm animations
void idle() {
if(animupper) {
}
if(animfore) {
}
}
float p2w_x(int gx) {
return (float)2.*GW/(GW*GH-GH)*gx-(float)GW/GH;
}
float p2w_y(int gy) {
int py = GH-1-gy;
return (float)2./(GH-1.)*py-1;
}
void mouseMove(int x, int y) {
cout << "(" << p2w_x(x) << "," << p2w_y(y) << ")" << endl;
}
int main(int argc, char **argv) {
// global variable intializations
GW = 600;
GH = 300;
animfore, animupper = true;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
// initialization
glutInitWindowSize(600, 300);
glutInitWindowPosition(100, 100);
glutCreateWindow("Robot Arm");
glClearColor(1.0, 1.0, 1.0, 1.0);
// callback functions
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutMotionFunc(mouseMove);
glutMainLoop();
}
Cela ne m'aide toujours pas à créer un système de coordonnées où il est 4x2 et centré à (0,0). – sudo
Mention d'avertissement. 'glMatrixMode()' est une fonctionnalité déprimée. https://www.khronos.org/opengl/wiki/Legacy_OpenGL Cela concerne le pipeline de fonction fixe, et il est maintenant recommandé dans 'OpenGL moderne' de calculer vous-même vos matrices et de les appliquer dans vos shaders. –