亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? main.cpp

?? openGL的3D的小球碰撞游戲
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
    //2. A x + B y + C z + D = 0
    //1.->2. A (x1 + u (x2 - x1)) + B (y1 + u (y2 - y1)) + C (z1 + u (z2 - z1)) + D = 0
    //
    //                   (a*p1[0] + b*p1[1] + c*p1[2] + d)
    // u =     ___________________________________________________________
    //          a*(p1[0] - p2[0]) + b*(p1[1] - p2[1]) + c*(p1[2] - p2[2])
    /*
       p1    |    p2
       +---->|----+
         u   |
             | plane defined using origin po and normal pn
    */
    
   
}

//return length of the vector defined by point p1 and p2
float vectorLength(float* p1, float* p2)
{
    float x = p1[0] - p2[0];
    float y = p1[1] - p2[1];
    float z = p1[2] - p2[2];

    return sqrtf(x*x + y*y + z*z);
}

//move ball based on current movement vector
//do collision detection when necessary
//do collison dectection for paddle
void moveBall_paddle()
{
	int i ;

    //check missing hit between g_ballPosition and g_lastBallPosition
   for(i = 0; i<1;  i++)
    {
        float u = pointPlaneIntersection(g_lastBallPosition, g_ballPosition, g_wallCenter[i], g_wallNormal[i]);
        if (u < 0.0f || u > 1.0f)//what happens when u < 0.0 or > 1.0? see comments in pointPlaneIntersection()
            continue;

        if (g_speedControl)
            g_step = g_lastStep;

        u = (1.0f - u)*g_step;

        //get intersection point
        float intersect[3];
        for (int j = 0; j < 3; j++)
            intersect[j] = g_lastBallPosition[j] + u*g_ballVector[j];

		//if missing hit paddle 
		if (  intersect[0] <= (g_wallCenter[0][0] + g_wallHalfThickness - g_wallSize[0][0])
		    || intersect[0] >= (g_wallCenter[0][0] + g_wallSize[0][0] -g_wallHalfThickness)
			|| intersect[1] >= (g_wallCenter[0][1] + g_wallSize[0][0] -g_wallHalfThickness)
			|| intersect[1] <= (g_wallCenter[0][1] + g_wallHalfThickness - g_wallSize[0][1]) )
		{
			g_misses ++ ;
            g_currentGame = -1;
            continue;
		}

		else
		{
			//get reflection vector
			float reflect[3];
			reflection(g_ballVector, g_wallNormal[i], reflect);

			for (int j = 0; j < 3; j++)
			{
				g_lastBallPosition[j] = intersect[j];
				g_ballPosition[j] = intersect[j] + u*reflect[j];
				g_ballVector[j] = reflect[j];
			}
	        
			//remember which wall we just hit
			g_wallHit = i;

			if (g_speedControl)
			{
				g_step += g_reflect;
				g_step = g_step > g_maxStep ? g_maxStep : g_step;
			}
		}
        return;
    }

    //no missing hit, predict next step and do collision detection
    float newPosition[3];
    for (int i = 0; i < 3; i++)//predict next ball position
        newPosition[i] = g_ballPosition[i] + g_step*g_ballVector[i];

  for(int i = 0; i<1; i++)
    {
        float u = pointPlaneIntersection(g_ballPosition, newPosition, g_wallCenter[i], g_wallNormal[i]);
        if (u < 0.0f || u > 1.0f)
            continue;

        u = (1.0f - u)*g_step;

        float intersect[3];
        for (int j = 0; j < 3; j++)//intersection point
            intersect[j] = g_ballPosition[j] + u*g_ballVector[j];
       
        if (  intersect[0] <= (g_wallCenter[0][0] + g_wallHalfThickness - g_wallSize[0][0])
		    || intersect[0] >= (g_wallCenter[0][0] + g_wallSize[0][0] -g_wallHalfThickness)
			|| intersect[1] >= (g_wallCenter[0][1] + g_wallSize[0][0] -g_wallHalfThickness)
			|| intersect[1] <= (g_wallCenter[0][1] + g_wallHalfThickness - g_wallSize[0][1]) )
		{
			g_misses ++ ;
			g_currentGame = -1;
            continue;
		}
		else
		{   
			float reflect[3];//reflection vector
			reflection(g_ballVector, g_wallNormal[i], reflect);

			for (int j = 0; j < 3; j++)//update ball position
			{
				g_lastBallPosition[j] = g_ballPosition[j];
				g_ballPosition[j] = intersect[j] + u*reflect[j];
				g_ballVector[j] = reflect[j];
			}

			g_wallHit = i;

			if (g_speedControl)
			{
				//increase ball speed
				g_lastStep = g_step;
				g_step += g_reflect;
				g_step = g_step > g_maxStep ? g_maxStep : g_step;
			}
	   }
        return;
    }

    //no hit at all, move ball forward and wait for next frame
    for (int i = 0; i < 3; i++)
    {
        g_lastBallPosition[i] = g_ballPosition[i];
        g_ballPosition[i] = newPosition[i];
    }

    if (g_speedControl)
    {
        //reduce ball speed
        g_lastStep = g_step;
        if (g_step > g_minStep)
            g_step *= g_damper;
    }
}

