来源:互联网 发布:淘宝开店需要多少钱 编辑:程序博客网 时间:2024/04/19 03:19

---------西昌.何雨锋 水

给我水,于是就有了水哈

//来点水,水是从陆地上衍生出来的
land1->SetWaterTexture(global1->GetTex("water1"));
land1->SetWaterEffect(tvtrue,0.5,tvfalse,(enum TrueVision3D::CONST_D3DBLEND) D3DBLEND_SRCALPHA,(enum TrueVision3D::CONST_D3DBLEND) D3DBLEND_INVSRCALPHA,tvfalse,0);
land1->SetWaterAltitude(30);   //水位
land1->SetWaterTextureScale(32);  //纹理放缩
land1->SetWaterEnable(tvtrue);
//这样似乎就有水了吗?错,还得在render将参数调为true
land1->Render(tvtrue,tvtrue);才能渲染出水来
//但是如果要想在水下变得模糊,就得在渲染主循环中判断是否镜头在水下,则大气增加雾。
if(ypos<30&&ypos>=0)
{
 atmos1->Fog_SetColor(0,0.4,0.5,1);
         atmos1->Fog_SetParameters(0,60,0.01);
         atmos1->Fog_SetType(TV_FOG_EXP,TV_FOGTYPE_RANGE);
         atmos1->Fog_Enable(tvtrue);
}
        else
        atmos1->Fog_Enable(tvfalse);


----------------我,但是上面那种根据陆地生成的水平静而无波,所以可以
用mesh变成一个大的曲面来做波涛。
ITVMesh water1;
water1->AddDynamicWater(-882.3169,-338.25,11.10005,64,tvtrue,tvtrue,tvtrue);
//addDynamicWater:变成动态水,参数为(水波起点的x,y,z,细节度,是否支持表面特效贴图,是否有涟漪,是否支持焦散线)
//细节度决定波涛是否有小的,涟漪决定波涛的
water1->ScaleMesh(14, -18, 14);   //mesh放大
water1->SetTexture(global1->GetTex("watersur"),-1);   //表面纹理

//在循环中记得制造点波涛并更新mesh
if((rand()%10)/10<0.2)
{
 water1->MakeWave(12.5433,7.4324,rand()%3);
}
        water1->UpdateWater(tvtrue);
//当然mesh要被render才看得见。
//这里MakeWave的用法是:如果在建立时的细节度是64,那么其前两个参数就该小于64,最后那个参数永远必须低于90。
上面那语句的含义是:在一个64大的湖面上的位置为12.5433,7.4324的位置上扔上颗石头,石头重为rand()%3。

//如果只需要一般的如丝绸般无反光的波涛,那么就只一般的纹理就够了,如果要
//更高程度的带反光的波光粼粼的波涛,那么就得用特效贴图,这贴图是在循环前就渲染好的。
         ITVRenderSurface sur1;
         sur1=scene1->CreateCubicEnvironmentMap(128);   //建立出一个128的表面
         PosX=100;
         PosY=1000;
         PosZ=500;
        
         sur1->StartEnvRender(TV_FACE_NEGATIVEX);
         sur1->SetEnvironmentCamera(TV_FACE_NEGATIVEX,&global1->Vector3(PosX,PosY,PosZ));
   atmos1->Skybox_Render();
         sur1->EndEnvRender();

         sur1->StartEnvRender(TV_FACE_POSITIVEX);
         sur1->SetEnvironmentCamera(TV_FACE_POSITIVEX,&global1->Vector3(PosX, PosY, PosZ));
   atmos1->Skybox_Render();
         sur1->EndEnvRender();
        
         sur1->StartEnvRender(TV_FACE_POSITIVEZ);
         sur1->SetEnvironmentCamera(TV_FACE_POSITIVEZ,&global1->Vector3(PosX, PosY, PosZ));
   atmos1->Skybox_Render();
         sur1->EndEnvRender();
        
         sur1->StartEnvRender(TV_FACE_NEGATIVEZ);
         sur1->SetEnvironmentCamera(TV_FACE_NEGATIVEZ,&global1->Vector3(PosX, PosY, PosZ));
   atmos1->Skybox_Render();
         sur1->EndEnvRender();
 
         sur1->StartEnvRender(TV_FACE_POSITIVEY);
         sur1->SetEnvironmentCamera(TV_FACE_POSITIVEY,&global1->Vector3(PosX, PosY, PosZ));
   atmos1->Skybox_Render();
         sur1->EndEnvRender();

         sur1->StartEnvRender(TV_FACE_NEGATIVEY);
         sur1->SetEnvironmentCamera(TV_FACE_NEGATIVEY,&global1->Vector3(PosX, PosY, PosZ));
   atmos1->Skybox_Render();
         sur1->EndEnvRender();
         water1->SetEnvironmentMap(tvtrue,sur1->GetTexture(),-1); 
//上面的作用是随便找个点,把周围的图象渲染下来放进sur1里面,
然后把sur1表面做为water1的表面贴图,这样看起来好象就印射了周围的环境。
很多人会问,为什么只找一点,连照相的方向都没给?
            为什么有那么多看起来一样的语句而不用循环语句?

其实仔细观察,就可以发现这里在同一点上照了六张象,分别对着六个方向,分别是
TV_FACE_NEGATIVEX,TV_FACE_POSITIVEX,TV_FACE_POSITIVEZ,TV_FACE_NEGATIVEZ,TV_FACE_POSITIVEY,TV_FACE_NEGATIVEY
那么为什么每个中间都加一句atmos1->Skybox_Render();
因为在执行这些语句时,还没有进入循环,所以天空四面都是黑色的,这种照下来的黑色图象混合到波涛里一点效果都没有,
所以得在渲染表面图的中间加上天空盒的渲染,这样逼真的水效果就出来了。

 

原创粉丝点击