Exemplo n.º 1
0
BOOL baiscobj::DisplayScene()//摄像漫游
{ float speed=0.5f;						//步长
  float x=g_eye[0],y=g_eye[1],z=g_eye[2];
  if (KEY_DOWN(VK_SHIFT))  speed   =speed*2;//按SHIFT时的加速true
  if (KEY_DOWN(VK_LEFT))   g_Angle-=speed*2;//左转,方位角-
  if (KEY_DOWN(VK_RIGHT))  g_Angle+=speed*2;//右转,方位角+
  rad_xz = float (3.13149* g_Angle/180.0f);	//计算左右旋转角度
  if (KEY_DOWN(33))		   g_elev +=speed;	//Page UP  键
  if (KEY_DOWN(34))		   g_elev -=speed;	//Page Down键
  if (g_elev<-360)		   g_elev  =-360;	//仰俯角
  if (g_elev> 360)		   g_elev  = 360;	//仰俯角
  if (KEY_DOWN(VK_UP))						//前进
  { g_eye[2]+=(float)sin(rad_xz)*speed;			//视点的x分量
    g_eye[0]+=(float)cos(rad_xz)*speed;			//视点的Z分量
  }
  if (KEY_DOWN(VK_DOWN))					//后退
  { g_eye[2]-=(float)sin(rad_xz)*speed;			//视点的x分量
    g_eye[0]-=(float)cos(rad_xz)*speed;			//视点的Z分量
  }
  
 //控制到摄像机不离开地面
  if(g_eye[0]<  MAP_SCALE)			g_eye[0]=  MAP_SCALE;
  if(g_eye[0]> (MAP_W-2)*MAP_SCALE)	g_eye[0]= (MAP_W-2)*MAP_SCALE;
  if(g_eye[2]<-(MAP_W-2)*MAP_SCALE)	g_eye[2]=-(MAP_W-2)*MAP_SCALE;
  if(g_eye[2]> -MAP_SCALE)			g_eye[2]= -MAP_SCALE;
  if (KEY_DOWN(VK_HOME))    gao += speed;
  if (KEY_DOWN(VK_END))     gao -= speed;
  g_eye[1] =GetHeight((float)g_eye[0],(float)g_eye[2])+gao;//设置摄像机对地位置高
  //摄像机的方向
  g_look[0] = (float)(g_eye[0] +100*cos(rad_xz));	//目标点X分量
  g_look[2] = (float)(g_eye[2] +100*sin(rad_xz));	//目标点Z分量
  g_look[1] = g_eye[1] +g_elev;				//目标点Y分量
  vector3_t viewdir(g_eye[0]-g_look[0], g_eye[1]-g_look[1], g_eye[2]-g_look[2]);
  viewdir.Normalize();
  //viewdir = -viewdir;
  vector3_t viewpos(g_eye[0], g_eye[1], g_eye[2]), targepos(g_look[0], g_look[1], g_look[2]);

  if (KEY_DOWN('A')) {
	 count--;
  }
  if (KEY_DOWN('Z')) {
	  count++;
  }
  viewpos = viewpos + viewdir*count;
  //建立modelview矩阵方向
  gluLookAt(viewpos.x, viewpos.y, viewpos.z,	//视点
			targepos.x, targepos.y, targepos.z,	//目标点
			0.0,1.0,0						//视点方向
		   );
  glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
  glGetDoublev(GL_PROJECTION_MATRIX, projection); 
  glGetIntegerv(GL_VIEWPORT, viewport);
  ////////////////////////////////////////////////////////////////
  int r0=abs((int)g_Angle);
  test.Format("[方位=%03d X=%3.0f y=%3.0f 高=%2.1f 俯仰角=%2.0f]",
		  r0%360,g_eye[0],-g_eye[2],g_eye[1],g_elev); 
  //r+=1.0f;if(r>360) r=0;
  return TRUE;
}
Exemplo n.º 2
0
void RenderLightShafts(const D3DXMATRIX& view, const D3DXMATRIX& proj, const D3DXVECTOR3& eye, const D3DXVECTOR4& lightpos)
{
	D3DXMATRIX	world;
	D3DXVECTOR3	viewdir(view._13, view._23, view._33);
	D3DXVECTOR3	lightdir;
	D3DXVECTOR4	lightss;
	D3DXVECTOR4	texelsize(1.0f / screenwidth, 1.0f / screenheight, 0, 1);

	D3DXVec3Normalize(&lightdir, (D3DXVECTOR3*)&lightpos);
	float exposure = min(max(D3DXVec3Dot(&viewdir, &lightdir), 0), 1);

	lightss.x = eye.x + lightpos.x;
	lightss.y = eye.y + lightpos.y;
	lightss.z = eye.z + lightpos.z;
	lightss.w = 1;

	D3DXVec4Transform(&lightss, &lightss, &view);
	D3DXVec4Transform(&lightss, &lightss, &proj);

	lightss.x = (1.0f + lightss.x / lightss.w) * 0.5f;
	lightss.y = (1.0f - lightss.y / lightss.w) * 0.5f;

	device->SetRenderTarget(0, occludersurf);
	device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x68686868, 1.0f, 0);

	D3DXMatrixScaling(&world, 6, 6, 6);
	world._42 = -2;

	device->SetTransform(D3DTS_WORLD, &world);
	device->SetTransform(D3DTS_VIEW, &view);
	device->SetTransform(D3DTS_PROJECTION, &proj);

	palm->DrawSubset(0, DXObject::Opaque);
	palm->DrawSubset(1, DXObject::Opaque);

	device->SetVertexDeclaration(quaddecl);
	device->SetRenderState(D3DRS_ZENABLE, FALSE);

	// first blur
	godray->SetTechnique("godray");
	godray->SetVector("lightPos", (D3DXVECTOR4*)&lightss);
	godray->SetFloat("exposure", exposure);

	device->SetRenderTarget(0, blursurf);

	godray->Begin(0, 0);
	godray->BeginPass(0);
	{
		device->SetTexture(0, occluders);
		device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, 6 * sizeof(float));
	}
	godray->EndPass();
	godray->End();

	// second blur
	godray->SetTechnique("blur");
	godray->SetVector("texelSize", &texelsize);
	godray->SetVector("lightPos", (D3DXVECTOR4*)&lightss);

	device->SetRenderTarget(0, occludersurf);

	godray->Begin(0, 0);
	godray->BeginPass(0);
	{
		device->SetTexture(0, blurtex);
		device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, 6 * sizeof(float));
	}
	godray->EndPass();
	godray->End();

	device->SetRenderState(D3DRS_ZENABLE, TRUE);
}