Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在opengl中绘制可穿透对象_C++_Opengl_Graphics_Glut - Fatal编程技术网

C++ 在opengl中绘制可穿透对象

C++ 在opengl中绘制可穿透对象,c++,opengl,graphics,glut,C++,Opengl,Graphics,Glut,如何使用opengl绘制可穿透的立方体 #include <GL/glut.h> // GLUT, include glu.h and gl.h double rotate_y; double rotate_x; double zoom; void solidSphere(double r) { glutSolidSphere(r, 50, 50); } float ALPHA = 0.6; float trans = 0.1; void display() {

如何使用opengl绘制可穿透的立方体

#include <GL/glut.h>  // GLUT, include glu.h and gl.h

double rotate_y; 
double rotate_x;
double zoom;

void solidSphere(double r)
{

    glutSolidSphere(r, 50, 50);
}

float ALPHA = 0.6;
float trans = 0.1;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);

    glDisable(GL_TEXTURE_2D);
    glLoadIdentity();
    glTranslatef(-2.2f, 0.31f, -7.0f);
    glScalef(1.0, 1.0, 1.0);
    glRotatef(rotate_x, 1.0, 0.0, 0.0 );
    glRotatef(rotate_y, 0.0, 1.0, 0.0 );
    glColor4f(1,0,0, ALPHA);
    glutSolidCube(2);

    glLoadIdentity();
    glTranslatef(2.2f - trans, 0.31f, -7.0f);
    glScalef(1.0, 1.0, 1.0);
    glColor3f(0,1,0);
    glutSolidCube(1);




    glutSwapBuffers();
}

// ----------------------------------------------------------
// specialKeys() Callback Function
// ----------------------------------------------------------
void specialKeys( int key, int x, int y ) {

    //  Right arrow - increase rotation by 5 degree
    if (key == GLUT_KEY_RIGHT)
    trans -= 0.1;

    //  Left arrow - decrease rotation by 5 degree
    else if (key == GLUT_KEY_LEFT)
    trans += 0.1;

    else if (key == GLUT_KEY_UP)
    rotate_x += 5;

    else if (key == GLUT_KEY_DOWN)
    rotate_x -= 5;

    else if (key == GLUT_KEY_INSERT)
        zoom *= (1.0 + 0.01);
    else if (key == GLUT_KEY_END)
        zoom *= (1.0 - 0.01);

    //  Request display update
    glutPostRedisplay();

}

void reshape(GLsizei width, GLsizei height) 
{
    if (height == 0)
    {
        height = 1;
    }

    GLfloat aspect = (GLfloat)width / (GLfloat)height; 
    glViewport(0, 0, width, height);    
    glOrtho(0.0, width, 0.0, height, 0, 50000);    
    glMatrixMode(GL_PROJECTION);    
    glLoadIdentity();
    gluPerspective(90.0f, aspect, 0.1f, 100.0f);
}

void initGL() 
{
    GLfloat sun_direction[] = { 0.0, 2.0, -1.0, 1.0 };
    GLfloat sun_intensity[] = { 0.7, 0.7, 0.7, 1.0 };
    GLfloat ambient_intensity[] = { 0.3, 0.3, 0.3, 1.0 };

    glClearColor(0.1, 0.39, 0.88, 1.0);
    glColor3f(1.0, 1.0, 1.0);

    glEnable (GL_BLEND); 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient_intensity);

    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, sun_direction);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_intensity);

    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective(90.0f, 2.0, 0.1f, 100.0f);

}

