gpt4 book ai didi

c - 过剩/OpenGL : how to bind array of coordinates to mesh object to traslate/rotate them

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:40 26 4
gpt4 key购买 nike

在我的 GLUT/OpenGL 练习中,我必须加载 3 个不同的对象,我给它们一个 file.m。这是通过读取该文件、创建列表并最终调用 glCallList() 来完成的。选择一个对象后,我必须如何启用平移和旋转对象的可能性。所以我有:

#define OBJECTS 3
float objAngle[OBJECTS], objAxis[OBJECTS][3], objWAxis[OBJECTS][3], objPos[OBJECTS][3], objWPos[OBJECTS][3];
float objScale[OBJECTS] = {1.0, 1.0, 1.0};
float translation_var[OBJECTS][3];
translation_var[i][0] = translation_var[i][1] = translation_var[i][2] = 0.0;

并且都初始化为0.0

此外我还有:

float ocsmatrix[OBJECTS][16];
float wcsmatrix[OBJECTS][16];

初始化为:

for(i = 0; i < OBJECTS; i++) {
glGetFloatv(GL_MODELVIEW_MATRIX, ocsmatrix[i]);
glGetFloatv(GL_MODELVIEW_MATRIX, wcsmatrix[i]);
}

这是我的键盘功能的一部分:

void keyboard (unsigned char key, int x, int y) {
float* pos = NULL;
float step = 0.0;

if( mode == MODE_CHANGE_EYE_POS ) {
}

else if( mode == MODE_CHANGE_REFERENCE_POS ) {
pos = camC;
step = 0.1;
}

else if( mode == MODE_CHANGE_UP_POS ) {
pos = camU;
step = 0.1;
}

else if( mode == MODE_CHANGE_LIGHT_POS ) {
pos = lightPos;
step = 1.0;
}

else if( mode == MODE_ROTATE_OBJECT ) {
}


if( pos != NULL ) {
if( key == 'x' )
pos[0] += step;
else if( key == 'X' )
pos[0] -= step;
else if( key == 'y' )
pos[1] += step;
else if( key == 'Y' )
pos[1] -= step;
else if( key == 'z' )
pos[2] += step;
else if( key == 'Z' )
pos[2] -= step;

}

if (key == 'l') {
char path[32];
printf("Digitare file.m da caricare: data/file.m\n");
scanf("%s", path);

loadMeshModel(path); /* carico il file.m digitato da console */
}

if (key == '0') {
selected_object = 1;
printf("SELEZIONATO OGGETTO 0\n");
}
if (key == '1') {
selected_object = 2;
printf("SELEZIONATO OGGETTO 1\n");
}
if (key == '2') {
selected_object = 3;
printf("SELEZIONATO OGGETTO 2\n");
}

// gestione trasformazioni OCS
if(key == 'o') {
mode = MODE_TRANSLATE_OCS;
printf("TRASLAZIONE OCS ATTIVA\n");
}
else if(key == 'O') {
mode = MODE_ROTATE_OCS;
printf("ROTAZIONE OCS ATTIVA\n");
}

// gestione trasformazioni WCS
if(key == 'w') {
mode = MODE_TRANSLATE_WCS;
printf("TRASLAZIONE WCS ATTIVA\n");
}
else if(key == 'W') {
mode = MODE_ROTATE_WCS;
printf("ROTAZIONE WCS ATTIVA\n");
}

if(key == 'q') {
mode = MODE_QUADRICS;
}
else if(key == 'Q') {
mode = MODE_MODELS;
}

if( key == 27 ) //esc
exit(1);

if(selected_object > -1) {
if(mode == MODE_TRANSLATE_OCS) {
step = 0.1;
}

else if(mode == MODE_TRANSLATE_WCS) {
step = 0.1;
}

else if(mode == MODE_ROTATE_OCS) {
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(ocsmatrix[selected_object]);
step = 2.0;

} else if(mode == MODE_ROTATE_WCS) {
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(wcsmatrix[selected_object]);
step = 2.0;
}
}

if( selected_object > -1 )
{
if( key == 'x' ) {
translation_var[selected_object][0] += step;

if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(-step, 1.0, 0.0, 0.0);
}

else if( key == 'X' ) {
translation_var[selected_object][0] -= step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(step, 1.0, 0.0, 0.0);
}

else if( key == 'y' ) {
translation_var[selected_object][1] += step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(-step, 0.0, 1.0, 0.0);
}

else if( key == 'Y' ) {
translation_var[selected_object][1] -= step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(step, 0.0, 1.0, 0.0);
}

else if( key == 'z' ) {
translation_var[selected_object][2] += step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(-step, 0.0, 0.0, 1.0);
}

else if( key == 'Z' ) {
translation_var[selected_object][2] -= step;
if(mode == MODE_ROTATE_OCS || mode == MODE_ROTATE_WCS)
glRotatef(step, 0.0, 0.0, 1.0);
}
}

// Save rotation in relative matrixes
if(mode == MODE_ROTATE_OCS) {
glGetFloatv(GL_MODELVIEW_MATRIX, ocsmatrix[selected_object]);
glPopMatrix();
}
else if(mode == MODE_ROTATE_WCS) {
glGetFloatv(GL_MODELVIEW_MATRIX, wcsmatrix[selected_object]);
glPopMatrix();
}

glutPostRedisplay();

}