// ball hitting walls
void moveBall()
{
	switch(g_currentGame){
		case 0 :
			break;
		case 1: //ball is in the court, do collision detection
			{
				// ball hitting on paddle
				moveBall_paddle(); 
				//ball hitting on walls
			for (int i = 1; i < 6; i++)
			{
				float u = pointPlaneIntersection(g_lastBallPosition, g_ballPosition, g_wallCenter[i], g_wallNormal[i]);
				if (u < 0.0f || u > 1.0f)//what happens when u < 0.0 or > 1.0? see comments in pointPlaneIntersection()
					continue;

				if (g_speedControl)
					g_step = g_lastStep;

				u = (1.0f - u)*g_step;

				//get intersection point
				float intersect[3];
				for (int j = 0; j < 3; j++)
					intersect[j] = g_lastBallPosition[j] + u*g_ballVector[j];

				//get reflection vector
				float reflect[3];
				reflection(g_ballVector, g_wallNormal[i], reflect);

				for (int j = 0; j < 3; j++)
				{
					g_lastBallPosition[j] = intersect[j];
					g_ballPosition[j] = intersect[j] + u*reflect[j];
					g_ballVector[j] = reflect[j];
				}

				//remember which wall we just hit
				g_wallHit = i;

				if (g_speedControl)
				{
					g_step += g_reflect;
					g_step = g_step > g_maxStep ? g_maxStep : g_step;
				}
				return;
			}

			//no missing hit, predict next step and do collision detection
			float newPosition[3];
			for (int i = 0; i < 3; i++)//predict next ball position
				newPosition[i] = g_ballPosition[i] + g_step*g_ballVector[i];

			for (int i = 1; i < 6; i++)
			{
				float u = pointPlaneIntersection(g_ballPosition, newPosition, g_wallCenter[i], g_wallNormal[i]);
				if (u < 0.0f || u > 1.0f)
					continue;

				u = (1.0f - u)*g_step;

				float intersect[3];
				for (int j = 0; j < 3; j++)//intersection point
					intersect[j] = g_ballPosition[j] + u*g_ballVector[j];

				float reflect[3];//reflection vector
				reflection(g_ballVector, g_wallNormal[i], reflect);

				for (int j = 0; j < 3; j++)//update ball position
				{
					g_lastBallPosition[j] = g_ballPosition[j];
					g_ballPosition[j] = intersect[j] + u*reflect[j];
					g_ballVector[j] = reflect[j];
				}

				g_wallHit = i;

				if (g_speedControl)
				{
					//increase ball speed
					g_lastStep = g_step;

					g_step += g_reflect;
					g_step = g_step > g_maxStep ? g_maxStep : g_step;
				}
				return;
			}

			//no hit at all, move ball forward and wait for next frame
			for (int i = 0; i < 3; i++)
			{
				g_lastBallPosition[i] = g_ballPosition[i];
				g_ballPosition[i] = newPosition[i];
			}

			if (g_speedControl)
			{
				//reduce ball speed
				g_lastStep = g_step;
				if (g_step > g_minStep)
					g_step *= g_damper;
			}
	}
			break;
			//ball is out of court
		case -1:
			{
					if (g_misses <= threshold)
					{
						//no missing hit, predict next step and do collision detection
						float newPosition[3];
						for (int i = 0; i < 3; i++)//predict next ball position
							newPosition[i] = g_ballPosition[i] + g_step*g_ballVector[i];
						//no hit at all, move ball forward and wait for next frame
						for (int i = 0; i < 3; i++)
						{
							g_lastBallPosition[i] = g_ballPosition[i];
							g_ballPosition[i] = newPosition[i];
						}

						if (g_ballPosition[2] > 60.0f)
						{
							g_ballPosition[0] = 0.0f;
							g_ballPosition[1] = 50.0f; 
							g_ballPosition[2] = 0.0f;

							g_lastBallPosition[0] =0.0f;
							g_lastBallPosition[1] =50.0f; 
							g_lastBallPosition[2] =0.0f; 
							
							g_ballVector[0] = 1.0;
							g_ballVector[1] = 0.8;
							g_ballVector[2] = -0.9;

							g_step = 0.06f;
							g_lastStep = 0.06f;
							g_speedControl = false;
							g_currentGame = 0;
						}

						if (g_speedControl)
						{
							//reduce ball speed
							g_lastStep = g_step;
							if (g_step > g_minStep)
								g_step *= g_damper;
						}
					  glColor3f(0.0, 1.0, 1.0f);
					  drawString("Press: 's' to start", -20, 80);
					  drawString(" you have losed one time", -50, 70);
	             }
			else
			{
				//no missing hit, predict next step and do collision detection
				float newPosition[3];
				for (int i = 0; i < 3; i++)//predict next ball position
					newPosition[i] = g_ballPosition[i] + g_step*g_ballVector[i];
				//no hit at all, move ball forward and wait for next frame
				for (int i = 0; i < 3; i++)
				{
					g_lastBallPosition[i] = g_ballPosition[i];
					g_ballPosition[i] = newPosition[i];
				}

				if (g_speedControl)
				{
					//reduce ball speed
					g_lastStep = g_step;
					if (g_step > g_minStep)
						g_step *= g_damper;
				}

		    	}
			}
			break;
        }
        
		for (int i = 0; i < 3; i++)
	{
		position0[i] = g_ballPosition[i];
		spotDirection[i] = g_ballPosition[i] - position2[i];
	}

	}

