gpt4 book ai didi

c++ - 如何允许用户在 opengl 中缩放一个对象而不缩放其他对象

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:25 26 4
gpt4 key购买 nike

下面的程序正在绘制两个立方体,使用“D”/“d”键进行放大/缩小。我如何添加一个能力,其中一个立方体应该放大/缩小,而另一个不应该。

#define PI 3.1415926535898
#define Cos(th) cos(PI/180*(th))
#define Sin(th) sin(PI/180*(th))
#define DEF_D 5

/* Globals */
double dim=5.0; /* dimension of orthogonal box */
char *windowName = "test window";
int windowWidth=500;
int windowHeight=450;

/* Various global state */
int toggleAxes = 1; /* toggle axes on and off */
int toggleValues = 1; /* toggle values on and off */
int toggleMode = 0; /* projection mode */
int th = 340; /* azimuth of view angle */
int ph = 30; /* elevation of view angle */
int fov = 55; /* field of view for perspective */
int asp = 1; /* aspect ratio */

/* Cube vertices */
GLfloat vertA[3] = { 0.5, 0.5, 0.5};
GLfloat vertB[3] = {-0.5, 0.5, 0.5};
GLfloat vertC[3] = {-0.5,-0.5, 0.5};
GLfloat vertD[3] = { 0.5,-0.5, 0.5};
GLfloat vertE[3] = { 0.5, 0.5,-0.5};
GLfloat vertF[3] = {-0.5, 0.5,-0.5};
GLfloat vertG[3] = {-0.5,-0.5,-0.5};
GLfloat vertH[3] = { 0.5,-0.5,-0.5};

/*
* project()
* ------
* Sets the projection
*/
void project()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

if (toggleMode) {
/* perspective */
gluPerspective(fov,asp,dim/4,4*dim);
}
else {
/* orthogonal projection*/
glOrtho(-dim*asp,+dim*asp, -dim,+dim, -dim,+dim);
}

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

/*
* setEye()
* ------
* Set the eye position
*/
void setEye()
{
if (toggleMode) {
double Ex = -2*dim*Sin(th)*Cos(ph);
double Ey = +2*dim *Sin(ph);
double Ez = +2*dim*Cos(th)*Cos(ph);
/* camera/eye position, aim of camera lens, up-vector */
gluLookAt(Ex,Ey,Ez , 0,0,0 , 0,Cos(ph),0);
}
/* Orthogonal - set world orientation */
else {
glRotatef(ph,1,0,0);
glRotatef(th,0,1,0);
}
}

void cube(double x,double y,double z,
double dx,double dy,double dz,
double th)
{
glPushMatrix();
/* Transform cube */
glTranslated(x,y,z);
glRotated(th,0,1,0);
glScaled(dx,dy,dz);

/* Cube */
glBegin(GL_QUADS);
/* front => ABCD yellow */
glColor3f(1.0,1.0,0.0);
glVertex3fv(vertA);
glVertex3fv(vertB);
glVertex3fv(vertC);
glVertex3fv(vertD);
/* back => FEHG red */
glColor3f(1.0,0.0,0.0);
glVertex3fv(vertF);
glVertex3fv(vertE);
glVertex3fv(vertH);
glVertex3fv(vertG);
/* right => EADH green */
glColor3f(0.0,1.0,0.0);
glVertex3fv(vertE);
glVertex3fv(vertA);
glVertex3fv(vertD);
glVertex3fv(vertH);
/* left => BFGC blue */
glColor3f(0.0,0.0,1.0);
glVertex3fv(vertB);
glVertex3fv(vertF);
glVertex3fv(vertG);
glVertex3fv(vertC);
/* top => EFBA turquoise */
glColor3f(0.0,1.0,1.0);
glVertex3fv(vertE);
glVertex3fv(vertF);
glVertex3fv(vertB);
glVertex3fv(vertA);
/* bottom => DCGH pink */
glColor3f(1.0,0.0,1.0);
glVertex3fv(vertD);
glVertex3fv(vertC);
glVertex3fv(vertG);
glVertex3fv(vertH);
glEnd();

glPopMatrix();
}

void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glLoadIdentity();

/* setup functions */
setEye();

cube(2,0,1, 1,1,1, 0);
cube(-2,0,1, 1,1,1, 0);

glFlush();
glutSwapBuffers();
}

void reshape(int width,int height)
{
asp = (height>0) ? (double)width/height : 1;
glViewport(0,0, width,height);
project();
}

void windowKey(unsigned char key,int x,int y)
{
/* Exit on ESC */
if (key == 27) exit(0);
else if (key == 'a' || key == 'A') toggleAxes = 1-toggleAxes;
else if (key == 'v' || key == 'V') toggleValues = 1-toggleValues;
else if (key == 'm' || key == 'M') toggleMode = 1-toggleMode;
/* Change field of view angle */
else if (key == '-' && key>1) fov--;
else if (key == '+' && key<179) fov++;
/* Change dimensions */
else if (key == 'D') dim += 0.1;
else if (key == 'd' && dim>1) dim -= 0.1;

project();
glutPostRedisplay();
}

int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(windowWidth,windowHeight);
glutCreateWindow(windowName);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(windowKey);
glutMainLoop();
return 0;
}

我只想放大/缩小一个立方体,而不是另一个立方体。该怎么做?

最佳答案

在调用 cube 函数之前在 push pop 矩阵中进行转换。就像您只需要为立方体 1 做一样。

  glPushMatrix(); // Set current matrix on the stack
//Scale Cube Transformations based upon your D/d value.
glScaled(dim,dim,0)--> change how much you want, also apply other transformations on where you want to scale.
//Draw
Cube(2,0,1, 1,1,1, 0);
glPopMatrix(); // Pop the old matrix without the transformations.

Then draw the other cube.
cube(-2,0,1, 1,1,1, 0);

关于c++ - 如何允许用户在 opengl 中缩放一个对象而不缩放其他对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34523761/

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