最后是 display()

  glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );

glShadeModel (GL_SMOOTH); //GL_FLAT

glLightfv( GL_LIGHT0, GL_POSITION, lightPos );
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);

glMatrixMode( GL_PROJECTION );
glLoadIdentity ();
gluPerspective( fovy, aspect, 1, 100);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

gluLookAt( camE[0], camE[1], camE[2], camC[0], camC[1], camC[2], camU[0], camU[1], camU[2] );

// Trackball rotation.
glRotatef(tbAngle, tbAxis[0], tbAxis[1], tbAxis[2]);

glLineWidth(2);
drawAxis( 2.0, 1 );
glLineWidth(1);

glRotatef(angle[0], 1.0, 0.0, 0.0);
glRotatef(angle[1], 0.0, 1.0, 0.0);
glRotatef(angle[2], 0.0, 0.0, 1.0);

//draw the mesh model
drawAxis( 1.0, 0 );

for(i=0; i<loaded_objects; i++) {
glPushMatrix();

glMultMatrixf(wcsmatrix[i]);
glTranslatef(objWPos[i][0] + translation_var[i][0], objWPos[i][1] + translation_var[i][1], objWPos[i][2] + translation_var[i][2]);


glMultMatrixf(ocsmatrix[i]);
glTranslatef(objPos[i][0]+translation_var[i][0], objPos[i][1]+translation_var[i][1], objPos[i][2]+translation_var[i][2]);


glScalef( objScale[i], objScale[i], objScale[i]);

//draw the model
if(!wireframe)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
else
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glCallList(listname+i);

glPopMatrix();

}

glutSwapBuffers();

因此,这些是在 mesg 对象(在我的例子中是“ pig ”)显示在 3 个轴的中心后我在键盘上按下的按钮:

  • "1"--> 我选择了 pig (selected_object = 1)
  • "o"--> 我启用 ocs 翻译
  • “x”或“X”沿 X 轴移动 pig

但是哈巴狗没有动。为什么?它似乎只适用于 translate_var[3] 而不适用于 translate_var[3][3]。但是,如果我使用单维数组,那么我将平移所有 3 个网格对象......另外,i-mesh对象和objPos/objWPos中的第i个位置是如何绑定(bind)的?

最佳答案

您的主要错误/误解是,您将 OpenGL 视为某种 3D 场景管理器。它不是。 OpenGL 所做的只是一次绘制一个点、线或三角形。显示列表是一种宏记录,仅此而已。

在您的键盘处理函数中,您通过操纵 OpenGL 变换矩阵对事件作出 react 。然而,这些矩阵只是绘图过程的另一个输入。仅仅操纵它们没有任何效果。此外,矩阵和“模型”之间没有“关联”,因为 OpenGL 没有模型。

所以你要做的是,在你的键盘处理程序中使用输入来操作你定义的变量;每个对象的一组变量(提示:struct),然后标记 GLUT 它将在主应用程序循环的下一次迭代时调用显示处理程序(glutPostRedisplay)。然后在显示例程中使用您在输入事件处理程序中操作的变量的值来为您要绘制的每个模型设置相应的转换矩阵,就在您绘制该模型之前

关于c - 过剩/OpenGL : how to bind array of coordinates to mesh object to traslate/rotate them,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32950362/

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