//draw wire sphere at current position and angle
void drawBall()
{
    glMatrixMode(GL_MODELVIEW);
     glDepthMask(GL_TRUE);
	glDisable(GL_BLEND);
    glPushMatrix();
    glTranslatef(g_ballPosition[0], g_ballPosition[1], g_ballPosition[2]);
    
    glRotatef(g_frameCount, 1.0f, 0.0f, 0.0f);
	 glTexCoord2f(0.0f, 0.0f);
    glutSolidSphere(5.0f, 150.0f, 150.0f);

    glPopMatrix();
}




void loadModel(char* pFileName)
{
 
    FILE* pFile = NULL;
    fopen_s(&pFile, pFileName, "r");

    int numVertex = 264, numPolygon;
    char line[1024];

    fgets(line, 1023, pFile);

    char seps[] = " \t";
    char *token, *next_token;

    token = strtok_s(line, seps, &next_token);
    token = strtok_s(NULL, seps, &next_token);
    numVertex = atoi(token);
    token = strtok_s(NULL, seps, &next_token);
    numPolygon = atoi(token);

    //alloc memory for vertices
    float* pVertexBuffer = (float*)malloc(sizeof(float)*numVertex*3);

    for (int i = 0; i < numVertex; i++)
    {
        fgets(line, 1023, pFile);
        token = strtok_s(line, seps, &next_token);
        pVertexBuffer[i*3] = (float)atof(token);
        token = strtok_s(NULL, seps, &next_token);
        pVertexBuffer[i*3+1] = (float)atof(token);
        token = strtok_s(NULL, seps, &next_token);
        pVertexBuffer[i*3+2] = (float)atof(token);
    }

       g_displayList = glGenLists(1);
    glNewList(g_displayList, GL_COMPILE);

    //glColor3fv(g_blue);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

    int index;

    for (int i = 0; i < numPolygon; i++)
    {
        fgets(line, 1023, pFile);        
        
        token = strtok_s(line, seps, &next_token);
        numVertex = atoi(token);
        //glMaterialfv(GL_FRONT, GL_EMISSION, emission);
        glBegin(GL_POLYGON);
        for (int j = 0; j < numVertex; j++)
        {
            token = strtok_s(NULL, seps, &next_token);
            index = atoi(token) - 1;

            glVertex3f(pVertexBuffer[index*3], pVertexBuffer[index*3+1], pVertexBuffer[index*3+2]);
        }
        glEnd();

    }

    glEndList();
    
    free(pVertexBuffer);
    fclose(pFile);
}

