我使用了一个路径查找算法(D * lite,作者:James Neufeld),我发现它是一个图形可视化。对于机器人的功能,不需要图形可视化,但是对于开发它来说它是一个很好的工具。它工作得很好,但默认情况下你只能看到笛卡尔平面的第一象限。我需要能够看到4个象限。更改变量" scale"在代码中工作就像放大/缩小但它仍然保留在第一象限。我不想移动所有点(foreach坐标:x + = 100和y + = 100)移动到该象限,图形上它会起作用,但它会弄乱机器人数据并消耗更多资源(运行于RaspberryPi 3还使用了激光雷达,伺服,过滤和分析点等许多东西。
如何指定视点?我需要改变与屏幕平行的视点。我已经尝试了glTranslatef()和gluLookAt()函数,但我似乎无法使它工作,我也不确定我应该在代码中使用这些函数。
这是程序运行,每个方格是一个(x,y)坐标:
我可以看到的区域与我需要看到的区域:
#ifdef MACOS
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#endif
#include <unistd.h>
#include "Dstar.h"
#include <stdio.h>
int hh, ww;
int window;
Dstar *dstar;
int scale = 6;
int mbutton = 0;
int mstate = 0;
bool b_autoreplan = true;
void InitGL(int Width, int Height)
{
hh = Height;
ww = Width;
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glViewport(0,0,Width,Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,Width,0,Height,-100,100);
glMatrixMode(GL_MODELVIEW);
}
void ReSizeGLScene(int Width, int Height)
{
hh = Height;
ww = Width;
glViewport(0,0,Width,Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,Width,0,Height,-100,100);
glMatrixMode(GL_MODELVIEW);
}
void DrawGLScene()
{
usleep(100);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glScaled(scale,scale,1);
if (b_autoreplan) dstar->replan();
dstar->draw();
glPopMatrix();
glutSwapBuffers();
}
void keyPressed(unsigned char key, int x, int y)
{
usleep(100);
switch(key) {
case 'q':
case 'Q':
glutDestroyWindow(window);
exit(0);
break;
case 'r':
case 'R':
dstar->replan();
break;
case 'a':
case 'A':
b_autoreplan = !b_autoreplan;
break;
case 'c':
case 'C':
dstar->init(40,50,140, 90);
break;
}
}
void mouseFunc(int button, int state, int x, int y) {
y = hh -y+scale/2;
x += scale/2;
mbutton = button;
if ((mstate = state) == GLUT_DOWN) {
if (button == GLUT_LEFT_BUTTON) {
dstar->updateCell(x/scale, y/scale, -1);
} else if (button == GLUT_RIGHT_BUTTON) {
dstar->updateStart(x/scale, y/scale);
} else if (button == GLUT_MIDDLE_BUTTON) {
dstar->updateGoal(x/scale, y/scale);
}
}
}
void mouseMotionFunc(int x, int y) {
y = hh -y+scale/2;
x += scale/2;
y /= scale;
x /= scale;
if (mstate == GLUT_DOWN) {
if (mbutton == GLUT_LEFT_BUTTON) {
dstar->updateCell(x, y, -1);
} else if (mbutton == GLUT_RIGHT_BUTTON) {
dstar->updateStart(x, y);
} else if (mbutton == GLUT_MIDDLE_BUTTON) {
dstar->updateGoal(x, y);
}
}
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(1000, 800);
glutInitWindowPosition(50, 20);
window = glutCreateWindow("Dstar Visualizer");
glutDisplayFunc(&DrawGLScene);
glutIdleFunc(&DrawGLScene);
glutReshapeFunc(&ReSizeGLScene);
glutKeyboardFunc(&keyPressed);
glutMouseFunc(&mouseFunc);
glutMotionFunc(&mouseMotionFunc);
InitGL(800, 600);
dstar = new Dstar();
dstar->init(2,2,90, 40);
printf("----------------------------------\n");
printf("Dstar Visualizer\n");
printf("Commands:\n");
printf("[q/Q] - Quit\n");
printf("[r/R] - Replan\n");
printf("[a/A] - Toggle Auto Replan\n");
printf("[c/C] - Clear (restart)\n");
printf("left mouse click - make cell untraversable (cost -1)\n");
printf("middle mouse click - move goal to cell\n");
printf("right mouse click - move start to cell\n");
printf("----------------------------------\n");
glutMainLoop();
return 1;
}
答案 0 :(得分:0)
尝试glTranslatef(GLfloat x,GLfloat y,GLfloat z);缩放到正确的大小后。 移动相机将是glLookAt但我只是翻译场景。