gpt4 book ai didi

c++ - 反转 y 轴,并在 OpenGL 中设置坐标系

转载 作者:可可西里 更新时间:2023-11-01 17:59:49 29 4
gpt4 key购买 nike

在 OpenGL 中,我试图反转 y 轴,并设置特定类型的坐标系,就像 Allegro 的方式一样。假设我的窗口是 640x480,我希望屏幕的左上角是轴 (0, 0),右下角是 (640, 480)。到目前为止,我设法得到了我想要的正确坐标系,但我不知道它是否以正确的方式完成。至于翻转 y 轴,我无法在不修改当前坐标系的情况下将其反转。我不想要一些骇人听闻的东西,只是为了翻转 1 个形状。我希望它在保持坐标系的同时翻转我在 y 轴上制作的所有 future 形状。这是我目前所拥有的。

初始化:

const GLdouble XSize = 640, YSize = 480;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, XSize, YSize, 0, 1, 1000);
glMatrixMode(GL_MODELVIEW);

渲染:

float size = 30;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, -500);

glPushMatrix();
glTranslatef(size, size, 0.0f);

glBegin(GL_TRIANGLES);
glColor3f(0.1, 0.3, 0.8);
glVertex3f( 0.0f, size, 0.0f);
glVertex3f(-size,-size, 0.0f);
glVertex3f( size,-size, 0.0f);
glEnd();
glPopMatrix();

编辑:

我发现添加glScalef(1, -1, 1);会翻转我的形状,但我必须将它包含在我的形状的 glPushMatrix() 中,我不知道这是否是正确的方法,或者它是否是一个 hackish 解决方案。

最佳答案

要更改坐标系,按顺序需要缩放和平移。

// Initialize OpenGL matrices
void init_gl() {
const float WIDTH = 640.0f;
const float HEIGHT = 480.0f;

const float HALF_WIDTH = WIDTH / 2.0f;
const float HALF_HEIGHT = HEIGHT / 2.0f;

// Setup the projection matrix
glMatrixMode(GL_PROECTION);
glLoadIDentity();
glOrtho(0, WIDTH, HEIGHT, 0.0f, 0.0f, 1000.0f);

// Setup the Allegro-to-view matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(-HALF_WIDTH, HALF_HEIGHT, 0.0f);
glScalef(1.0f, -1.0f, 1.0f);
}

// Render scene
void render() {
// Now render using points in Allegro coordinates
const float size = 30.0f;
glBegin(GL_TRIANGLES);
glColor3f(0.1f, 0.3f, 0.8f);
glVertex3f( 0.0f, size, 0.0f);
glVertex3f(-size, -size, 0.0f);
glVertex3f( size, -size, 0.0f);
glEnd();
}

请注意 glTranslatef 出现在 glScalef 之前,因为变换矩阵在当前矩阵值的右侧相乘。此外,您不必为每帧设置 Allegro-to-view 矩阵;对于大多数用例,初始化期间一次就足够了。但是,您可以按下 GL_MODELVIEW 并应用任何必要的模型转换。


这是对其工作原理的概念分析。目标是允许图形程序员使用“Allegro”或所需坐标指定点,即原点位于正交投影左上角的坐标(在本例中,这直接与屏幕相关)。为此,您设置 View 矩阵 GL_MODELVIEW 以将这些所需坐标转换为正交相机坐标(也称为 View 空间或眼睛空间)。

首先,您重新定向(缩放)所需坐标的 y 轴以匹配 View 坐标(中图)。其次,平移所需坐标的原点以匹配 View 坐标的原点。这种转换是相对于 View 坐标进行的(即 View 坐标的原点是水平向右的一半屏幕和垂直向下的一半屏幕)。这最后一步相当于在移动的相反方向上转换点。

象征性地,尺度将点 P = (P.x, P.y) 转换为 P' = (P.x, -P.y)。 translate 将点 P' 转换为 P'' = (P.x - w/2, P.y + h/2) 其中 w 是屏幕宽度 (480px),h 是高度 (640px)。 (抱歉,最终图表错误地将 hw 切换为 P'' 因为我不能很好地绘制图表)。

请注意,z 轴指向屏幕外,因为我们没有按 -1 缩放它。

我更喜欢概念化坐标系变化的方式(更准确地说,当我们包含原点概念时,框架的变化)是我们正在修改基 vector (x,y,等)和原点以及随后的缩放、旋转和平移操作(按此顺序)。这与我们通过在相机移动的相反方向应用平移来概念化移动相机的方式非常相似。

Roughly drawn diagram of the two transformations

关于c++ - 反转 y 轴,并在 OpenGL 中设置坐标系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5984260/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com