c++ opengl 相机移动
Posted
技术标签:
【中文标题】c++ opengl 相机移动【英文标题】:c++ opengl camera movement 【发布时间】:2018-03-15 17:55:12 【问题描述】:我无法弄清楚为什么相机无法移动!我想我设置的代码是正确的。有什么指点吗?
当我启动它时,三角形出现但我无法移动相机,很可能是我在相机移动背后的整个方法,这是由于缺乏经验而造成的。有人能指出我正确的方向吗?
include "stdafx.h"
#include <GL/glut.h>
#include <GL/freeglut.h>
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
//THESE ARE MY VARIABLES
//===========
int x = 0; //|
int y = 0; //|
int z = 0; //|
//===========
//Camera Movement
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
if (WM_KEYDOWN == VK_UP)
std::cout << "User pressed UP!";
++z;
if (WM_KEYDOWN == VK_DOWN)
std::cout << "User pressed DOWN!";
--z;
if (WM_KEYDOWN == VK_LEFT)
std::cout << "User pressed LEFT!";
--x;
if (WM_KEYDOWN == VK_RIGHT)
std::cout << "User pressed RIGHT!";
++x;
void display()
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glColor3f(1.0, 0, 0);
glVertex3f(0.5, 0.5, 1);
glColor3f(0, 1.0, 0);
glVertex3f(0.5, 0, 1);
glColor3f(0, 0, 1.0);
glVertex3f(0, 0.5, 1);
glVertex3f(0.5, 0.5, 1);
glEnd();
glFlush();
int main(int argc, char* argv[])
glutInit(&argc, argv);
glutInitWindowSize(640, 480);
glutInitWindowPosition(10, 10);
glutCreateWindow("McDank");
glutDisplayFunc(display);
glutMainLoop();
return 0;
【问题讨论】:
欢迎来到 SO。请看一下如何做一个问题。特别是How to create a Minimal, Complete, and Verifiable example。您尚未展示如何尝试移动相机。 我会回答,但是缺少的东西太多了,所以我建议你花一些时间在教程上,例如:learnopengl.com 您从未在渲染代码中使用x
、y
或z
?
您还没有相机移动的代码。建议从传统的 GLUT 迁移到最新的 GLFW。检查这个:***.com/questions/24040982/…)
您确定这是实际代码吗?您的定义 void glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
包含您的相机的移动代码,这是不正确的。
【参考方案1】:
您需要通过glutKeyboardFunc()
或glutSpecialFunc()
向GLUT 注册键盘回调以处理击键。
你的glViewport()
函数是……奇怪。通过将随机 Windows 枚举与其他枚举进行比较,不确定您在此处尝试实现的目标。
您需要在显示函数中实际使用您的x
/y
/z
变量,也许在glTranslate()
中。
大家一起:
#include <GL/glut.h>
float x = 0;
float y = 0;
float z = 0;
void special( int key, int, int )
const float step = 0.1;
if( GLUT_KEY_LEFT == key )
x -= step;
if( GLUT_KEY_RIGHT == key )
x += step;
if( GLUT_KEY_UP == key )
y += step;
if( GLUT_KEY_DOWN == key )
y -= step;
glutPostRedisplay();
void display()
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -2, 2, -2, 2, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( x, y, z );
glBegin( GL_TRIANGLES );
glColor3ub( 255, 0, 0 );
glVertex2f( -1, -1 );
glColor3ub( 0, 255, 0 );
glVertex2f( 1, -1 );
glColor3ub( 0, 0, 255 );
glVertex2f( 0, 1 );
glEnd();
glutSwapBuffers();
int main(int argc, char* argv[])
glutInit(&argc, argv);
glutInitWindowSize(600, 600);
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutCreateWindow("McDank");
glutSpecialFunc( special );
glutDisplayFunc(display);
glutMainLoop();
return 0;
【讨论】:
以上是关于c++ opengl 相机移动的主要内容,如果未能解决你的问题,请参考以下文章