c - 我应该先翻译还是先旋转?

标签 c macos opengl translation rotation

我正在尝试创建一个简单的场景,我可以在其中四处走动,标准是能够平移并使用 key 四处走动。但是,在我的绘制场景功能中,当我平移场景而不是旋转时,平移无法正常工作,因为整个场景只是围绕我旋转,导致对象穿过我。当我旋转而不是平移场景时,我可以正确平移,但是,我只能向某个方向移动,因此如果我向右平移 90 度,我将向左移动而不是向前移动。无论如何,我可以将这两种效果放在一起吗?

这是我用来绘制 View 的代码:


glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();

glTranslated(xposition, 0, zposition); //This is where I translate my views
glRotated(yrot, 0, 1, 0); //

glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER_ARB, quadVBO);

glNormalPointer(GL_FLOAT, 0, (void*)sizeof(sideArray));
glColorPointer(3, GL_FLOAT, 0, (void*)sizeof(sideArray)+sizeof(normals));
glVertexPointer(3, GL_FLOAT, 0, 0);

glDrawArrays(GL_QUADS, 0, sizeof(sideArray)/sizeof(GLfloat)/3);

glPopMatrix();
glFlush();
glDisableClientState(GL_VERTEX_ARRAY);  
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

以下是一些说明我现在问题的图片:

旋转然后翻译:

图1

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.17.39%20PM.PNG

图2

我可以模仿相机的转动

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.17.48%20PM.PNG

图3

然而,当我向前走时,它只向一个方向走,而不是我正在看的方向。

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.18.30%20PM.PNG

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.18.39%20PM.PNG

翻译然后旋转:

图1

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.19.44%20PM.PNG

图2

我可以自由地四处走动,径直走向我正在看的任何方向。

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.19.52%20PM.PNG

图3

但是,当我旋转场景时,整个事物都会旋转,这会导致对象穿过我并且不再像我旋转然后平移我的 View 那样在 View 中“平移”。

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.20.01%20PM.PNG

最佳答案

你的问题不在于转换的顺序。您应该旋转然后平移。

问题是您在移动时没有考虑旋转。运动公式:

movementX = sin(direction);
movementY = cos(direction);

其中方向是从北顺时针旋转的弧度数,正 X 是东,正 Y 是北。

关于c - 我应该先翻译还是先旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9994346/

相关文章:

c++ - 带 GL 的多光源

java - 如何在 IntelliJ IDEA 中构建 OS X Java 应用程序包?

c++ - GLSL 从 v110 移植到 v150?

c++ - 在 OpenGl 中渲染 mandelbrot 集

c - 基于 Pro*C 的批处理,内存不足?

r - 无法使用 home-brew 和 r 4.1 在 Big Sur 上安装 rcurl

regex - 如何从终端中的文件运行 perl 正则表达式列表

c - 仅 Unix 编译器的错误消息

c++ - 编译C程序时出错,该程序调用在头文件中声明并在单独的cpp文件中定义的C++函数

当 session 领导者向进程组发送 SIGHUP 时捕获信号