openGL-如何在不旋转灯光的情况下旋转对象 我想在屏幕中间画一个旋转立方体,我希望它被上面的一盏灯照亮(我希望它看起来像立方体从固定的屏幕位置被照亮)。我的问题是,我不知道如何防止光线随立方体旋转

openGL-如何在不旋转灯光的情况下旋转对象 我想在屏幕中间画一个旋转立方体,我希望它被上面的一盏灯照亮(我希望它看起来像立方体从固定的屏幕位置被照亮)。我的问题是,我不知道如何防止光线随立方体旋转,opengl,Opengl,代码如下: (总结:initGL、paintGL和resizeGl是您必须始终实现的函数。在paintGL中,我使用makeCube()。在makeCube()中,我使用glBegin(GL_QUADS)创建立方体,并使用calcNormals()计算立方体的法线) -------------initGL-------------------------- angle=0.0; glEnable (GL_DEPTH_TEST); glEnable (GL_LIGHTING); GLfloat L

代码如下:

(总结:initGL、paintGL和resizeGl是您必须始终实现的函数。在paintGL中,我使用makeCube()。在makeCube()中,我使用glBegin(GL_QUADS)创建立方体,并使用calcNormals()计算立方体的法线)

-------------initGL--------------------------

angle=0.0;
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
GLfloat LightDiffuse[]=     { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]=    { 0.0f, 1.5f,1.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT0, GL_POSITION,LightPosition);
glEnable (GL_LIGHT0);
float P[8][3]={ {-1,-1, 1},{1,-1, 1},{1,1, 1},{-1,1, 1},
                {-1,-1,-1},{1,-1,-1},{1,1,-1},{-1,1,-1}};

float * planes[6][4] ={ {P[0],P[1],P[2],P[3]},
                        {P[1],P[5],P[6],P[2]},
                        {P[4],P[7],P[6],P[5]},
                        {P[0],P[3],P[7],P[4]},
                        {P[3],P[2],P[6],P[7]},
                        {P[0],P[4],P[5],P[1]}};
int i;
for(i=0;i<6;i++){
    float *normal; 
    normal = calcNormal(planes[i][0],planes[i][1],planes[i][2]);
    glBegin(GL_QUADS);
        glNormal3f(normal[0], normal[1], normal[2]);
        glVertex3f(planes[i][0][0],planes[i][0][1],planes[i][0][2]);
        glVertex3f(planes[i][1][0],planes[i][1][1],planes[i][1][2]);
        glVertex3f(planes[i][2][0],planes[i][2][1],planes[i][2][2]);
        glVertex3f(planes[i][3][0],planes[i][3][1],planes[i][3][2]);
    glEnd();
}
float   vec1[3] = {P2[0]-P1[0],P2[1]-P1[1],P2[2]-P1[2]};
float   vec2[3] = {P3[0]-P2[0],P3[1]-P2[1],P3[2]-P2[2]};
float  cross[3] = {vec1[1]*vec2[2]-vec2[1]*vec1[2],
                   vec1[2]*vec2[0]-vec2[2]*vec1[0],
                   vec1[0]*vec2[1]-vec2[0]*vec1[1]};
float modCross = sqrt(cross[0]*cross[0]+cross[1]*cross[1]+cross[2]*cross[2]);
cross[0]/=modCross;
cross[1]/=modCross;
cross[2]/=modCross;

return cross;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat x = GLfloat(width) / height;
glFrustum(-x, +x, -1.0, +1.0, 4.0, 15.0);
glMatrixMode(GL_MODELVIEW);
--------------油漆工------------------

angle=0.0;
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
GLfloat LightDiffuse[]=     { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]=    { 0.0f, 1.5f,1.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT0, GL_POSITION,LightPosition);
glEnable (GL_LIGHT0);
float P[8][3]={ {-1,-1, 1},{1,-1, 1},{1,1, 1},{-1,1, 1},
                {-1,-1,-1},{1,-1,-1},{1,1,-1},{-1,1,-1}};

float * planes[6][4] ={ {P[0],P[1],P[2],P[3]},
                        {P[1],P[5],P[6],P[2]},
                        {P[4],P[7],P[6],P[5]},
                        {P[0],P[3],P[7],P[4]},
                        {P[3],P[2],P[6],P[7]},
                        {P[0],P[4],P[5],P[1]}};
int i;
for(i=0;i<6;i++){
    float *normal; 
    normal = calcNormal(planes[i][0],planes[i][1],planes[i][2]);
    glBegin(GL_QUADS);
        glNormal3f(normal[0], normal[1], normal[2]);
        glVertex3f(planes[i][0][0],planes[i][0][1],planes[i][0][2]);
        glVertex3f(planes[i][1][0],planes[i][1][1],planes[i][1][2]);
        glVertex3f(planes[i][2][0],planes[i][2][1],planes[i][2][2]);
        glVertex3f(planes[i][3][0],planes[i][3][1],planes[i][3][2]);
    glEnd();
}
float   vec1[3] = {P2[0]-P1[0],P2[1]-P1[1],P2[2]-P1[2]};
float   vec2[3] = {P3[0]-P2[0],P3[1]-P2[1],P3[2]-P2[2]};
float  cross[3] = {vec1[1]*vec2[2]-vec2[1]*vec1[2],
                   vec1[2]*vec2[0]-vec2[2]*vec1[0],
                   vec1[0]*vec2[1]-vec2[0]*vec1[1]};