void LightMapTable()
{
    float size = 80.0f;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
轻轻草成人在线| 日韩一区二区三区免费看 | 欧美一区二区三区视频免费| 精品欧美乱码久久久久久1区2区| 国产精品久久久久久亚洲毛片| 蜜桃视频在线一区| 色综合咪咪久久| 国产人妖乱国产精品人妖| 日韩激情视频在线观看| 91女神在线视频| 日本一区二区在线不卡| 美脚の诱脚舐め脚责91 | 日韩午夜小视频| 一区二区久久久久| 丁香一区二区三区| 精品88久久久久88久久久| 视频一区二区三区在线| 欧美亚洲一区二区在线| 自拍偷拍国产精品| 国产精品99久| 久久亚洲精华国产精华液| 美女性感视频久久| 日韩精品中文字幕在线不卡尤物| 亚洲一区二区综合| 在线视频欧美精品| 亚洲精品久久久久久国产精华液| 成人av手机在线观看| 国产精品美女久久久久久 | 国产欧美日韩综合精品一区二区 | 日韩丝袜情趣美女图片| 日韩精品色哟哟| 欧美日韩不卡一区二区| 天天色 色综合| 欧美片在线播放| 日韩电影一区二区三区四区| 欧美高清一级片在线| 亚洲大片精品永久免费| 欧美精品色综合| 另类小说一区二区三区| 精品国产乱码久久久久久蜜臀| 麻豆国产精品777777在线| 欧美大片拔萝卜| 国产一区二区91| 国产精品夫妻自拍| 色综合天天天天做夜夜夜夜做| 亚洲女同女同女同女同女同69| 色婷婷香蕉在线一区二区| 亚洲午夜在线观看视频在线| 日韩一级二级三级精品视频| 国产在线精品一区二区三区不卡| 久久久久久久久免费| 99久久婷婷国产综合精品| 亚洲欧美国产毛片在线| 3d动漫精品啪啪| 国产一区二区按摩在线观看| 最新日韩av在线| 欧美日韩的一区二区| 国产自产高清不卡| 亚洲卡通动漫在线| 日韩欧美一级二级三级久久久| 国产一区二区福利| 一区二区高清在线| 久久免费偷拍视频| 在线免费一区三区| 国精产品一区一区三区mba视频| 亚洲国产精品成人综合| 欧美午夜精品一区二区蜜桃| 久久99精品久久久久久国产越南| 日韩一区有码在线| 51久久夜色精品国产麻豆| 成人黄动漫网站免费app| 亚洲国产精品久久艾草纯爱| 久久蜜臀中文字幕| 欧洲精品在线观看| 国产精品一二二区| 爽爽淫人综合网网站| 国产精品午夜久久| 欧美成人一级视频| 欧洲av一区二区嗯嗯嗯啊| 国产原创一区二区三区| 性久久久久久久| 国产精品国模大尺度视频| 日韩欧美另类在线| 欧美日韩国产免费| 91亚洲资源网| 国产aⅴ综合色| 久久精品99久久久| 性久久久久久久| 综合分类小说区另类春色亚洲小说欧美 | 欧美伦理影视网| 成人黄色大片在线观看| 狠狠色狠狠色综合| 男女男精品视频网| 亚洲狠狠丁香婷婷综合久久久| 久久蜜桃av一区二区天堂| 国产一区二区三区免费看| 视频一区视频二区中文| 一区二区三区欧美日| 中文字幕亚洲不卡| 欧美激情综合在线| 久久免费视频色| 久久婷婷久久一区二区三区| 日韩精品一区国产麻豆| 正在播放一区二区| 欧美日本精品一区二区三区| 欧美中文字幕一二三区视频| 一本久久a久久免费精品不卡| 粉嫩av一区二区三区| 国产不卡视频一区| 国产传媒一区在线| 国产不卡视频在线观看| 国产成人精品免费| 国产精品小仙女| 国产成人精品三级| 丁香另类激情小说| 盗摄精品av一区二区三区| 国产精品 欧美精品| 国产高清在线精品| 国产69精品一区二区亚洲孕妇| 国产成人免费在线视频| 国产大陆a不卡| 99久久精品99国产精品| 色哟哟一区二区| 欧美日韩国产另类一区| 日韩欧美中文字幕公布| 亚洲精品一区二区三区精华液| 精品少妇一区二区| 国产女主播一区| 亚洲欧美激情小说另类| 亚洲成a天堂v人片| 久久精品国产秦先生| 激情综合色播五月| 丁香五精品蜜臀久久久久99网站 | 欧美三区在线视频| 欧美精品一卡两卡| 久久看人人爽人人| 中文字幕亚洲不卡| 午夜激情一区二区| 国产盗摄精品一区二区三区在线| 91亚洲国产成人精品一区二三| 在线观看区一区二| 欧美tickle裸体挠脚心vk| 国产免费观看久久| 亚洲一区二区三区四区五区中文| 日本午夜一本久久久综合| 国产一区二区福利视频| 色婷婷av一区二区| 精品久久久久久久久久久久久久久 | 一区二区三区在线影院| 日韩经典中文字幕一区| 国产精一品亚洲二区在线视频| 一本久久a久久精品亚洲 | 色88888久久久久久影院按摩| 在线电影一区二区三区| 国产亲近乱来精品视频| 亚洲电影一级片| 大胆欧美人体老妇| 欧美精品色一区二区三区| 国产精品色哟哟网站| 午夜欧美2019年伦理| 99re亚洲国产精品| 精品国一区二区三区| 一区二区高清视频在线观看| 国产一区二区三区日韩| 欧美美女黄视频| 亚洲男人天堂av网| 国产一区二区三区精品视频| 欧美日韩成人高清| 亚洲精品中文在线影院| 国产成人av电影在线| 欧美精品久久久久久久多人混战| 中文字幕在线观看一区| 精品综合免费视频观看| 欧美日韩一区三区四区| 亚洲精品国产无套在线观| 国产久卡久卡久卡久卡视频精品| 欧美日韩国产免费一区二区| 亚洲乱码日产精品bd| 国产成人精品www牛牛影视| 精品国产三级电影在线观看| 亚洲高清免费在线| 91福利视频在线| 亚洲欧美电影一区二区| 91亚洲男人天堂| 综合激情成人伊人| 97精品久久久午夜一区二区三区| 久久久精品2019中文字幕之3| 理论电影国产精品| 欧美一区二区三区四区五区 | 欧美日韩国产美女| 亚洲午夜av在线| 欧美做爰猛烈大尺度电影无法无天| 国产精品久久久久7777按摩| 丁香激情综合五月| 国产精品久久久久久久久免费相片 | 国产日韩欧美a| 国产69精品久久777的优势| 欧美国产精品劲爆| av电影在线观看一区| 亚洲精品日韩专区silk|