gpt4 book ai didi

c++ - 如何在opengl中停止拉伸(stretch)

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:32 25 4
gpt4 key购买 nike

我创建了线条并在旋转线条时。线会被拉伸(stretch)。我怎样才能在旋转时停止拉伸(stretch)。当我在 Ortho 中更改高度时,它将无法正确显示。当线向左或向右移动时,它会开始拉伸(stretch),但当它到达主要点时,它会到达实际位置。

#include<fstream>
#include<iostream>
#include<stdlib.h>
#include<glut.h>
using namespace std;
float yr = 0;
void introscreen();
void screen();
void screen1();
void PitchLadder();

int width = 1268;
int height = 720;

float translate = 0.0f;
GLfloat angle = 0.0f;

void display(void) {
glClearColor(0, 0, 0, 0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-300, 300, -10, 25, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
static int center_x = 0;
static int center_y = 0;
}

void specialKey(int key, int x, int y) {
switch (key) {
case GLUT_KEY_UP:
translate += 1.0f;
break;
case GLUT_KEY_DOWN:
translate -= 1.0f;
break;
case GLUT_KEY_LEFT:
angle += 1.0f;
break;
case GLUT_KEY_RIGHT:
angle -= 1.0f;
break;
}

glutPostRedisplay();
}

void Rolling(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0, 1, 0);
glPushMatrix();
glRotatef(-angle, 0, 0, 1);
glTranslatef(-10, translate,0);
PitchLadder();
glPopMatrix();
glFlush();
}

void PitchLadder() {
GLfloat y;
GLfloat y2;
GLfloat fSize[5];
GLfloat fCurrSize;
fCurrSize = fSize[2];
for (y2 = -90.0f ; y2 <= 90.0f ; y2 += 10.0f) {
glLineWidth(fCurrSize);
glBegin(GL_LINES);
glVertex3f(-50.0f , y2 , 0);
glVertex3f(50.0f , y2 , 0);
glEnd();
fCurrSize += 1.0f;
screen();
screen1();
}
}

void renderbitmap1(float x3, float y3, void *font1, char *string1) {
char *c1;
glRasterPos2f(x3, y3);
for (c1=string1; *c1 != '\0'; c1++) {
glutBitmapCharacter(font1, *c1);
}
}

void screen(void) {
glColor3f(0, 1, 0);
char buf1[20] = { '\0' };
for (int row1 = -90.0f; row1 <= 90 + yr; row1 +=10.0f) {
sprintf_s(buf1,"%i", row1);
renderbitmap1(70 , (yr+row1), GLUT_BITMAP_TIMES_ROMAN_24, buf1);
}
}

void renderbitmap2(float x4, float y4, void *font2, char *string2) {
char *c1;
glRasterPos2f(x4, y4);
for (c1=string2; *c1 != '\0'; c1++) {
glutBitmapCharacter(font2, *c1);
}
}

void screen1(void) {
glColor3f(0, 1, 0);
char buf1[20] = { '\0' };
for (int row1 = -90.0f; row1 <= 90 + yr; row1 +=10.0f) {
sprintf_s(buf1,"%i", row1);
renderbitmap2(-70 , (yr+row1), GLUT_BITMAP_TIMES_ROMAN_24, buf1);
}
}

int main(int arg, char** argv) {
glutInit(&arg, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(width, height);
glutInitWindowPosition(50, 100);
glutCreateWindow("HUD Lines");
display();
glutDisplayFunc(Rolling);
glutSpecialFunc(specialKey);
glutMainLoop();
return 0;
}

最佳答案

在正交投影中, View 空间坐标线性映射到裁剪空间坐标,分别是归一化的设备坐标。规范化的设备空间是一个立方体,最小值为 (-1, -1, -1),最大值为 (1, 1, 1)。
最后,标准化设备空间中的坐标被映射到矩形视口(viewport)。

如果视口(viewport)是矩形的,则在将 View 空间坐标转换为裁剪空间时,必须考虑纵横比。
归一化设备坐标到视口(viewport)的映射通过视口(viewport)的倒数纵横比扭曲了几何形状。这种失真必须通过正射投影来补偿。

当正投影由 glOrtho(left, right, bottom, top, near, far) 设置时,然后定义长方体体积,它映射(左,下,近)到(-1,-1,-1)和(右,上,远)到(1, 1, 1)。
正射投影的 x 和 y 范围不一定等于视口(viewport)矩形,位比 (left-right)/(top-bottom) 必须等于视口(viewport)矩形,否则几何形状将被扭曲。

double size = 200.0f;
double aspect = (double)width / (double)height;
glOrtho(-aspect*size/2.0, aspect*size/2.0, -size/2.0, size/2.0, -1.0, 1.0);

关于c++ - 如何在opengl中停止拉伸(stretch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58099193/

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