int main(int argc, char** argv) 
{
    rotate_y = 0; 
    rotate_x = 0;
    zoom = 1.0;

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGB | GLUT_DEPTH);    
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(50, 50);
    glutCreateWindow("cube and sphere");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutSpecialFunc(specialKeys);
    initGL();
    glutMainLoop();
    return 0;
}
#include//GLUT,include glu.h和gl.h
双旋转;
双旋转;
双变焦;
空心实心球体(双r)
{
固体球(r,50,50);
}
浮动α=0.6;
浮动变速器=0.1;
无效显示()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GLU模型视图);
glDisable(GL_纹理_2D);
glLoadIdentity();
GLTRANSTEF(-2.2f,0.31f,-7.0f);
glScalef(1.0,1.0,1.0);
glRotatef(rotate_x,1.0,0.0,0.0);
glRotatef(rotate_y,0.0,1.0,0.0);
GL4F(1,0,0,α);
立体立方体(2);
glLoadIdentity();
GLTRANSTEF(2.2f-反式,0.31f,-7.0f);
glScalef(1.0,1.0,1.0);
gl3f(0,1,0);
立体立方体(1);
glutSwapBuffers();
}
// ----------------------------------------------------------
//specialKeys()回调函数
// ----------------------------------------------------------
无效特殊键(整数键、整数x、整数y){
//右箭头-增加旋转5度
if(key==GLUT\u key\u RIGHT)
反式-=0.1;
//左箭头-减少旋转5度
else if(key==GLUT\u key\u LEFT)
trans+=0.1;
else if(key==GLUT\u key\u UP)
旋转_x+=5;
else if(key==GLUT\u key\u DOWN)
旋转_x-=5;
else if(键==GLUT\U键\U插入)
缩放*=(1.0+0.01);
else if(key==GLUT\u key\u END)
缩放*=(1.0-0.01);
//请求显示更新
再发现();
}
空洞重塑(GLsizei宽度、GLsizei高度)
{
如果(高度==0)
{
高度=1;
}
GLfloat纵横比=(GLfloat)宽度/(GLfloat)高度;
glViewport(0,0,宽度,高度);
格洛托(0.0,宽度,0.0,高度,0,50000);
glMatrixMode(GL_投影);
glLoadIdentity();
透视图(90.0f,纵横比,0.1f,100.0f);
}
void initGL()
{
GLfloat sun_方向[]={0.0,2.0,-1.0,1.0};
GLfloat sun_强度[]={0.7,0.7,0.7,1.0};
GLU环境强度[]={0.3,0.3,0.3,1.0};
glClearColor(0.1,0.39,0.88,1.0);
GL3F(1.0,1.0,1.0);
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
glClearDepth(1.0f);
glEnable(GLU深度试验);
glDepthFunc(GL_LEQUAL);
glShadeModel(GL_平滑);
glEnable(德国劳埃德大学照明);
glLightModelfv(GL_灯光_模型_环境、环境强度);
glEnable(GL_LIGHT0);
glLightfv(GLU灯0、GLU位置、太阳方向);
glLightfv(GL_LIGHT0、GL_漫反射、太阳光强度);
glEnable(GL_颜色_材料);
GLCOLOR材质(GL_前部、GL_环境_和_漫反射);
glHint(GL\u透视图\u校正\u提示,GL\u最佳);
glMatrixMode(GL_投影);
glLoadIdentity();
(90.0f、2.0、0.1f、100.0f);
}
int main(int argc,字符**argv)
{
旋转y=0;
旋转_x=0;
缩放=1.0;
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_双精度| GLUT_RGB | GLUT_深度);
GLUTINITWindowsSize(640480);
位置(50,50);
创建窗口(“立方体和球体”);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutSpecialFunc(specialKeys);
initGL();
glutMainLoop();
返回0;
}
这段代码将绘制两个立方体,一个部分透明,一个完全不透明 按左右箭头键可以移动绿色立方体。 我需要的是,当绿色立方体进入红色立方体(透明)的立方体内部的一部分也是可见的


可行吗?

使用alpha值来提高透明度,使对象可穿透并不是OpenGL真正需要的东西,通过计算碰撞检测,您需要处理使对象可穿透的问题。@Vallentin谢谢您能提供一些alpha值的代码吗?可能重复@RogerRowland我已经重申了我的问题交换您的draw调用。透明对象应在不透明对象之后绘制。