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; }
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); }