float modCross = sqrt(cross[0]*cross[0]+cross[1]*cross[1]+cross[2]*cross[2]);
cross[0]/=modCross;
cross[1]/=modCross;
cross[2]/=modCross;

return cross;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat x = GLfloat(width) / height;
glFrustum(-x, +x, -1.0, +1.0, 4.0, 15.0);
glMatrixMode(GL_MODELVIEW);
--------------void makeCube()-------------------

angle=0.0;
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
GLfloat LightDiffuse[]=     { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]=    { 0.0f, 1.5f,1.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT0, GL_POSITION,LightPosition);
glEnable (GL_LIGHT0);
float P[8][3]={ {-1,-1, 1},{1,-1, 1},{1,1, 1},{-1,1, 1},
                {-1,-1,-1},{1,-1,-1},{1,1,-1},{-1,1,-1}};

float * planes[6][4] ={ {P[0],P[1],P[2],P[3]},
                        {P[1],P[5],P[6],P[2]},
                        {P[4],P[7],P[6],P[5]},
                        {P[0],P[3],P[7],P[4]},
                        {P[3],P[2],P[6],P[7]},
                        {P[0],P[4],P[5],P[1]}};
int i;
for(i=0;i<6;i++){
    float *normal; 
    normal = calcNormal(planes[i][0],planes[i][1],planes[i][2]);
    glBegin(GL_QUADS);
        glNormal3f(normal[0], normal[1], normal[2]);
        glVertex3f(planes[i][0][0],planes[i][0][1],planes[i][0][2]);
        glVertex3f(planes[i][1][0],planes[i][1][1],planes[i][1][2]);
        glVertex3f(planes[i][2][0],planes[i][2][1],planes[i][2][2]);
        glVertex3f(planes[i][3][0],planes[i][3][1],planes[i][3][2]);
    glEnd();
}
float   vec1[3] = {P2[0]-P1[0],P2[1]-P1[1],P2[2]-P1[2]};
float   vec2[3] = {P3[0]-P2[0],P3[1]-P2[1],P3[2]-P2[2]};
float  cross[3] = {vec1[1]*vec2[2]-vec2[1]*vec1[2],
                   vec1[2]*vec2[0]-vec2[2]*vec1[0],
                   vec1[0]*vec2[1]-vec2[0]*vec1[1]};
float modCross = sqrt(cross[0]*cross[0]+cross[1]*cross[1]+cross[2]*cross[2]);
cross[0]/=modCross;
cross[1]/=modCross;
cross[2]/=modCross;

return cross;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat x = GLfloat(width) / height;
glFrustum(-x, +x, -1.0, +1.0, 4.0, 15.0);
glMatrixMode(GL_MODELVIEW);
-------------重定尺寸--------------------------

angle=0.0;
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
GLfloat LightDiffuse[]=     { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]=    { 0.0f, 1.5f,1.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT0, GL_POSITION,LightPosition);
glEnable (GL_LIGHT0);
float P[8][3]={ {-1,-1, 1},{1,-1, 1},{1,1, 1},{-1,1, 1},
                {-1,-1,-1},{1,-1,-1},{1,1,-1},{-1,1,-1}};

float * planes[6][4] ={ {P[0],P[1],P[2],P[3]},
                        {P[1],P[5],P[6],P[2]},
                        {P[4],P[7],P[6],P[5]},
                        {P[0],P[3],P[7],P[4]},
                        {P[3],P[2],P[6],P[7]},
                        {P[0],P[4],P[5],P[1]}};
int i;
for(i=0;i<6;i++){
    float *normal; 
    normal = calcNormal(planes[i][0],planes[i][1],planes[i][2]);
    glBegin(GL_QUADS);
        glNormal3f(normal[0], normal[1], normal[2]);
        glVertex3f(planes[i][0][0],planes[i][0][1],planes[i][0][2]);
        glVertex3f(planes[i][1][0],planes[i][1][1],planes[i][1][2]);
        glVertex3f(planes[i][2][0],planes[i][2][1],planes[i][2][2]);
        glVertex3f(planes[i][3][0],planes[i][3][1],planes[i][3][2]);
    glEnd();
}
float   vec1[3] = {P2[0]-P1[0],P2[1]-P1[1],P2[2]-P1[2]};
float   vec2[3] = {P3[0]-P2[0],P3[1]-P2[1],P3[2]-P2[2]};
float  cross[3] = {vec1[1]*vec2[2]-vec2[1]*vec1[2],
                   vec1[2]*vec2[0]-vec2[2]*vec1[0],
                   vec1[0]*vec2[1]-vec2[0]*vec1[1]};
float modCross = sqrt(cross[0]*cross[0]+cross[1]*cross[1]+cross[2]*cross[2]);
cross[0]/=modCross;
cross[1]/=modCross;
cross[2]/=modCross;

return cross;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat x = GLfloat(width) / height;
glFrustum(-x, +x, -1.0, +1.0, 4.0, 15.0);
glMatrixMode(GL_MODELVIEW);

看起来您正在改变paintGL部分中灯光的位置

查看旧代码,我在代码目录中找到了一个应用程序,它可以加载和旋转.OBJ网格,同时允许移动灯光

我认为解决方案是设置每个帧的灯光位置。(不记得我接触这个项目已经超过18个月了)


我解决了用顶点数组而不是直接模式绘制立方体的问题,似乎旋转或灯光对对象的影响在每种方法中都是不同的,这很奇怪