gpt4 book ai didi

OpenGL纵横比问题

转载 作者:行者123 更新时间:2023-12-01 07:45:16 24 4
gpt4 key购买 nike

我正在使用 Qt + OpenGL 进行 2D 渲染。
我是 OpenGL 的初学者,在我的一生中,我无法弄清楚这个纵横比问题。每次我认为我已经理解了 glOrtho 和 gViewPort,但下一次我又遇到了他们的另一个问题。如果坐标在-1和1之间是对称的,那么我的代码就可以正常工作,否则就不行。我真的很想一劳永逸地度过这些。我搜索和应用的所有建议对我来说都是徒劳的。

我的问题陈述:

我正在渲染一个正方形和一个三角形,并用击键“R”在它们之间切换。我也在放大和缩小。虽然正方形保持纵横比,但三角形不是。形状的坐标是:

正方形:(-10, -250), (500, -250), (500, -260), (-10, -260);

三角形:(250, 0), (310, 0), (280, 30)

基本上我无法在三角形上方渲染。这是相同的代码:

我的代码

#include <QtGui/QMouseEvent>
#include <qdebug.h>
#include "GLWidget.h"
#include "stdio.h"
#include "qgl.h"
#include "qimage.h"

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent)
{
setMouseTracking(true);
}

void GLWidget::initializeGL()
{
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_COLOR_MATERIAL);
glEnable(GL_BLEND);
glEnable(GL_POLYGON_SMOOTH);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(1, 1, 1, 0);
glEnable( GL_POINT_SMOOTH ); // For Circular Points
}

void GLWidget::resizeGL(int w, int h)
{
canvas_width = (double)w;
canvas_height = (double)h;
aspect_ratio = canvas_width/canvas_height;

left_plane = 250;
right_plane = 310;
bottom_plane = 0;
top_plane = 60;
z_near_plane = 1;
z_far_plane = -1;

glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

if( canvas_width > canvas_height ){
glOrtho(left_plane*aspect_ratio, right_plane*aspect_ratio, bottom_plane, top_plane, z_near_plane, z_far_plane);
}else{
glOrtho(left_plane, right_plane, bottom_plane/aspect_ratio, top_plane/aspect_ratio, z_near_plane, z_far_plane);
}

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0); // red

glBegin(GL_POLYGON);
//glVertex2f(-30,0);
//glVertex2f(30,0);
//glVertex2f(0,60);
glVertex2f(250,0);
glVertex2f(310,0);
glVertex2f(280,60);
glEnd();
}

我没有看到任何三角形,因为 left_plane*aspect_ratio 剪辑了我的绘图(250 是最小 X,250*1.4 > 310,310 是最大 X)。

我希望我已经说清楚了。

我也会尝试放置图像(我想我必须将图像上传到其他站点并在此处链接它们?)。

最佳答案

您的问题是边界框(分配给 left/right/top/bottom_plane 的值)与视口(viewport)的纵横比不同。如果您有对象的边界框,则需要找到具有正确纵横比 (w/h) 的视口(viewport)坐标。视口(viewport)需要以边界框中心为中心,并且足够大以适合边界框。但是视口(viewport)的纵横比与边界框的大小无关。

通常,您有一个 3D 边界框(8 个角点)。您将每个角投影到屏幕上,然后使用 min/max 来获得一个需要在屏幕上居中的矩形。然后检查该矩形的纵横比 ar = wr/hr 与视口(viewport)的纵横比 a=w/r。如果 a < ar,则需要将 wr 拟合到 w,否则将 hr 拟合到 h。

void GLWidget::resizeGL(int w, int h)
{
// First set up the projection.
double canvas_width = (double)w;
double canvas_height = (double)h;
double a = canvas_width / canvas_height;

glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-a, +a, -1, +1, -1, +1);

// Now set up the view matrix.
double leftBoundingRectangle = 250;
double rightBoundingRectangle = 310;
double bottomBoundingRectangle = 0;
double topBoundingRectangle = 60;

double widthBoundingRectangle = rightBoundingRectangle - leftBoundingRectangle;
double heightBoundingRectangle = topBoundingRectangle - bottomBoundingRectangle;

double ar = widthBoundingRectangle / heightBoundingRectangle;

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// Center on bounding rectangle center.
double tx = (leftBoundingRectangle + rightBoundingRectangle)/2.0, ty = (topBoundingRectangle + bottomBoundingRectangle)/2.0;
glTranslated(tx, ty, 0.0); // or is it -tx, -ty?

// Scale to fit bounding box.
double s;
if (ar > a)
{
s = ... // sorry, but you have to figure this one out for yourself. :)
}
else
{
s = ...
}
glScaled(s,s,s);
}

关于OpenGL纵横比问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320336/

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