C++ 需要在OpenGL中移动相机的帮助吗
我正在做一个简单的OpenGL项目。 我想让一个简单的相机在透视模式下移动 我一直在读关于投影矩阵、gluLookAt和模型视图矩阵的书。我一直在读,我应该做的就是在投影矩阵中调用透视图,然后在模型视图矩阵中调用所有变换和相机移动C++ 需要在OpenGL中移动相机的帮助吗,c++,opengl,matrix,camera,C++,Opengl,Matrix,Camera,我正在做一个简单的OpenGL项目。 我想让一个简单的相机在透视模式下移动 我一直在读关于投影矩阵、gluLookAt和模型视图矩阵的书。我一直在读,我应该做的就是在投影矩阵中调用透视图,然后在模型视图矩阵中调用所有变换和相机移动 #include "GLheaders.h" void drawWorldAxis() { glLoadIdentity(); glBegin(GL_LINES); glNormal3f(0, 0, 1); glColor3ub(25
#include "GLheaders.h"
void drawWorldAxis() {
glLoadIdentity();
glBegin(GL_LINES);
glNormal3f(0, 0, 1);
glColor3ub(255, 0, 0);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glColor3ub(0, 255, 0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glColor3ub(0, 0, 255);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
glEnd();
}
void keyboard(unsigned char key, int x, int y) {
glutPostRedisplay();
}
static float eye[3] = {.5, .5, .5};
#include <stdio.h>
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0, 1, .1, 10000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
drawWorldAxis();
printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]);
fflush(stdout);
gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0);
eye[0] += .1;
eye[1] += .1;
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0, 1, -1, 10000);
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH);
glutInitWindowSize(400,400);
glutCreateWindow("Tiny Test");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return EXIT_SUCCESS;
}
#包括“GLheaders.h”
void drawWorldAxis(){
glLoadIdentity();
glBegin(GL_行);
glNormal3f(0,0,1);
glColor3ub(255,0,0);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glColor3ub(0,255,0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glColor3ub(0,0255);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
格伦德();
}
无效键盘(无符号字符键,整数x,整数y){
再发现();
}
静态浮眼[3]={.5,5,5};
#包括
无效显示(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
gluPerspective(55.0,1,1,10000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
drawWorldAxis();
printf(“眼睛在\n”,眼睛[0],眼睛[1],眼睛[2]);
fflush(stdout);
gluLookAt(眼睛[0],眼睛[1],眼睛[2],0,0,0,0,1,0);
眼睛[0]+=0.1;
眼睛[1]+=.1;
glFlush();
glutSwapBuffers();
}
空洞重塑(整数w,整数h){
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
(55.0,1,-1,10000);
glMatrixMode(GLU模型视图);
再发现();
}
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度);
glutInitWindowSize(400400);
测试窗口(“微小测试”);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
键盘Func(键盘);
glEnable(GL_正常化);
glEnable(GLU深度试验);
glutMainLoop();
返回退出成功;
}
我希望这段代码显示代表世界坐标系x、y和z轴的三条线,当按下键时,相机应该移动并开始从越来越大的角度查看原点/坐标轴
这里出了什么问题?我一直把头撞到墙上,想弄明白为什么什么都没动。只有当我在投影矩阵中调用gluLookAt时,它才会改变,我一直被告知这是一个糟糕的想法。在设置lookAt矩阵之前,坐标交叉被绘制,因此矩阵没有效果 必须更改顺序,以便在绘制时矩阵已经存在:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0);
drawWorldAxis();
printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]);
fflush(stdout);
感谢@BDL帮助解决此问题!这是我想要的正确代码
#include "GLheaders.h"
void drawWorldAxis() {
glBegin(GL_LINES);
glNormal3f(0, 0, 1);
glColor3ub(255, 0, 0);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glColor3ub(0, 255, 0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glColor3ub(0, 0, 255);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
glEnd();
}
void keyboard(unsigned char key, int x, int y) {
glutPostRedisplay();
}
static float eye[3] = {-.1, -.1, 1};
#include <stdio.h>
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0, 1, .1, 10000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]);
fflush(stdout);
gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0);
drawWorldAxis();
eye[0] += .1;
eye[1] += .1;
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0, 1, -1, 10000);
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH);
glutInitWindowSize(400,400);
glutCreateWindow("Tiny Test");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return EXIT_SUCCESS;
}
#包括“GLheaders.h”
void drawWorldAxis(){
glBegin(GL_行);
glNormal3f(0,0,1);
glColor3ub(255,0,0);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glColor3ub(0,255,0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glColor3ub(0,0255);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
格伦德();
}
无效键盘(无符号字符键,整数x,整数y){
再发现();
}
静态浮眼[3]={-.1,-.1,1};
#包括
无效显示(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
gluPerspective(55.0,1,1,10000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
printf(“眼睛在\n”,眼睛[0],眼睛[1],眼睛[2]);
fflush(stdout);
gluLookAt(眼睛[0],眼睛[1],眼睛[2],0,0,0,0,1,0);
drawWorldAxis();
眼睛[0]+=0.1;
眼睛[1]+=.1;
glFlush();
glutSwapBuffers();
}
空洞重塑(整数w,整数h){
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
(55.0,1,-1,10000);
glMatrixMode(GLU模型视图);
再发现();
}
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度);
glutInitWindowSize(400400);
测试窗口(“微小测试”);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
键盘Func(键盘);
glEnable(GL_正常化);
glEnable(GLU深度试验);
glutMainLoop();
返回退出成功;
}
谢谢!这会引导我去我需要去的地方!loadIdentity也在创建它,因此我没有看到worldaxis,因为lookAt也没有应用于它。清除loadIdentity并重新排序似乎可以解决它!
#include "GLheaders.h"
void drawWorldAxis() {
glBegin(GL_LINES);
glNormal3f(0, 0, 1);
glColor3ub(255, 0, 0);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glColor3ub(0, 255, 0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glColor3ub(0, 0, 255);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
glEnd();
}
void keyboard(unsigned char key, int x, int y) {
glutPostRedisplay();
}
static float eye[3] = {-.1, -.1, 1};
#include <stdio.h>
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0, 1, .1, 10000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
printf("eye at <%f, %f, %f>\n", eye[0], eye[1], eye[2]);
fflush(stdout);
gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, 0, 1, 0);
drawWorldAxis();
eye[0] += .1;
eye[1] += .1;
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0, 1, -1, 10000);
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH);
glutInitWindowSize(400,400);
glutCreateWindow("Tiny Test");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return EXIT_SUCCESS;
}